2013-04-17 3 views
0

어떤 학교를 선택했는지에 따라 모듈에서 모든 "코스 이름"을 가져야한다는 코드가 있습니다.1 열의 모든 데이터를 선택하십시오.

예를 들어 생물학 학교는 "생화학"과 "해양 생물학"이라는 모듈을 가지고 있습니다. 계산에 사용하려면이 두 가지를 모두 선택해야합니다.

현재 코드가 실행될 때 첫 번째 모듈 즉 "생화학"만 사용되지만 모든 모듈을 선택해야합니다.

아무도 도와 줄 수 있습니까?

Dim courseSelectCom As New SqlCommand("SELECT course_name FROM course where school= '%"schoolSelect & "' ", _ 
           connection) 

답변

0

명령 실행에 무엇을 사용하고 있습니까? ExecuteScalar를 사용하면 첫 번째 결과 만 나타납니다. ExecuteReader를 사용하여 Read through 또는 DataAdapter 사용하고 DataSet을 채 웁니다.

+0

희미한 courseNumbers을 courseNumbers =에서는 CType (courseSelectCom.ExecuteScalar(), 문자열) – d99

+0

네 executeScalar를 사용하고 있는데 어떻게 독자에게 변경합니까? – d99

+0

이것은 첫 번째 가치만을 제공합니다. 모든 값에 대해 ExecuteReader를 사용하거나 DataAdapter를 사용하여 DataSet을 채워야합니다. –

0
Dim courseSelectCom As New SqlCommand("SELECT course_name FROM course where [email protected]", _connection) 

courseSelectCom.Parameter.Add("@School", SqlDbType.VarChar).Value = SchoolSelect.Text 

SchoolSelect 당신이 매개 변수화 쿼리를 사용하는 것입니다 학교

1

귀하의 질의에 먼저 할 일은을 선택있는 텍스트 상자입니다.
이렇게하면 Sql Injection 및 구문 분석 문제가 발생하지 않습니다.

그런 다음 왜 SchoolSelect 앞에 와일드 카드 %을 사용하는지 설명합니다.
같은 접미사로 끝나는 많은 종류의 학교가 있으며 이들 모두를 검색하고 싶습니까?

마지막으로 DataReader를 사용하여 반환 된 데이터를 반복하거나 DataAdapter를 사용하여 DataTable을 채워야합니다. 그래서 요약

당신이 다음

Dim dt = New DataTable() 
    Dim da = New SqlDataAdapter(courseSelectCom) 
    da.Fill(dt) 

와 DataReader를 루프로 교체 DataTable에있는 데이터를 저장할 그리고 당신이 DataGridView에 바인딩에 사용할 DataTable 개체가있는 경우

Dim sb = new StringBuilder() 
Using connection = New SqlConnection("your_con_string_here") 
    connection.Open() 
    Dim courseSelectCom = New SqlCommand("SELECT course_name FROM course where [email protected]", connection) 
    courseSelectCom.Parameters.AddWithValue("@schoolName", SchoolSelect.Text) 
    Dim reader = courseSelectCom.ExecuteReader() 
    while reader.Read() 
     sb.AppendLine(reader("course_name")) ' or add to some kind of list to reuse' 
    End While 
End Using 

Console.WriteLine(sb.ToString()) 
, 목록 상자 또는 기타 ....

+0

감사합니다. 이 쿼리에서 사용할 수있는 문자열에 독자의 결과를 지정 하시겠습니까? 이전에는 "courseselectcom"명령의 결과 인 "coursenumbers"변수를 문자열로 사용했습니다. – d99

+0

새 SqlCommand로 totalStudentCom 사용 (예 : '% % & courseNumbers &' '와 같은 course_name, _ 연결 인 학생 선택 COUNT (student_ID)) – d99

+0

예, 각 레코드를 분리하는 내부 버퍼의 개별 레코드를 수집하는 StringBuilder를 추가했습니다. 줄 바꿈으로. Multiline TextBox의 Text 속성을 설정하고 결과를 프로그램에 표시하는 데 사용할 수 있습니다. 또는 컬렉션 목록 (문자열 중)을 사용하고 컬렉션에 각 레코드를 추가 할 수 있습니다. – Steve

0

모든 코스를 쉼표로 구분 된 목록으로 만들려면 group_concat (MySQL을 사용한다고 가정) :

SELECT group_concat(course_name) 
FROM course 
where school= '%"schoolSelect & "' 

이렇게하면 모든 열이 단일 열에있는 행 하나가 'biochemistry,marine biology'과 같이 반환됩니다.

select stuff((select ','+course_name from course where school= '%"schoolSelect & "' for xml path ('')), 
      1, 1, '') as coursenames 

SQL Server가 기본 집계 문자열 연결 연산자가없는, 그래서 이것은 데이터베이스의 XML 기능을 사용

는 SQL 서버에서이 작업을 수행하려면, 당신은 할 수 있습니다.당신은이 같은 필요

Dim courseSelectCom = New SqlCommand("select stuff((select ','+course_name from course where school= '%"schoolSelect & "' for xml path ('')), 1, 1, '') as coursenames", connection) 

:

나는로 기록 될 것이라고 생각 문자열로

Dim reader = courseSelectCom.ExecuteReader() 
reader.Read() 
reader("course_names") 
+0

'group_concat'이 인식 할 수없는 기본 제공 함수 이름이 아닙니다. – d99

+0

@ d99. . . 기본 데이터베이스가 무엇인지 알고 있습니까? 아마도 SQL Server 나 Access 일 것입니다. 이러한 데이터베이스에서 수행하기가 어렵습니다. –

+0

그래, SQL 서버, 죄송합니다. mysql 부분을 알지 못했습니다. SQL Server에 상응하는 것이 있습니까? – d99

관련 문제