我在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 =空设置为没有任何运气!
这里的快速测试表明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对您不起作用,那么我无法对可能出问题的地方发表评论……!
Null
vbNull
类似地,应该以空字符串的形式传递空字符串(即空字符串),即str = ""usp_Bob返回“ EMPTY”。其他任何东西都会返回“ NOT NULLAND NOT EMPTY”(如预期)。
str = ""
如果您无法传递NULL,则另一种选择是在sproc中将一个空字符串转换为NULL,即
IF @param = '' SET @param = NULL
请注意,您经过的长度不会太大。这反映了SQL Server中定义的参数的最大长度,而不是所传递的数据的长度。