Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment passer des chaînes NULL ou vides au paramètre d'entrée de la procédure stockée avec ADO et VB ?

Un test rapide ici montre que NULL devrait faire l'affaire. Exemple de code que j'ai 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é cette procédure stockée :

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 a renvoyé 'NULL' pour l'utilisation de la valeur VB Null (selon 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 ne pas fonctionner... !

De même, les chaînes vides doivent être transmises telles quelles - une chaîne vide, c'est-à-dire str = "" -- ce qui fait que usp_Bob retourne 'EMPTY'. Tout le reste renvoie 'NOT NULL AND NOT EMPTY' (comme prévu).

Si vous ne pouvez pas faire passer NULL, une autre option consiste à convertir une chaîne vide en NULL dans le sproc - c'est-à-dire

IF @param = ''
    SET @param = NULL

Notez que la longueur que vous traversez ne devrait pas trop importer. Cela reflète la longueur maximale du paramètre telle que définie dans SQL Server plutôt que la longueur des données que vous traversez.