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
2 回答
你没有给我们留下太多继续前进的空间;正如 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 })
请开启 Option Strict。这是一个两部分的过程。首先对于当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉列表中选择 ON。未来项目的第二个 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉列表中选择 ON。这将使您避免在运行时出现错误。
Updated(StrSql, 15)
您更新的函数需要一个字符串数组。15不是字符串数组。
函数需要返回的数据类型。
cmd.Parameters.AddWithValue("?", X)
cmd未声明。
您无法使用上述代码获得您提到的错误。它甚至不会编译,更不用说运行并产生错误了。
编写一个试图通用但实际上非常有限的函数并不是很有帮助。
让我们从您的更新声明开始。
Dim StrSql = "update student set id=?"
您提供的语句会将学生表中的每个 id 更新为 15。这是您打算做的吗?ID 字段很少更改。它们旨在唯一标识一条记录。通常,它们是自动编号字段。更新命令将使用 ID 字段来标识要更新的记录。
不要使用.AddWithValue. 请参阅http://www.dbdelta.com/addwithvalue-is-evil/
和
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
还有一个:
https ://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications
这是另一个
https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-使用.html
由于您没有告诉我们您使用的是什么数据库,所以我猜它是 Access,因为问号。如果是另一个数据库,请更改连接、命令和 dbType 类型。
Using...End Using 块可确保即使出现错误,您的连接和命令也已关闭和处置。
Private ConStr As String = "Your Connection String"
Public Function Updated(StudentNickname As String, StudentID As Integer) As Integer
Dim RetVal As Integer
Using cn As New OleDbConnection(ConStr),
cmd As New OleDbCommand("Update student set NickName = @NickName Where StudentID = @ID", cn)
cmd.Parameters.Add("@NickName", OleDbType.VarChar, 100).Value = StudentNickname
cmd.Parameters.Add("@ID", OleDbType.Integer).Value = StudentID
cn.Open()
RetVal = cmd.ExecuteNonQuery
End Using
Return RetVal
End Function
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim RowsUpdated = Updated("Jim", 15)
Dim message As String
If RowsUpdated = 1 Then
message = "Success"
Else
message = "Failure"
End If
MessageBox.Show(message)
End Sub
此代码使您的数据库代码与用户界面代码分开。