首页 > 解决方案 > 我如何解决 ExecuteNonQuery 抛出异常“?”附近的语法不正确

问题描述

Dim StrSql = "update student set id=?"

Updated (StrSql,15)

Public Function Updated (ByVal strSql As String, ByVal ParamArray Parameters As String ())
    For Each x In Parameters
        cmd.Parameters.AddWithValue("?",x)
    Next

    cmd.ExecuteNonQuery()
End Function

标签: vb.net

解决方案


你没有给我们留下太多继续前进的空间;正如 jmcilhinney 指出的那样,您需要为未来的问题添加更多细节。例如,在这一个中,您的代码根本无法编译,没有提及任何变量的类型,您没有给出数据库的名称......

...我相当确定“附近的语法不正确”是 SQL Server 的事情,在这种情况下,您需要记住它(重新)使用命名参数,这与使用位置参数的 Access 不同:

SQL Server:
strSql = "SELECT * FROM person WHERE firstname = @name OR lastname = @name"
...Parameters.AddWithValue("@name", "Lee")

Access:
strSql = "SELECT * FROM person WHERE firstname = ? OR lastname = ?"
...Parameters.AddWithValue("anythingdoesntmatterwillbeignored", "Lee")
...Parameters.AddWithValue("anythingdoesntmatterwillbeignoredalso", "Lee")

这确实意味着您的功能需要变得更加智能;也许传递 KeyValuePair(Of String, Object) 的 ParamArray

或者你现在应该停止这样做,转而使用 Dapper。Dapper 接受您的查询,应用您的参数并在您要求时返回对象:

Using connection as New SqlConnection(...)

  Dim p as List(Of Person) = Await connection.QueryAsync(Of Person)( _
    "SELECT * FROM person WHERE name = @name", _
    New With { .name = "John" } _
  )

  ' use your list of Person objects

End Using

是的,所有添加参数 BS,执行阅读器,并将结果转换为 Person .. Dapper 完成了这一切。非查询就像connection.ExecuteAsync("UPDATE person SET name=@n, age=@a WHERE id=@id", New With{ .n="john", .a=27, .id=123 })

http://dapper-tutorial.net


推荐阅读