如何在vb中编写查询

时间:2017-10-03 09:24:15

标签: vb.net

我必须在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

错误在哪里?

1 个答案:

答案 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的速度和简单性。