【问题标题】:How to pass NULL or empty strings to stored procedure input parameter with ADO and VB?如何使用 ADO 和 VB 将 NULL 或空字符串传递给存储过程输入参数?
【发布时间】: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,但没有任何运气!

【问题讨论】:

    标签: sql sql-server-2005 vb6 ado


    【解决方案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 作为参数值传递

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-16
        • 2011-01-22
        • 2021-12-29
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多