räp*_*äph 8 sql vb6 sql-server-2005 ado
我在Sql Server 2005中有一个存储过程,其varchar输入参数定义为:
@Value varchar(24) = NULL
Run Code Online (Sandbox Code Playgroud)
在我的VB6应用程序中,我尝试使用ADO函数设置参数:
Set prmParamVal = cmdChkParam.CreateParameter(, adVarChar, adParamInput, Len(paramValue), paramValue)
Run Code Online (Sandbox Code Playgroud)
如果我尝试传递的值是一个空(零长度)字符串,那么我得到以下错误:
ADODB.Connection错误'800a0e7c'参数对象未正确定义.提供的信息不一致或不完整.
我试图传递NULL值而不是空字符串,但这会导致不同的错误.
如何将空字符串或NULL值传递给存储过程?
我已经阅读了很多文章和搜索论坛(甚至多次发现我的问题),但没有正确的答案.
到目前为止空字符串的解决方法是设置length = 1或设置string =""(空格).但那不是很好,我倾向于发送NULL.我还尝试将paramValue设置为vbNull,Null,vbNullString或者设置prmParamVal.value = Empty而没有任何运气!
Chr*_*s J 11
这里的快速测试表明,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
Run Code Online (Sandbox Code Playgroud)
它称之为存储过程:
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'
Run Code Online (Sandbox Code Playgroud)
usp_Bob返回'NULL'以使用VB值Null(根据上面的示例),'NOT NULL'表示vbNull.如果Null不适合你,那么我无法评论可能出现的问题......!
类似地,空字符串应该被传递 - 一个空字符串,即str = ""- 这使得usp_Bob返回'EMPTY'.其他任何东西都返回'NOT NULL AND NOT EMPTY'(如预期的那样).
如果你不能通过NULL传递,那么另一个选择是在sproc中将空字符串转换为NULL - 即,
IF @param = ''
SET @param = NULL
Run Code Online (Sandbox Code Playgroud)
请注意,您通过的长度不应该太重要.它反映了SQL Server中定义的参数的最大长度,而不是您传递的数据的长度.
如果要将空白字符串传递给参数us adBSTR而不是adVarChar.它适用于长于零字符的字符串
例如(其中oCmd是有问题的命令对象):
oCmd.Parameters.Append oCmd.CreateParameter("@Parm", adBSTR, adParamInput, len(sParm), sParm)