2009-11-17 6 views
6

Ich habe eine gespeicherte Prozedur in SQL Server 2005 mit einem varchar Eingabeparameter definiert als:Wie NULL oder leere Zeichenfolgen an Eingabeparameter der gespeicherten Prozedur mit ADO und VB übergeben?

@Value varchar(24) = NULL 

in meiner VB6-Anwendung ich den Parameter mit einer ADO-Funktion einzustellen versuchen:

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

Wenn die Wert ich versuche, ist eine leere (Länge Null) Zeichenfolge übergeben, dann habe ich die folgende Fehlermeldung erhalten:

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

ich habe versucht, einen Nullwert anstelle des leeren st passieren Klingeln, aber dies führt zu unterschiedlichen Fehlern.

Wie kann ich leere Zeichenfolgen oder NULL-Werte an die gespeicherte Prozedur übergeben?

Ich habe schon viele Artikel gelesen und Foren (sogar meine Frage mehrmals gefunden), aber ohne die richtige Antwort.

Die bisherige Problemumgehung für die leeren Zeichenfolgen besteht darin, die Länge = 1 festzulegen oder die Zeichenfolge = "" (ein Leerzeichen) festzulegen. Aber das ist nicht wirklich nett und ich würde lieber NULL senden. Ich experimentierte auch mit dem Setzen von paramValue auf vbNull, Null, vbNullString oder setzen Sie prmParamVal.value = Leer ohne Glück!

Antwort

10

Ein schneller Test hier zeigt, dass NULL die Aufgabe erledigen sollte. Beispielcode verwendet I (auf eine einfache Form mit einer Taste und eine Textbox) zu testen:

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 

Und es nannte diese gespeicherte Prozedur:

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‘ ergab die VB-Wert für die Verwendung von Null (gemäß dem obigen Beispiel) und "NOT NULL" für vbNull. Wenn Null nicht für Sie funktioniert, dann kann ich nicht kommentieren, was falsch wäre ...!

In ähnlicher Weise sollten leere Zeichenfolgen genauso übergeben werden - eine leere Zeichenfolge, d. H. str = "" - die bewirkt, dass usp_Bob "EMPTY" zurückgibt. Sonst gibt es noch "NOT NULL AND NOT EMPTY" (wie erwartet).

Wenn Sie nicht NULL bekommen durchlaufen, dann eine andere Option ist eine leere Zeichenfolge auf NULL in der sproc zu werfen - das heißt

IF @param = '' 
    SET @param = NULL 

Beachten Sie, dass die Länge, die Sie durchlaufen sollte keine Rolle spielen zu viel. Es spiegelt die maximale Länge des in SQL Server definierten Parameters und nicht die Länge der Daten wider, die Sie durchlaufen.

+0

ah! ok, ich denke dein letzter Satz war wichtig! Mein Problem mit Null war immer die Länge von Null - was zu einem Fehler führt.Also wie in meiner db der Parameter als varchar (24) definiert ist, kann ich die Länge auf 24 setzen - ohne irgendwelche Nachteile? –

+1

Yep - als Sproc ist ein VARCHAR (24), Länge auf 24 einstellen. Es wird keine negativen Auswirkungen haben. –

2

ich immer DBNull.Value als Parameterwert übergeben, wenn null in eine Spalte eingefügt

4

wenn Sie eine leere Zeichenfolge auf einen Parameter uns AdBSTR statt adVarChar übergeben wollen. Es funktioniert für Strings länger als Null verkohlt zu

zB (wo OCMD das Kommando betreffende Objekt ist):

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