Un rapido test qui mostra che NULL dovrebbe fare il lavoro. Codice di esempio che ho usato per testare (su un semplice modulo con un pulsante e una casella di testo):
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
E ha chiamato questo stored 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 ha restituito 'NULL' per l'utilizzo del valore VB Null
(come nell'esempio sopra) e 'NOT NULL' per vbNull
. Se Null
non funziona per te, quindi non posso commentare cosa potrebbe essere sbagliato...!
Allo stesso modo, le stringhe vuote dovrebbero essere passate proprio così:una stringa vuota, ad es. str = ""
-- che fa in modo che usp_Bob restituisca 'VUOTO'. Qualsiasi altra cosa fa restituire 'NON NULL E NON VUOTO' (come previsto).
Se non riesci a far passare NULL, un'altra opzione è eseguire il cast di una stringa vuota su NULL in sproc, ovvero
IF @param = ''
SET @param = NULL
Nota che la lunghezza che attraversi non dovrebbe importare troppo. È un riflesso della lunghezza massima del parametro definita in SQL Server anziché della lunghezza dei dati che stai attraversando.