小编典典

如何使用ADO和VB将NULL或空字符串传递给存储过程输入参数?

sql

我在Sql Server 2005中有一个存储过程,其varchar输入参数定义为:

@Value varchar(24) = NULL

在我的VB6应用程序中,我尝试使用ADO函数设置参数:

Set prmParamVal = cmdChkParam.CreateParameter(, adVarChar, adParamInput, Len(paramValue), paramValue)

如果我尝试传递的值是一个空(零长度)字符串,则出现以下错误:

ADODB.Connection错误‘800a0e7c’参数对象定义不正确。提供的信息不一致或不完整。

我尝试传递NULL值而不是空字符串,但这会导致不同的错误。

如何将空字符串或NULL值传递给存储过程?

我已经阅读了很多文章并搜索了论坛(甚至多次发现我的问题),但没有正确的答案。

到目前为止,对于空字符串的解决方法是将length设置为1或将string设置为“”(空格)。但这并不是很好,我希望发送NULL。我还尝试将paramValue设置为vbNull,Null,vbNullString或将prmParamVal.value
=空设置为没有任何运气!


阅读 178

收藏
2021-03-23

共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(根据上面的示例),使用VB值返回“ NOT NULL”
vbNull。如果Null对您不起作用,那么我无法对可能出问题的地方发表评论……!

类似地,应该以空字符串的形式传递空字符串(即空字符串),即str = ""usp_Bob返回“ EMPTY”。其他任何东西都会返回“ NOT NULLAND NOT EMPTY”(如预期)。

如果您无法传递NULL,则另一种选择是在sproc中将一个空字符串转换为NULL,即

IF @param = ''
    SET @param = NULL

请注意,您经过的长度不会太大。这反映了SQL Server中定义的参数的最大长度,而不是所传递的数据的长度。

2021-03-23