0

私は学校のコンピューティングコースワーク用の部屋予約サービスを構築していますが、データベースから以前に行った予約を取得する方法が完全にはわかりません。データベースに接続して1つのエントリを読み取る方法を知っていますが、複数のエントリを読み取ることはできません。

これまでのところ:

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

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

これにより、データベースから5つの変数、日付、予約期間、予約の長さ、UserID、RoomIDがこの順序で取得され、最後の4つの変数を整数配列に書き込みます。 1日の最大予約数は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
4

1 に答える 1

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

ただし、私が行ういくつかのさらなる推奨事項があります。まず、可能であれば、使用するオブジェクト(Newconnection、Cmdなど)Usingごとにブロックを追加する必要があります。実行が何らかの理由(例外など)でブロックを離れた場合でも、オブジェクトが適切に破棄されるため、ブロックはより安全ですIDisposableUsing

次に、日付値を文字列に直接追加するのではなく、コマンドでパラメータを使用する必要がありますstrBookingQuery。このように自分でSQL文字列に値を追加すると、データベースがSQLインジェクション攻撃にさらされます。また、特に日付を使用すると、文化の違いにも遭遇する可能性があります(たとえば、MM-dd-yyyyと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
于 2013-02-18T14:47:06.617 に答える