0

私はVBの初心者です。msアクセスを接続するプログラムを作成していますが、プログラムを実行すると

Insert into ステートメントの構文エラー、OleDbExpection が処理されませんでした

これが私のコードです:

Public Class Form2

Dim cnn As New OleDb.OleDbConnection

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    txtdate.Value = DateTime.Now
    cnn = New OleDb.OleDbConnection
    cnn.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0; Data Source=C:\Users\John\Documents\db.mdb"
End Sub
Private Sub btnsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsave.Click
    If Not cnn.State = ConnectionState.Open Then
        cnn.Open()

    End If
    Dim cmd As New OleDb.OleDbCommand

    cmd.Connection = cnn
    cmd.CommandText = "INSERT INTO sr(names,add,tel,dates,prob,serv,model,snm,acc,sna,remark)" & _
                          "VALUES ('" & Me.txtname.Text & "','" & Me.txtadd.Text & "','" & Me.txttel.Text & "', '" & _
                          Me.txtdate.Text & "','" & Me.txtpro.Text & "','" & Me.txtser.Text & "','" & Me.txtmod.Text & "', '" & _
                          Me.txtsnm.Text & "','" & Me.txtacc.Text & "','" & Me.txtsna.Text & "','" & Me.txtrem.Text & "')"

    cmd.ExecuteNonQuery()

    cnn.Close()
End Sub
End Class

私のコードに何か問題がありますか?

4

2 に答える 2

4

コードをより読みやすく、免疫力を高めるには、次をSQL Injection使用します

  • コマンドとパラメータ
  • 使用Usingステートメント

スニペット、

Dim comText As String = "INSERT INTO sr(names,add,tel,dates,prob,serv,model,snm,acc,sna,remark) " & _
                        "VALUES (@names,@add,@tel,@dates,@prob,@serv,@model,@snm,@acc,@sna,@remark)"
Dim connString As String = "ConnectionString Here"
Using conn As New OleDbConnection(connString)
    Using comm As New OleDbCommand()
        With comm
            .Connection = conn
            .CommandType = CommandType.Text
            .CommandText = comText
            .Parameters.AddWithValue("@names" , txtname.Text)
            .Parameters.AddWithValue("@add" , txtadd.Text)
            .Parameters.AddWithValue("@tel" , txttel.Text)
            .Parameters.AddWithValue("@dates" , txtdate.Text)
            .Parameters.AddWithValue("@prob" , txtpro.Text)
            .Parameters.AddWithValue("@serv" , txtser.Text)
            .Parameters.AddWithValue("@model" , txtmod.Text)
            .Parameters.AddWithValue("@snm" , txtsnm.Text)
            .Parameters.AddWithValue("@acc" , txtacc.Text)
            .Parameters.AddWithValue("@sna" , txtsna.Text)
            .Parameters.AddWithValue("@remark" , txtrem.Text)
        End With

        Try
            conn.Open()
            comm.ExecuteNonQuery
        Catch ex As OleDbException
            ' do something with the error
            ' don't hide it!
        End Try
    End Using
End Using

ソース

于 2012-11-11T11:02:18.527 に答える
1

あなたのVBコードは問題ありません(他の人が言っているように理想的ではありませんが、バグはありません)。

構文エラー(およびOleDbExpection一般的には)は、生成したSQL文字列がデータベースに対して無効であることを意味します。デバッグするには、呼び出す前に生成されたSQL文字列を表示し、cmd.ExecuteNonQuery()それが有効なSQLであることを確認する必要があります。

このエラーは、入力テキストボックスの1つに無効なデータがあることが原因である可能性があります。If ... Then簡単なステートメントで確認できます

If Not String.IsNullOrEmpty(Me.txtdata.Text) Then
    'Add the txtdata parameter
End If
于 2012-11-11T11:09:10.153 に答える