【问题标题】:Pass NULL parameter to SQL stored procedure using ADODB Connection object from Access VBA使用 Access VBA 中的 ADODB 连接对象将 NULL 参数传递给 SQL 存储过程
【发布时间】:2017-01-25 17:20:22
【问题描述】:

我知道可以调用 SQL Server 存储过程并在 Access VBA 中填充记录集,方法是使用 sp 类似 ADODB Connection 对象上的方法:

Dim cnnTest As New ADODB.Connection
Dim rsTest As New ADODB.Recordset

cnnTest.ConnectionString = strMyConnectionString
cnn.Open
cnn.procMyTestProcedure param1, param2, rsTest

这将调用存储过程procMyTestProcedure 传递参数param1param2,将结果返回到我的本地rsTest 记录集。这一切都很好,我多年来一直在使用这种技术。我现在遇到了一种情况,我需要能够将 NULL 作为参数之一传递,但到目前为止我尝试过的任何方法似乎都不起作用。我尝试传递一个空字符串、值 Null 和一个变体类型的局部变量设置为 Null。这些都没有奏效。请问有人知道该怎么做吗?存储过程中的参数类型为smalldatetime

【问题讨论】:

  • 你的变量在你的过程中可以为空吗?无论如何,hack 是在您的 proc 中您的 as 之后的这行代码,以传递一个空白字符串,但在 proc 中将其用作 null if @param='' set @param = NULL。所以基本上传入一个空白字符串将在proc内部变成一个NULL。
  • 是的,我确实考虑过这样做。我必须将存储过程中的参数重新定义为字符串'因为我不能将空字符串传递给日期时间参数。这将对在将其转换为日期时间之前验证非空字符串产生影响。我只是想知道是否有一种“正确”的方式来传递 null 并避免使用字符串的麻烦。如果不是,那么我可能会走很长一段路,并使用带有已定义 Parameter 对象(可以设置为 Null)的 Command 对象。
  • 啊,我明白你对 datetime 参数的意思了。我不知道该怎么做,因为我不使用 ADO,但也许这有助于stackoverflow.com/q/1747641/6167855
  • 是的,这就是 Command.Execute 路线,明确声明 Parameter 对象。我可能最终会这样做,但我更喜欢更紧凑的 Connection.{proc_name} 路线。只是看起来这可能不支持传递 Null 参数。

标签: vba ms-access adodb


【解决方案1】:

只需在 VBA 中使用 null。使用什么数据类型并不重要。

    Dim parm1 As ADODB.Parameter
    Set parm1 = New ADODB.Parameter
    parm1.Direction = adParamInput
    parm1.Name = "StatisticsDate"
    parm1.Type = adVarChar
    parm1.Size = 50
    If IsEmpty(wsCell) Then
        parm1.Value = Null   'there is no DBNull - sorry
    Else
        parm1.Value = CDec(wsCell)
    End If

【讨论】:

  • 谢谢,试过了,但它失败了 Compile error: Variable not defined 并突出显示 dbnull
  • @Skippy 我已经更新了答案。对于日期时间,我使用 0,但它在 sql 中的函数内部进行了翻译,这使其成为 sql 中的“默认”日期 - 31/12/1899 12:00:00。如果您需要日期时间逻辑,我会更新答案。
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2014-11-19
  • 2011-07-21
  • 2014-05-17
  • 2014-09-29
相关资源
最近更新 更多