2013-02-17 3 views
0

나는 학교 컴퓨팅 교과 과정을위한 방 예약 서비스를 구축 중이며 데이터베이스에서 이전에 예약 한 예약을 검색하는 방법을 완전히 알지 못합니다. 데이터베이스에 연결하고 하나의 항목을 읽는 방법을 알고 있지만 여러 항목을 읽지는 않습니다.VB의 MySQL 데이터베이스에서 여러 항목 가져 오기

지금까지 내가 가진 :

strBookingQuery = "SELECT * FROM bookings WHERE Date = '" & ConvertedBookingDate & "'" 

    Dim Cmd As New MySqlCommand(strBookingQuery, Newconnection) 
    Newconnection.ConnectionString = strServerString 
    Newconnection.Open() 
    reader = Cmd.ExecuteReader() 
    reader.Read() 

이것은, 데이터베이스, 날짜가 예약되어있는 기간, 예약의 길이, ID와 순서의 RoomID에서 5 개 변수를 끌어와 integer 배열에 마지막 4 개의 변수를 정수로 쓰고 싶습니다. 배열 크기는 7 일이며, 하루에 예약 할 수있는 최대 수는 7입니다. 어떤 도움도 대단히 감사하겠습니다. :)

나는 또한 나쁜 점을 사과합니다. 코딩, 나는 A 레벨 학생이므로 정말 오랫동안 코딩하지 않았습니다.

이 줄에 뭔가가 있습니까?

Function GetBookingData() 

    strBookingQuery = "SELECT * FROM bookings WHERE Date = '" & ConvertedBookingDate & "'" 

    Dim Cmd As New MySqlCommand(strBookingQuery, Newconnection) 
    Newconnection.ConnectionString = strServerString 
    Newconnection.Open() 
    reader = Cmd.ExecuteReader() 
    reader.Read() 
    For SP = 1 To intBookingCount 
     Do While reader.Read() 
      StartPeriod(SP) = reader.GetInt16(1) 
     Loop 
     MsgBox(StartPeriod(SP)) 
    Next 

    Newconnection.Close() 

End Function 
+0

전화 할 때마다'reader.Read', 그것은 독자에 다음 행을 읽습니다. 'reader.Read' 메쏘드는 모든 행을 읽은 후에'False'를 리턴 할 것이므로'While reader.Read' 루프를 만들 수 있습니다. –

+0

이전에 시도 했었지만 첫 번째 배열을 읽는 데 작동했지만 두 번째 배열은 모두 0으로 반환되었습니다. –

+0

자세한 내용 없이는 설명하기가 어렵습니다. 그렇게하는 것이 옳다면 그렇게 할 수 있습니다. –

답변

0

그것의 그것이 당신이해야 할 시도,하지만 난 당신이 실제로 원하는 것은이 같은 것으로 의심 무엇인지 완전히 명확하지 :

Function GetBookingData() 
    strBookingQuery = "SELECT * FROM bookings WHERE Date = '" & ConvertedBookingDate & "'" 
    Dim Cmd As New MySqlCommand(strBookingQuery, Newconnection) 
    Newconnection.ConnectionString = strServerString 
    Newconnection.Open() 
    reader = Cmd.ExecuteReader() 
    For SP = 1 To intBookingCount 
     If Not reader.Read() Then 
      Exit For 
     End If 
     StartPeriod(SP) = reader.GetInt16(1) 
     MsgBox(StartPeriod(SP)) 
    Next 
    Newconnection.Close()  
End Function 

그러나, 몇 가지 더 권장 사항이 있음을 나는 것 하다. 먼저 사용하는 각 IDisposable 개체 (예 : Newconnection, Cmd)에 대해 가능한 경우 Using 블록을 추가해야합니다. Using 블록은 어떤 이유 (예 : 예외)로 인해 실행이 블록을 벗어나면 여전히 적절하게 처리하므로 더 안전합니다.

둘째로 strBookingQuery 문자열에 날짜 값을 직접 추가하는 대신 명령에 매개 변수를 사용해야합니다. 그런 식으로 SQL 문자열에 값을 추가하면 데이터베이스를 SQL 삽입 공격으로 엽니 다. 또한 날짜를 사용하면 문화적 차이도 발생할 수 있습니다 (예 : MM-dd-yyyy vs. dd-MM-yyyy).

세 번째로 List(Of Integer)과 같은 일종의 컬렉션을 사용하여 배열이 아닌 데이터베이스에서 읽은 값을 저장하는 것이 더 쉬울 것입니다. 행 수가 항상 고정 된 크기라고 가정하는 것은 좋지 않으며 가변 길이 목록을 처리 할 때 배열을 사용하는 것은 불편합니다. 컬렉션은 그런 종류의 일을 위해 정확하게 만들어집니다. 배열에서 고정 길이와 현재 인덱스를 추적하는 대신 컬렉션을 사용하여 새 항목을 추가해야하는 경우 Add 메서드를 호출하면됩니다.

그래서, 내 추천 더 같은 그것을 할 것 :

Public Function GetBookingData(bookingDate As Date) As List(Of Integer) 
    Dim data As New List(Of Integer)() 
    Using connection As New MySqlConnection() 
     connection.ConnectionString = connectionString 
     connection.Open() 
     Dim query As String = "SELECT * FROM bookings WHERE Date = @BookingDate" 
     Using command As New MySqlCommand(query, connection) 
      Dim parameter As IDbDataParameter = command.CreateParameter() 
      parameter.ParameterName = "@BookingDate" 
      parameter.Value = bookingDate 
      command.Parameters.Add(parameter)     
      Using reader As DbDataReader = cmd.ExecuteReader() 
       Do While reader.Read() 
        data.Add(reader.GetInt16(1)) 
       Loop 
      End Using 
     End Using 
    End Using 
    Return data 
End Function 
+1

고마워요. –

관련 문제