如何将 GUID 分配给 VBA 中的 DAO 参数

Posted

技术标签:

【中文标题】如何将 GUID 分配给 VBA 中的 DAO 参数【英文标题】:How do a assign a GUID to a DAO parameter in VBA 【发布时间】:2019-05-26 09:15:11 【问题描述】:

我有一段代码可以归结为

dim stmt   as dao.queryDef
dim parId  as dao.parameter

set stmt = currentDB().createQueryDef("", _
    "parameters id guid, ...; insert into tab (id, ... ) values ([id], ...)")

我用

创建了表格
 create table tab (
    id guid,
    ...
 )

alter table tab add constraint tab_pk primary key (id)

稍后,我想为parId分配一个GUID:

parId.value = GuidFromString("936DA01F-9ABD-4D9D-80C7-02AF85C822A8")

此分配导致运行时错误 3421Data type conversion error

如何将 GUID 分配给 dao.parameter 变量?

更新示例

这是一个更新的示例,它使用了在我的环境中不起作用的 longbinary 参数:当执行 stmt.execute 时,它会导致 运行时错误 3001(无效参数)

option explicit

sub main() ' 

    dim db as dao.database
    set db = application.currentDB

  ' db.execute("drop table tab")

    createTable  db
    insertValues db

end sub ' 

sub createTable(db as dao.database) ' 

    db.execute(   _
   "create table tab ( " & _
   "  id     guid,     " & _
   "  txt    char(60)  " & _
   ")")

   db.execute("alter table tab add constraint tab_pk primary key (id)")


end sub ' 


sub insertValues(db as dao.database) ' 

     dim stmt as dao.queryDef

     set stmt = db.createQueryDef("",   _
       "parameters "                  & _
       "  id     longbinary,  "       & _
       "  txt    char(60);    "       & _
       "insert into tab values ([id], [txt]) ")


     dim parId   as dao.parameter
     dim parTxt  as dao.parameter

     set parId  = stmt.parameters("id" )
     set parTxt = stmt.parameters("txt")

     parId.value  =  GuidFromString("936DA01F-9ABD-4D9D-80C7-02AF85C822A8")
     parTxt.value = "Hello world."

     stmt.execute ' Access throws Runtime Error 3001 (Invalid argument)

end sub ' 

【问题讨论】:

【参考方案1】:

GUID 类型是一种特殊类型,不能作为参数使用。

改为使用 LONGBINARY 将 GUID 作为二进制数据传递给查询:

set stmt = currentDB().createQueryDef("", _
    "parameters id LONGBINARY, ...; insert into tab (id, ... ) values ([id], ...)")

响应新的 MCVE:

主要错误是VARCHAR 声明。以下修改工作:

Sub insertValues(db As dao.Database) ' 
     Dim stmt As dao.QueryDef
     Set stmt = db.CreateQueryDef("", _
       "parameters " & _
       "  idparam   LONGBINARY ;" & _
       "insert into tab(ID)  values ([idparam]) ")
     Dim parId   As dao.Parameter
     Dim parTxt  As dao.Parameter

     Set parId = stmt.Parameters("idparam")
     'Set parTxt = stmt.Parameters("txtparam")
     stmt.Parameters!idparam.Value = GUIDFromString("936DA01F-9ABD-4D9D-80C7-02AF85C822A8")
     'stmt.Parameters!txtparam.Value = "Hello world."
     stmt.Execute 'no errors
End Sub ' 

Sub insertValues(db As dao.Database) ' 
     Dim stmt As dao.QueryDef
     Set stmt = db.CreateQueryDef("", _
       "parameters " & _
       "  idparam   BINARY, txtparam CHAR(60) ;" & _
       "insert into tab  values ([idparam], txtparam) ")
     Dim parId   As dao.Parameter
     Dim parTxt  As dao.Parameter

     Set parId = stmt.Parameters("idparam")
     Set parTxt = stmt.Parameters("txtparam")
     stmt.Parameters!idparam.Value = GUIDFromString("936DA01F-9ABD-4D9D-80C7-02AF85C822A8")
     stmt.Parameters!txtparam.Value = "Hello world."
     stmt.Execute 'no errors
End Sub ' 

【讨论】:

使用这种方法,我在调用 stmt.execute 时收到 invalid argument 错误。 这很奇怪。使用您提供的表定义和带有修改参数名称的查询,它适用于我。您是否提供了一个独特的参数名称(所以不是 ID,因为那已经是一个列名)? 我已经用使用longbinary 参数的(非)工作代码更新了我的问题。 @RenéNyffenegger VARCHAR 参数有一个完全不同的问题。从你的代码中删除它,它运行良好。 @RenéNyffenegger 顺便说一句,第二个错误又是数据类型定义错误。请参阅the docs,您应该使用CHAR 而不是VARCHAR。虽然同义词在某些地方有效,但它们往往表现得有些挑剔。

以上是关于如何将 GUID 分配给 VBA 中的 DAO 参数的主要内容,如果未能解决你的问题,请参考以下文章

将特定页码分配给 vba 中的 ms 访问报告

excel/VBA如何将数组的可变长度分配给整数变量

将命名范围值分配给变量(Excel VBA) - 新手

如何使用 VBA 将“整个”DAO 记录集插入到表中

VBA:无法将函数的返回值分配给变量[重复]

将对象引用分配给 Variant/Long