如何使用 ADO 和 VB 将 NULL 或空字符串传递给存储过程输入参数?
Posted
技术标签:
【中文标题】如何使用 ADO 和 VB 将 NULL 或空字符串传递给存储过程输入参数?【英文标题】:How to pass NULL or empty strings to stored procedure input parameter with ADO and VB? 【发布时间】:2010-12-17 09:16:17 【问题描述】:我在 Sql Server 2005 中有一个存储过程,其 varchar 输入参数定义为:
@Value varchar(24) = NULL
在我的 VB6 应用程序中,我尝试使用 ADO 函数设置参数:
Set prmParamVal = cmdChkParam.CreateParameter(, adVarChar, adParamInput, Len(paramValue), paramValue)
如果我尝试传递的值是空(零长度)字符串,则会收到以下错误:
ADODB.Connection 错误“800a0e7c” 参数对象定义不正确。提供的信息不一致或不完整。
我尝试传递一个 NULL 值而不是空字符串,但这会导致不同的错误。
如何将空字符串或 NULL 值传递给存储过程?
我已经阅读了很多文章并搜索了论坛(甚至多次找到我的问题)但没有正确答案。
到目前为止,空字符串的解决方法是将长度设置为 1 或将字符串设置为“”(空格)。但这不是很好,我更愿意发送 NULL。我还尝试将 paramValue 设置为 vbNull、Null、vbNullString 或设置 prmParamVal.value = Empty,但没有任何运气!
【问题讨论】:
【参考方案1】:这里的快速测试表明 NULL 应该可以完成这项工作。我用来测试的示例代码(一个按钮和一个文本框的简单表单):
Private Sub Command1_Click()
Dim dbConn As ADODB.Connection
Dim dbComm As ADODB.Command
Dim dbRS As ADODB.Recordset
Set dbConn = New ADODB.Connection
With dbConn
.ConnectionString = "...REPLACE THIS ACCORDINGLY..."
.ConnectionTimeout = 10
.Open
End With
Set dbComm = New ADODB.Command
With dbComm
.ActiveConnection = dbConn
.CommandType = adCmdStoredProc
.CommandText = "usp_Bob"
.Parameters.Append .CreateParameter("b", adVarChar, adParamInput, 10, Null)
Set dbRS = .Execute
End With
Text1.Text = dbRS.Fields.Item(0).Value
dbRS.Close
dbConn.Close
End Sub
它称之为存储过程:
ALTER PROCEDURE usp_Bob
@b VARCHAR(10)
AS
IF @b IS NULL
SELECT 'NULL' AS '1'
ELSE
IF @b = ''
SELECT 'EMPTY' AS '1'
ELSE
SELECT 'NOT NULL AND NOT EMPTY' AS '1'
usp_Bob 使用 VB 值 Null
(根据上面的示例)返回“NULL”,而 vbNull
则返回“NOT NULL”。如果Null
对您不起作用,那么我无法评论可能出了什么问题...!
同样,空字符串也应该这样传递——一个空字符串,即str = ""
——这使得 usp_Bob 返回“EMPTY”。其他任何东西都返回“NOT NULL AND NOT EMPTY”(如预期的那样)。
如果您无法通过 NULL,那么另一种选择是在存储过程中将一个空字符串强制转换为 NULL -- 即,
IF @param = ''
SET @param = NULL
请注意,您通过的长度应该无关紧要。它反映了 SQL Server 中定义的参数的最大长度,而不是您传递的数据的长度。
【讨论】:
啊!好的,我认为你的最后一句话很重要!我对 null 的问题始终是长度为零 - 这会导致错误。因此,在我的数据库中,参数定义为 varchar(24) 我可以将长度设置为 24 - 没有任何缺点? 是的——因为你的sproc是一个VARCHAR(24),设置长度为24。它不会有任何不良影响。【参考方案2】:如果您想将空白字符串传递给参数我们 adBSTR 而不是 adVarChar。它也适用于长度超过零字符的字符串
例如(其中 oCmd 是有问题的命令对象):
oCmd.Parameters.Append oCmd.CreateParameter("@Parm", adBSTR, adParamInput, len(sParm), sParm)【讨论】:
【参考方案3】:在向列中插入 null 时,我总是将 DBNULL.Value 作为参数值传递
【讨论】:
以上是关于如何使用 ADO 和 VB 将 NULL 或空字符串传递给存储过程输入参数?的主要内容,如果未能解决你的问题,请参考以下文章
解决用 VB 中用 ADO 访问 数据库时 SQL 查询处理 Null 值的问题( 使用 iff(isNull(字段), 为空时的值,不为空时的值) 来处理)