当前位置: 首页 > 面试题库 >

在Access / VBA中构建SQL字符串

韦辰钊
2023-03-14
问题内容

有时,我不得不在VBA中构建一个SQL字符串并使用来执行它Docmd.RunSql()。我一直通过将变量串联到字符串中来构建这些字符串,例如:

Dim mysqlstring as String
mysqlstring = "INSERT INTO MyTable (Field1, Field2, Field3 ...) VALUES ("
mysqlstring = mysqlstring + Me.TextMyField1 + ", " 'parameter comments
mysqlstring = mysqlstring + Me.TextMyField2 + ", " 
mysqlstring = mysqlstring + Me.TextMyField3 + ", " 
...
mysqlstring = mysqlstring + ");"
Docmd.RunSql mysqlstring

VBA似乎没有一元串联运算符(例如+
=),虽然看起来不太理想,但至少我可以注释每个参数并独立更改它们。它比一个怪物级联的字符串更易于阅读和更改。但这似乎仍然是构建SQL字符串的一种糟糕方法。我有一个带有约50个参数的参数,因此有50行mysqlstring = mysqlstring +...。不可爱。

顺便说一句,这排除了使用行连续来格式化字符串的可能性,因为单个字符串上可以使用的行连续数量是有限的(提示:小于50)。另外,VBA不允许您在行继续之后发表评论,grr!

直到最近,我还认为这是构建这些字符串的唯一方法。但是最近我看到了一种不同的模式,将诸如此类的参数(VB.NET注入到我在上面发布了答案的字符串中,并且想知道是否存在与Parameters.AddWithValue()VBA等效的参数,或者是否比VBA更好。字符串串联方法。因此,我认为这值得提出自己的问题。也许这里有些我想念的东西。

一些Access专家能否请您澄清在Access / VBA中构建SQL字符串的最佳实践是什么。


问题答案:

我有一个时间表应用程序,其中包含一个相当复杂的未绑定的劳务交易输入表单。有很多数据验证,速率计算和其他代码。我决定使用以下内容创建我的SQL插入/更新字段。

变量strSQLInsert,strSQLValues和strSQLUpdate是表单级别的字符串。

以下几行:

Call CreateSQLString("[transJobCategoryBillingTypesID]", lngJobCategoryBillingTypesID)

其次是:

If lngTransID = 0 Then
    strSQL = "INSERT into Transactions (" & Mid(strSQLInsert, 3) & ") VALUES (" & Mid(strSQLValues, 3) & ")"
Else
    strSQL = "UPDATE Transactions SET " & Mid(strSQLUpdate, 3) & " WHERE transID=" & lngTransID & ";"
End If

conn.Open
conn.Execute strSQL, lngRecordsAffected, adCmdText

请注意,中线删除了前导“,”。lngTrans是自动编号primamy kay的值。

Sub CreateSQLString(strFieldName As String, varFieldValue As Variant, Optional blnZeroAsNull As Boolean)
'    Call CreateSQLString("[<fieldName>]", <fieldValue>)

Dim strFieldValue As String, OutputValue As Variant

    On Error GoTo tagError

    ' if 0 (zero) is supposed to be null
    If Not IsMissing(blnZeroAsNull) And blnZeroAsNull = True And varFieldValue = 0 Then
        OutputValue = "Null"
    ' if field is null, zero length or ''
    ElseIf IsNull(varFieldValue) Or Len(varFieldValue) = 0 Or varFieldValue = "''" Then
        OutputValue = "Null"
    Else
        OutputValue = varFieldValue
    End If

    ' Note that both Insert and update strings are updated as we may need the insert logic for inserting
    '    missing auto generated transactions when updating the main transaction
    ' This is an insert
    strSQLInsert = strSQLInsert & ", " & strFieldName
    strSQLValues = strSQLValues & ", " & OutputValue
    ' This is an update
    strSQLUpdate = strSQLUpdate & ", " & strFieldName & " = " & OutputValue

    On Error GoTo 0
    Exit Sub

tagError:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure CreateSQLString of VBA Document Form_LabourEntry"
    Exit Sub
End Sub

我看到其他张贴者都使用Execute方法。DoCmd.RunSQL的问题在于它可以忽略错误。以下任何一项将显示查询收到的任何错误消息。如果使用DAO,请使用Currentdb.Execute
strSQL,dbfailonerror。对于ADO,请使用CurrentProject.Connection.ExecutestrCommand,lngRecordsAffected,adCmdText然后可以删除docmd.setwarnings行。

如果要使用docmd.setwarnings,请确保将True语句也放入任何错误处理代码中。否则,以后可能会发生奇怪的事情,特别是在您使用该应用程序时。例如,如果您关闭一个对象,您将不再收到“您是否要保存所做的更改”消息。这可能意味着不需要的更改,删除或添加将保存到您的MDB中。

两种方法之间的性能也可能存在显着差异。一篇文章说currentdb.execute花了两秒钟,而docmd.runsql花了八秒钟。一如既往的YMMV。



 类似资料:
  • 主要内容:字符串函数字符串是一个字符序列,可以由字母,数字,特殊字符或全部字符组成。 如果一个变量被包含在双引号中,则被认为是一个字符串。 语法 简单示例 字符串函数 预定义的VBA字符串函数可以帮助开发人员非常有效地处理字符串。以下是VBA中支持的字符串的方法。请点击每个方法来详细了解。 编号 函数 描述 1 InStr 返回指定子字符串的第一个匹配项。从左到右搜索。 2 InstrRev 返回指定子字符串的第一个

  • 本文向大家介绍VBA 转义字符,包括了VBA 转义字符的使用技巧和注意事项,需要的朋友参考一下 示例 VBA语法要求在字符串中包含一个字符串字面量",因此,当您的字符串需要包含引号时,您需要对"字符进行转义/前缀,"以便VBA理解您打算将""其解释为"字符串。            

  • 问题内容: 嘿,我只是学习了如何将SQL语句放入VBA(或至少将它们写出),但是我不知道如何获取返回的数据? 我有一些基于查询的表格(图表形式),这些查询针对的是我定期运行的常规参数,只是更改了时间范围(例如,当月交易量排名前10位的商品)。然后,我有一些将图表对象自动传输到PowerPoint演示文稿中的过程。因此,我已经预先构建了所有这些查询(例如63),并且要匹配图表格式(嗯,是的....

  • 我有两个字符串 node1/node2/node3/node4“和”node1/node2/node5/node6“。...我怎样才能从这个字符串中构建一个摇摆的?这是我构建一个字符串的代码....

  • 问题内容: 我正在Access 2003中的表之间迁移数据。在旧表中,日期以YYYYMMDD格式存储为文本字段。 我想将该字段存储为新表中的日期时间。我曾尝试在SQL语句中使用,但它仅显示为结果。 我究竟做错了什么? 问题答案: 例如 所以,在您的情况下

  • 问题内容: 我有一个List(Of String),它对应于我们数据库表中的“类型”。 我们正在使用DB2 ADO.NET提供程序,而我的最终查询需要看起来像这样: 过去,我使用ForEach循环构建了查询参数/主机变量的列表,但是我真的很想找出一种在一行中构建它们的方法。当然,我可以连接所有字符串,但是加上“ @”和递增数字会让我头疼。 有人对如何执行此操作有任何想法吗? 问题答案: 不会像这样