【发布时间】: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 传递参数param1 和param2,将结果返回到我的本地rsTest 记录集。这一切都很好,我多年来一直在使用这种技术。我现在遇到了一种情况,我需要能够将 NULL 作为参数之一传递,但到目前为止我尝试过的任何方法似乎都不起作用。我尝试传递一个空字符串、值 Null 和一个变体类型的局部变量设置为 Null。这些都没有奏效。请问有人知道该怎么做吗?存储过程中的参数类型为smalldatetime。
【问题讨论】:
-
你的变量在你的过程中可以为空吗?无论如何,hack 是在您的 proc 中您的
as之后的这行代码,以传递一个空白字符串,但在 proc 中将其用作 nullif @param='' set @param = NULL。所以基本上传入一个空白字符串将在proc内部变成一个NULL。 -
是的,我确实考虑过这样做。我必须将存储过程中的参数重新定义为字符串'因为我不能将空字符串传递给日期时间参数。这将对在将其转换为日期时间之前验证非空字符串产生影响。我只是想知道是否有一种“正确”的方式来传递 null 并避免使用字符串的麻烦。如果不是,那么我可能会走很长一段路,并使用带有已定义 Parameter 对象(可以设置为 Null)的 Command 对象。
-
啊,我明白你对 datetime 参数的意思了。我不知道该怎么做,因为我不使用 ADO,但也许这有助于stackoverflow.com/q/1747641/6167855
-
是的,这就是 Command.Execute 路线,明确声明 Parameter 对象。我可能最终会这样做,但我更喜欢更紧凑的 Connection.{proc_name} 路线。只是看起来这可能不支持传递 Null 参数。