0
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
4

2 回答 2

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 })

http://dapper-tutorial.net

于 2020-08-06T16:26:35.843 回答
0

请开启 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

此代码使您的数据库代码与用户界面代码分开。

于 2020-08-06T18:19:39.630 回答