0

私は現在、人々のリストを表示し、基本的に彼らがオフィスにいるか外出しているかを示す簡単なプロジェクトに取り組んでいます。また、リストを編集して、オフィスにいるか外出しているかを示したり、いつ戻ってくるかを示すメッセージを更新したりすることもできます。

私の問題は、リストを更新すると、更新ステートメントに構文エラーがあるというエラーが表示されることですが、それが見つかりません。Visual Studio 2012 を使用し、VB.NET で開発し、OleDB 接続を介してアクセスするアクセス データベースを使用しています。

これが問題のVBコードです

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If InOutComboBox.SelectedItem = "IN" Then
        MessageTextBox.Text = ""
    End If
    con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\People.mdb")
    con.Open()
    If ListView1.SelectedIndices.Count > 0 Then
        Dim comStr As String = "UPDATE tblStaffNames SET OutIn = '" & InOutComboBox.SelectedItem & "', Note = '" & MessageTextBox.Text & "' WHERE recid = " & ListView1.SelectedItems(0).SubItems(0).Text
        cmd = New OleDbCommand(comStr, con)
        Try
            cmd.ExecuteNonQuery()
        Catch ex As Exception
            MessageBox.Show(ex.Message & " - " & ex.Source)
        End Try
    End If
    ListView1.Clear()
    LoadList()

End Sub

コードを実行したときの comStr のサンプル値を次に示します。

UPDATE tblStaffNames SET OutIn = 'OUT', Note = 'on vacation' WHERE recid = 26

どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

5

NOTEは、Jet-MsAccess の予約済みキーワードです。
コマンドをデータベース エンジンに送信する前に、角かっこでカプセル化する必要があります。

クエリには別の大きな問題があります。ユーザー入力が、文字列連結を使用してデータベースに直接送信されることは信頼できません。パラメータ化されたクエリ(SQLインジェクション)を使用する必要があります

Using con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\People.mdb")
    con.Open()
    If ListView1.SelectedIndices.Count > 0 Then
        Dim comStr As String = "UPDATE tblStaffNames SET OutIn = ?, [Note] = ?" & _ 
               " WHERE recid = ?"
        cmd = New OleDbCommand(comStr, con)
        cmd.Parameters.AddWithValue("@p1", InOutComboBox.SelectedItem)
        cmd.Parameters.AddWithValue("@p2", MessageTextBox.Text)
        cmd.Parameters.AddWithValue("@p3", ListView1.SelectedItems(0).SubItems(0).Text)
        Try
            cmd.ExecuteNonQuery()
        Catch ex As Exception
            MessageBox.Show(ex.Message & " - " & ex.Source)
        End Try
    End If
End Using

パラメーターの順序に注意してください。OleDb では位置指定なので、すべてのパラメーターは、?プレースホルダーが期待する正確な順序で Parameters コレクションに表示される必要があります。

また、ご覧のとおり、作業が終了したときに接続オブジェクトを正しく閉じて破棄することを保証する Using ステートメントも追加しました。

于 2013-03-27T16:53:31.687 に答える