我必须在vb中编写一个查询来更新我的Access数据库。 我写这段代码:
Public Sub updateDB(ByVal PathDB As String)
Dim db As New cDB
Dim v As New cVoce
Dim rs As ADODB.Recordset = db.RecordSet
db.connetti_DB(PathDB)
db.get_rs("UPDATE Voci SET Descrizione = @v.Descrizione")
db.close_DB()
End Sub
但它不起作用。 Visual Studio向我显示了这个错误:“附加信息没有给出一个或多个必需参数的值”
我尝试做一个SELECT查询,它运行正常:
Dim db As New cDB
db.connect_DB(PathDB)
db.get_rs("DELETE * FROM Voice")
db.get_rs("SELECT Code_Chapter, Code_Paragraph, Description, Code_Voice, Price FROM Voice")
Public Function get_rs(ByVal query As String) As ADODB.Recordset
If db Is Nothing Then rs = Nothing : Return rs
rs = New ADODB.Recordset
rs.CursorType = ADODB.CursorTypeEnum.adOpenStatic
'rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
'rs.LockType = ADODB.LockTypeEnum.adLockBatchOptimistic
rs.LockType = ADODB.LockTypeEnum.adLockOptimistic
rs.Open(query, db)
Return rs
End Function
错误在哪里?
答案 0 :(得分:4)
您遇到的问题是由字符串" @ v.Descrizione"引起的。对于ADODB,这是一个参数占位符(不是类字段cVoce.Descrizione的值),因此它要求您提供额外的'有关您未提供的预期参数的信息。
你可以简单地在现场连接字符串值,但这是最糟糕的解决方案,如果字符串包含单引号或者对某种Sql注入更糟糕的话导致解析错误(尽管Access不是一件容易的事情)靶)。
因此,在运行此类查询时需要使用参数。
我在源代码库中找到了一些旧代码。此代码用于旧的ASP经典网站(VBScript不少)转换为更现代的ASP.NET站点。我和我的公司不再使用它了。所以我可以和你分享。
首先,您需要创建此方法(您甚至可以将其作为cDB类的一部分,并可能使用那里提供的连接)
Function GetCommand(commandText as String, ADODB.Connection conn) as ADODB.Command
Dim cmd = CreateObject("ADODB.Command")
cmd.Activeconnection = conn
cmd.CommandText = commandText
cmd.CommandType = adCmdText
return cmd
End Function
现在,您调用方法传递命令字符串,并为参数占位符显示“描述”字段
Dim cmd = GetCommand("UPDATE Voci SET [Description] = ?", db.GetConnection)
您可以将参数添加到cmd对象
cmd.Parameters.Append cmd.CreateParameter("@0", adChar,,, v.Descrizione)
最后你执行命令而不返回记录集(毕竟它是一个UPDATE查询,并且没有返回数据)
Dim recordsChanged as Integer
cmd.Execute(recordsChanged,,adExecuteNoRecords)
if recordsChanged > 0 Then
Console.WriteLine("Update succesfull")
我把字段名称描述放在方括号之间。目前还不清楚什么是正确的名称。描述或Descrizione?在第一种情况下,您需要使用方括号,因为Description是MS-Access的保留字。
同样,如果预算和时间允许,我强烈建议将代码移到ADO.NET库并丢弃复杂的ADODB COM接口。您甚至可以调查ORM的优缺点,以使代码与数据库接口保持距离。有一些ORM非常有用,比如实体框架的完整性或Dapper的速度和简单性。