2009-11-17 10 views
6

Ho una stored procedure in SQL Server 2005 con un parametro di ingresso varchar definito come:Come passare NULL o stringhe vuote al parametro di input della stored procedure con ADO e VB?

@Value varchar(24) = NULL 

nella mia applicazione VB6 cerco di impostare il parametro di una funzione di ADO:

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

Se il valore provo a passare è (lunghezza zero) stringa vuota, allora ottengo il seguente errore:

ADODB.Connection error '800a0e7c' Parameter object is improperly defined. Inconsistent or incomplete information was provided.

ho cercato di passare un valore NULL invece del vuoto st squillo, ma questo porta a diversi errori.

Come posso passare stringhe vuote o valori NULL alla stored procedure?

Ho già letto molti articoli e cercato forum (ho trovato anche la mia domanda diverse volte) ma senza la risposta giusta.

La soluzione finora per le stringhe vuote è impostare la lunghezza = 1 o impostare la stringa = "" (uno spazio vuoto). Ma questo non è davvero bello e mi piacerebbe inviare NULL. Ho anche sperimentato l'impostazione di paramValue su vbNull, Null, vbNullString o per impostare prmParamVal.value = Empty senza fortuna!

risposta

10

Un test rapido qui dimostra 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 

Ed chiamò questa stored procedure:

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 restituito 'NULL' per l'utilizzo del valore di VB Null (come nell'esempio sopra) e 'NOT NULL' per vbNull. Se Null non funziona per te, allora non posso commentare ciò che potrebbe essere sbagliato ...!

Analogamente, le stringhe vuote devono essere passate proprio come questo: una stringa vuota, ovvero str = "", che rende usp_Bob restituire 'EMPTY'. Qualcos'altro ha restituito 'NON NULL E NON VUOTO' (come previsto).

Se non è possibile ottenere NULL passato attraverso, poi un'altra opzione è quella di lanciare una stringa vuota a NULL nel sproc - vale a dire,

IF @param = '' 
    SET @param = NULL 

Nota che la lunghezza si passa attraverso dovrebbe non importa troppo. È un riflesso della lunghezza massima del parametro definita in SQL Server piuttosto che della lunghezza dei dati che stai passando.

+0

ah! ok, penso che la tua ultima frase sia stata importante! Il mio problema con null era sempre la lunghezza di zero - che porta a un errore.Così come nel mio db il parametro è definito come varchar (24) posso impostare la lunghezza a 24 - senza svantaggi? –

+1

Sì, poiché il tuo sproc è un VARCHAR (24), imposta la lunghezza su 24. Non avrà alcun effetto negativo. –

2

ho sempre passare DBNull.Value come valore del parametro durante l'inserimento Null in una colonna

4

se si vuole passare una stringa in bianco ad un parametro di noi adBSTR invece di adVarChar. Funziona per le stringhe più di zero carbonizza troppo

ad esempio (dove OCMD è l'oggetto comando in questione):

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