【问题标题】:I need solution for this, regarding the exception which I get in my code关于我在代码中遇到的异常,我需要解决方案
【发布时间】:2013-01-09 18:34:59
【问题描述】:

这是我尝试将数据插入数据库的一段代码。我没有收到任何语法错误,但它没有提交数据。

 Sub submit(ByVal sender As Object, ByVal e As EventArgs)
    Dim objConn As New OleDbConnection
    Dim objCmd As New OleDbCommand
    Dim strConnString, strSQL As String

    strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & Server.MapPath("Mydatabase.mdb") & ""

    strSQL = "INSERT INTO tblRecord (CNIC,Names,City,Address,Number) " & " VALUES " & " ('" & cnic.Text & "','" & name.Text & "','" & city.Text & "','" & postal.Text & "','" & phone.Text & "')"
    objConn.ConnectionString = strConnString
    objConn.Open()

    With objCmd
        .Connection = objConn
        .CommandText = strSQL
        .CommandType = CommandType.Text
    End With

    Try
        objCmd.ExecuteNonQuery()
        Label1.Text = "Record Inserted Sucessfully."
        Label1.Visible = True
    Catch ex As Exception
        Label1.Visible = True
        Label1.Text = "Record Cannot Insert" & ex.ToString()
    End Try

    objConn.Close()

End Sub

这是我得到的例外:

System.Data.OleDb.OleDbException:INSERT INTO 语句中的语法错误。

在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
在 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,对象和执行结果)
在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)
在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
在 C:\Documents and Settings\Maira Alvi\My Documents\Visual Studio 2005\WebSites\WebSite3\Registration.aspx:line 32 中的 ASP.registration_aspx.submit(Object sender, EventArgs e)

【问题讨论】:

  • 直接在 SQL Management Studio 中运行 SQL 会发生什么?
  • Syntax error in INSERT INTO statement.。在执行之前检查strSQL 的值。你确实有语法错误。
  • 顺便说一句 - 此代码对 SQL Injection 开放。您应该使用parameterized queries,这也可能会纠正您遇到的问题。
  • 想想如果您的输入之一包含'...

标签: asp.net .net asp.net-mvc


【解决方案1】:

我的猜测是您的某个输入字段包含未转义的字符(例如,')。切换到参数化查询不仅可以解决该问题,还有助于防御其他问题(如 SQL 注入)。

//change query to use parameters
strSQL = "INSERT INTO tblRecord (CNIC,Names,City,Address,Number) VALUES (?,?,?,?,?);"

...

With objCmd
    .Connection = objConn
    .CommandText = strSQL
    .CommandType = CommandType.Text
    //add parameters using inputs for values
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = cnic.Text; //assumes varchar(50)
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = name.Text; //assumes varchar(50)
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = city.Text; //assumes varchar(50)
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = postal.Text; //assumes varchar(50)
    .Parameters.Add("?", OleDbType.VarChar, 50).Value = phone.Text; //assumes varchar(50)
End With

【讨论】:

    【解决方案2】:

    您确实有语法错误,它在您的异常中说得对!查看您正在为 SQL Insert 语句构建的字符串。我很确定最后某处缺少'

    但基本上,这是构建 SQL 语句的一种非常糟糕的方式。可以通过使用 string.Format 来改进它,但即便如此,您也会面临 SQL 注入攻击。

    使用参数添加值要好得多。 Here's an example of how to do it right.

    【讨论】:

    • InsertINSERT INTO tblRecord (CNIC,Names,City,Address,Number) VALUES ('31201-1234567-9','jj','hjkhj','hjhkj','12345678910') 这是strSQL的值
    • 电话字段的大小是多少?看起来您要插入 11 个字符...大多数电话号码是 10 位数字,所以您可能会溢出该列。
    猜你喜欢
    • 2016-03-31
    • 2019-09-13
    • 2021-12-19
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多