如何使用 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(字段), 为空时的值,不为空时的值) 来处理)

请教vb如何连接oracle数据库

VB.NET是如何使用ADO让存储过程返回数据表中的值呢?求解!

VB6 ADO 连接 - 如何检查是不是在事务中?

vb的ADO控件如何连接操作MYSQL数据库啊

使用 ADO.NET 命令向 VB 中的 SQL 表添加列