【问题标题】:Error is being thrown in my SQL update statement; Data type mismatch in criteria expression我的 SQL 更新语句中出现错误;条件表达式中的数据类型不匹配
【发布时间】:2017-04-21 11:55:23
【问题描述】:

我正在尝试用当前记录更新我的表,其中包含一周中的实际天数(字符串),但我的代码给了我错误:

条件表达式中的数据类型不匹配

我已经严格检查了我的 SQL 语句,以确保使用了正确的数据类型,但我根本找不到任何问题。谁能帮我确定我的问题所在以及任何潜在的解决方案。

SQL 语句是:

str = "Update [tblAppointments] Set [Day] ='" & day & "' WHERE [TimeID] ='" & redbutton & "'"

redbutton = 18 

day = "wednesday"

这是我正在使用的数据库:

【问题讨论】:

  • 您的 TimeID 值周围有单引号,但在图像中您将 TimeID 显示为数字。你检查过那个吗?
  • 试试这个,整数通常不应该有引号; str = "更新 [tblAppointments] 设置 [Day] ='" & day & "' WHERE [TimeID] =' & redbutton & '"
  • 如果您要通过字符串连接来构造 SQL,首先要做的事情是打印完整的最终字符串(例如消息框)并确保它是正常的。然后决定停止通过字符串连接构建 SQL 查询,因为这是一个真的坏主意,而是继续阅读参数化查询。
  • @David 是的,我已经尝试过像 Intern87 建议的那样重新更正,但它仍然给我同样的错误
  • @Vbv123:那么正在执行的新查询是什么? (构建它的代码行和正在构建的实际运行时值。)

标签: sql vb.net ms-access


【解决方案1】:

首先,使用 SQL 参数。这怎么强调都不过分。请参阅How does the SQL injection from the “Bobby Tables” XKCD comic work? 以更好地了解为什么它很重要。

请注意,在使用OleDb 参数时,重要的是添加它们的顺序,而不是名称。这本身就可能导致问题。确保按照它们出现在命令中的方式添加它们。在你的情况下Day 然后TimeID

您的代码看起来类似于:

Using con As New OleDbConnection(connectionString),
      cmd As New OleDbCommand("UPDATE [tblAppointments] SET [Day] = ? WHERE [TimeID] = ?", con)

    cmd.Parameters.Add(New OleDbParameter("Day", OleDbType.VarChar)).Value = "wednesday"
    cmd.Parameters.Add(New OleDbParameter("TimeID", OleDbType.Integer)).Value = 18

    con.Open()

    cmd.ExecuteNonQuery()
End Using

【讨论】:

    【解决方案2】:

    别人有建议,我拼一下:Use Sql Parameterisation

    这样,

    Dim day As String = "Wednesday"
    Dim redbutton As Integer = 18
    
    Dim qp As New List(Of SqlParameter)
    qp.Add(New SqlParameter("@DAY", SqlDbType.VarChar) With {.Value = day})
    qp.Add(New SqlParameter("@redbutton", SqlDbType.Int) With {.Value = redbutton})
    
    var str = "Update [tblAppointments] Set [Day] = @DAY WHERE [TimeID] = @redbutton"
    executeNonQuery(str,qp) 'Or however you're communicating with database.
    

    更多信息请参见How to: Execute a Parameterized Query

    【讨论】:

    • 问题被标记为ms-access 所以OleDbParameter? 占位符可能是当天的顺序。
    • @Daniel Shillcock 我参数化了我的 SQL 语句,但它仍然给我同样的错误。
    【解决方案3】:

    感谢您的帮助,我找到了解决问题的方法

    Dim str = "Update [tblAppointments] Set [Day] ='" & day & "' WHERE [TimeID] =" & CInt(redbutton) & " ;"
    

    这样做可以让我的程序正常工作,但是,我确实意识到使用参数化 SQL 更安全,但我没有明确的方法。

    【讨论】:

    • “我没有明确的方法” - 真的吗?我放弃了关于使用 ? 作为参数占位符的 cmets,并在另一个答案中提到了 OleDbParameter,您有没有明确的前进方向吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多