2009-11-17 5 views
6

J'ai une procédure stockée dans Sql Server 2005 avec un paramètre d'entrée varchar défini comme:Comment passer des chaînes vides ou NULL à un paramètre d'entrée de procédure stockée avec ADO et VB?

@Value varchar(24) = NULL 

dans mon application VB6 je tente de régler le paramètre avec une fonction ADO:

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

Si la valeur que je tente de passer est une chaîne vide (longueur zéro), je reçois l'erreur suivante:

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

J'ai essayé de passer une valeur NULL au lieu du vide st anneau, mais cela conduit à des erreurs différentes.

Comment puis-je transmettre des chaînes vides ou des valeurs NULL à la procédure stockée?

J'ai déjà lu beaucoup d'articles et de forums recherchés (j'ai même trouvé ma question plusieurs fois) mais sans la bonne réponse.

La solution de contournement utilisée pour les chaînes vides consiste à définir la longueur = 1 ou à définir la chaîne = "" (espace vide). Mais ce n'est pas vraiment sympa et je préférerais envoyer NULL. J'ai également expérimenté avec paramValue à vbNull, Null, vbNullString ou pour mettre prmParamVal.value = Empty sans n'importe quelle chance!

Répondre

10

Un test rapide montre ici que NULL devrait faire le travail. Exemple de code I utilisé pour tester (sur un formulaire simple avec un bouton et une zone de texte):

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 

Et il a appelé ce proc stocké:

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 retourne 'NULL' pour utiliser la valeur VB Null (comme dans l'exemple ci-dessus), et 'NOT NULL' pour vbNull. Si Null ne fonctionne pas pour vous, alors je ne peux pas commenter ce qui pourrait être faux ...!

De même, les chaînes vides doivent être passées de la même manière que - une chaîne vide, c'est-à-dire str = "" - ce qui oblige usp_Bob à retourner 'EMPTY'. Quoi que ce soit d'autre a le retour 'NON NULL ET NON VIDE' (comme prévu).

Si vous ne pouvez pas obtenir NULL passé à travers, puis une autre option est de lancer une chaîne vide à NULL dans la sproc - à savoir,

IF @param = '' 
    SET @param = NULL 

Notez que la longueur que vous passez à travers la matière ne doit pas trop. C'est un reflet de la longueur maximale du paramètre tel que défini dans SQL Server plutôt que de la longueur des données que vous traversez.

+0

ah! ok, je pense que ta dernière phrase était importante! Mon problème avec null était toujours la longueur de zéro - ce qui conduit à une erreur.Donc comme dans ma base de données le paramètre est défini comme varchar (24), je peux définir la longueur à 24 - sans aucun inconvénient? –

+1

Oui - puisque votre sproc est un VARCHAR (24), réglez la longueur sur 24. Il n'y aura aucun effet néfaste. –

2

Je passe toujours DBNull.Value comme la valeur du paramètre lors de l'insertion nulle dans une colonne

4

si vous voulez passer une chaîne vide à un paramètre nous adBSTR au lieu de adVarChar. Il fonctionne pour les chaînes plus que zéro carbonise trop

par exemple (où DGCO est l'objet de commande en question):

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