¿Cómo pasar cadenas NULL o vacías al parámetro de input del procedimiento almacenado con ADO y VB?

Tengo un procedimiento almacenado en Sql Server 2005 con un parámetro de input varchar definido como:

@Value varchar(24) = NULL 

en mi aplicación VB6 bash configurar el parámetro con una function ADO:

 Set prmParamVal = cmdChkParam.CreateParameter(, adVarChar, adParamInput, Len(paramValue), paramValue) 

Si el valor que trato de pasar es una cadena vacía (longitud cero), entonces aparece el siguiente error:

ADODB.Connection error '800a0e7c' El object de parámetro está incorrectamente definido. Se proporcionó información incompleta o incompleta.

Traté de pasar un valor NULL en lugar de la cadena vacía, pero esto dio lugar a diferentes errores.

¿Cómo puedo pasar cadenas vacías o valores NULOS al procedimiento almacenado?

Ya leí muchos artículos y busqué foros (incluso encontré mi pregunta varias veces) pero sin la respuesta correcta.

La solución hasta ahora para las cadenas vacías es establecer la longitud = 1 o establecer la cadena = "" (un espacio en blanco). Pero eso no es realmente agradable y me gustaría enviar NULL. También experimenté con la configuration de paramValue a vbNull, Null, vbNullString o para establecer prmParamVal.value = ¡Vacío sin suerte!

Una testing rápida aquí muestra que NULL debe hacer el trabajo. Código de muestra que solía probar (en un formulario simple con un button y un textbox):

 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 = adCmdStonetworkingProc .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 

Y llamó a este process almacenado:

 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 devolvió 'NULL' para usar el valor de VB Null (según el ejemplo anterior) y 'NOT NULL' para vbNull . Si Null no funciona para ti, entonces no puedo comentar lo que podría estar mal …!

Del mismo modo, las cadenas vacías se deben pasar igual que eso – una cadena vacía, es decir, str = "" – que hace que usp_Bob devuelva 'VACÍO'. Cualquier otra cosa tiene que devolver 'NO NULO Y NO VACÍO' (como se esperaba).

Si no puede pasar NULL, entonces otra opción es convertir una cadena vacía a NULL en el sproc, es decir,

 IF @param = '' SET @param = NULL 

Tenga en count que la longitud que atraviesa no debería importar demasiado. Es un reflection de la longitud máxima del parámetro como se define en SQL Server en lugar de la longitud de los datos que está pasando.

si desea pasar una cadena en blanco a un parámetro, use adBSTR en lugar de adVarChar. Funciona para strings de más de cero caracteres también

ej. (donde oCmd es el object de command en cuestión):

 oCmd.Parameters.Append oCmd.CreateParameter ("@ Parm", adBSTR, adParamInput, len (sParm), sParm)

Siempre paso DBNULL.Value como valor del parámetro al insert null en una columna