Как передать нулевые или пустые строки во входной параметр хранимой процедуры с помощью 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)

Я всегда передаю DBNULL.Значение в качестве значения параметра при вставке null в столбец