Как передать NULL или пустые строки во входной параметр хранимой процедуры с ADO и VB? - PullRequest
8 голосов
/ 17 ноября 2009

У меня есть хранимая процедура в 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 = Empty без всякой удачи!

Ответы [ 3 ]

11 голосов
/ 17 ноября 2009

Быстрый тест показывает, что 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 вернул 'NULL' для использования значения VB Null (согласно приведенному выше примеру) и 'NOT NULL' для vbNull. Если Null не работает для вас, то я не могу комментировать, что может быть не так ...!

Аналогично, пустые строки должны передаваться именно так - пустая строка, то есть str = "" - что заставляет usp_Bob возвращать 'EMPTY'. Все остальное имеет возвращаемое значение «НЕ НУЛЬ И НЕ ПУСТО» (как и ожидалось).

Если вы не можете пропустить NULL, тогда другой вариант - привести пустую строку к NULL в sproc - т.е.,

IF @param = ''
    SET @param = NULL

Обратите внимание, что длина, которую вы проходите, не должна иметь большого значения. Это отражение максимальной длины параметра, определенной в SQL Server, а не длины данных, через которые вы проходите.

5 голосов
/ 07 февраля 2013

, если вы хотите передать пустую строку параметру, используя adBSTR вместо adVarChar. Работает и со строками длиннее нуля.

например (где oCmd - рассматриваемый объект команды):

oCmd.Parameters.Append oCmd.CreateParameter("@Parm", adBSTR, adParamInput, len(sParm), sParm)
2 голосов
/ 30 декабря 2009

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

...