Как передать нулевые или пустые строки во входной параметр хранимой процедуры с помощью ADO и VB?
у меня есть хранимая процедура в Sql Server 2005 с входным параметром varchar, определенным как:
@Value varchar(24) = NULL
в моем приложении VB6 я пытаюсь установить параметр с помощью функции ADO:
Set prmParamVal = cmdChkParam.CreateParameter(, adVarChar, adParamInput, Len(paramValue), paramValue)
Если значение, которое я пытаюсь передать, является пустой строкой (нулевой длины), то я получаю следующую ошибку:
объект adodb.800a0e7c ошибка подключения'' Объект параметра определен неправильно. Непоследовательная или неполная информация предоставлена.
Я попытался передать значение NULL вместо пустой строки, но это привело к различным ошибкам.
Как передать пустые строки или значения NULL в хранимую процедуру?
Я уже прочитал много статей и искал форумы (даже нашел свой вопрос несколько раз), но без правильного ответа.
обходной путь до сих пор для пустых строк-установить длину = 1 или установить строку = "" (пустое пространство). Но это не очень приятно, и я бы предпочел отправить NULL. Я также экспериментировал с установкой paramValue в vbNull, Null, vbNullString или установить prmParamVal.value = пустой без везения!
3 ответов
быстрый тест здесь показывает, что 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
и он назвал это сохраненным proc:
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 вернул "NULL" для использования значения VB Null
(согласно приведенному выше образцу) и "не NULL" для vbNull
. Если Null
не работает для вас, тогда я не могу прокомментировать, что может быть неправильно...!
аналогично, пустые строки должны передаваться так же, как это-пустая строка, то есть str = ""
-- что делает usp_Bob возвращаемым "пустым". Все остальное возвращает "NOT NULL AND not EMPTY" (как и ожидалось).
если вы не можете получить NULL, то другой вариант-привести пустую строку к NULL в sproc -- т. е.
IF @param = ''
SET @param = NULL
обратите внимание, что длина, через которую вы проходите, не должна иметь большого значения. Это отражение максимальной длины параметра, определенного в SQL Server, а не длины данных, которые вы проходя через.
Если вы хотите передать пустую строку параметру us adBSTR вместо adVarChar. Он работает для строк длиннее нулевых символов тоже
ег (где oCmd-это команда объект):
oCmd.Parameters.Append oCmd.CreateParameter("@Parm", adBSTR, adParamInput, len(sParm), sParm)