【问题标题】:Inserting data from VB.NET to MS Access: Syntax error in INSERT INTO statement [duplicate]将数据从 VB.NET 插入 MS Access:INSERT INTO 语句中的语法错误 [重复]
【发布时间】:2015-02-23 16:37:48
【问题描述】:

我正在使用 Microsoft Visual Studio 2013 并尝试使用 VB.NET 为我的帐户数据库制作注册表单。到目前为止,这是我的代码:

Private Sub btnRegistery_Click(sender As Object, e As EventArgs) Handles btnRegistery.Click
    Dim usernme, passwrd As String
    usernme = txtUsernm.Text
    passwrd = txtpasswrd.Text

    Dim myconnection As OleDbConnection
    Dim constring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\hasan\Documents\Visual Studio 2012\Projects\hasan\Login_Info.accdb"
    myconnection = New OleDbConnection(constring)
    myconnection.Open()

    Dim sqlQry As String

    sqlQry = "INSERT INTO tbl_user(username, password) VALUES(usernme , passwrd)"

    Dim cmd As New OleDbCommand(sqlQry, myconnection)
    cmd.ExecuteNonQuery()
End Sub

代码编译得很好,但是当我尝试注册任何新信息时,我收到以下消息:

    A first chance exception of type 'System.Data.OleDb.OleDbException' 
    occurred in System.Data.dll
    Additional information: Syntax error in INSERT INTO statement.    
    If there is a handler for this exception, the program may be safely continued.

这个问题的解决方案和原因是什么?

【问题讨论】:

  • 我还建议您将所有数据库代码从用户界面代码中移出并放入单独的 DLL 中,以确保更好地分离关注点。
  • 我还建议您不要对连接字符串进行硬编码,而是将它们存储在 app.config 文件中,这样您就可以“调整”MSAccess db 的位置而无需重新编译。

标签: database vb.net visual-studio ms-access syntax-error


【解决方案1】:

您的查询似乎有误:... VALUES(usernme, passwrd)... -- 这里usernmepasswrd不是数据库变量,只是查询中的纯文本。

使用参数,像这样:

Dim usernme, passwrd As String
usernme = txtUsernm.Text
passwrd = txtpasswrd.Text
Dim constring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\hasan\Documents\Visual Studio 2012\Projects\hasan\Login_Info.accdb"
Using myconnection As New OleDbConnection(constring)
    myconnection.Open()
    Dim sqlQry As String = "INSERT INTO [tbl_user] ([username], [password]) VALUES (@usernme, @passwrd)"
    Using cmd As New OleDbCommand(sqlQry, myconnection)
        cmd.Parameters.AddWithValue("@usernme", usernme)
        cmd.Parameters.AddWithValue("@passwrd", passwrd)
        cmd.ExecuteNonQuery()
    End using
End using

【讨论】:

  • 我不明白.. 我应该如何处理 sqlQry 以及它在上面的代码中的什么位置?
  • 检查我的答案我用新的查询更新它
  • 但 myconnection 现在未声明.. 保留声明它的原始代码位仍然给我同样的错误
  • 数据库中发生错误,我认为查询看起来很好(新查询)。然后检查该表,字段名称是否正确。然后检查数据库中声明的字段 usernamepassword 的长度是否与输入的值更多或相同
  • 您可以直接将此查询运行到您的数据库(使用 Access)吗?然后你可能会得到更多关于错误的信息
【解决方案2】:

您没有包括缺少引号的实际变量信息,例如

VALUES ('" & usernme & '", ...etc

你应该使用参数来避免错误和sql注入:

sqlQry = "INSERT INTO tbl_user (username, password) VALUES(@usernme, @passwrd)"

Dim cmd As New OleDbCommand(sqlQry, myconnection)
cmd.Parameters.AddWithValue("@usernme", usernme)
cmd.Parameters.AddWithValue("@passwrd", passwrd)
cmd.ExecuteNonQuery()

【讨论】:

  • 我认为错误不是因为缺少引号......
  • @Fabio 当然是。我只是没有写出来,因为更好的说明是使用参数。
  • 如果没有参数,他将需要:添加引号和&-sign 以连接 SQL 查询和变量值
  • @Fabio 这就是我的意思。我更新了帖子。
  • 我试过这个,它给了我同样的错误..
【解决方案3】:
Dim cnn As New OleDb.OleDbConnection

Private Sub RefreshData()
    If Not cnn.State = ConnectionState.Open Then
        '-------------open connection-----------
        cnn.Open()
    End If

    Dim da As New OleDb.OleDbDataAdapter("select stdID as [StdIdTxt]," &
                                       "Fname as [FnameTxt] ,Lname,BDy,age,gender,address,email,LNO,MNO,course" &
                                       "from studentTB order by stdID", cnn)

    Dim dt As New DataTable
    '------------fill data to data table------------
    da.Fill(dt)



    'close connection
    cnn.Close()


End Sub



Private Sub AddNewBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddNewBtn.Click
    Dim cmd As New OleDb.OleDbCommand

    '--------------open connection if not yet open---------------
    If Not cnn.State = ConnectionState.Open Then
        cnn.Open()
    End If
    cmd.Connection = cnn

    '----------------add data to student table------------------
    cmd.CommandText = "insert into studentTB (stdID,Fname,Lname,BDy,age,gender,address,email,LNO,MNO,course)" &
        "values (" & Me.StdIdTxt.Text & "','" & Me.FnameTxt.Text & "','" & Me.LNameTxt.Text & "','" &
        Me.BdyTxt.Text & "','" & Me.AgeTxt.Text & "','" & Me.GenderTxt.Text & "','" &
        Me.AddTxt.Text & "','" & Me.EmailTxt.Text & "','" & Me.Hometxt.Text & "','" & Me.mobileTxt.Text & "','" & Me.Coursetxt.Text & "')"


    cmd.ExecuteNonQuery()

    '---------refresh data in list----------------
    'RefreshData()

    '-------------close connection---------------------
    cnn.Close()

【讨论】:

  • 当字符串文本包含单引号时,更容易发生 SQL 注入和某种错误。
  • 欢迎来到 Stack Overflow。感谢您提交答案,但有几个问题:(1) 这是一个“代码转储”答案,完全没有解释它如何解决 OP 的问题。甚至是一个简短的介绍性句子,例如“此代码使用 [某种技术] 来避免错误”。会有所帮助的。 (2) 您的代码将用户输入直接连接到 SQL 语句中,使其容易受到 SQL 注入的攻击。那是不好的做法。你应该使用parameter query
【解决方案4】:

这个插入错误只是一个语法错误,没有必要改变你的代码。请避免在您的数据库中使用诸如“密码”之类的保留字。这个错误是由于字段名密码造成的

【讨论】:

    【解决方案5】:

    SQL 字符串应该是这样的

    sqlQry = "INSERT INTO tbl_user(username, password) VALUES(" & usernme  & "', " & passwrd & ")"
    

    值 usernme 和 passwrd 对数据库无效。 除此之外,您真的应该考虑使用 Command 对象和参数。

    【讨论】:

    • 讽刺的是,您的答案缺少一些引号。
    • 易受 SQL 注入攻击...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多