关于我在代码中遇到的异常,我需要解决方案

Posted

技术标签:

【中文标题】关于我在代码中遇到的异常,我需要解决方案【英文标题】: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,这也可能会纠正您遇到的问题。 想想如果您的输入之一包含'... 【参考方案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 位数字,所以您可能会溢出该列。

以上是关于关于我在代码中遇到的异常,我需要解决方案的主要内容,如果未能解决你的问题,请参考以下文章

我在 Selenium 中使用 chrome 浏览器启动 facebook 时遇到以下异常,任何人都可以建议我解决这个问题

Selenium WebDriver 如何解决陈旧元素引用异常?

如何在 ios 中捕获数据库异常?

Flutter / dart异常地理定位错误

java问题 ~~求教高手 13) 以下关于异常的说法,错误的是

如何解决“未定义 ASPx”错误变成“潜在危险的 Request.Path”异常?