2017-09-18 2 views
1

J'ai une procédure stockée dans SQL Server qui renvoie deux valeurs. Lorsqu'il est appelé de QA avec le code SQL suivant:Renvoie des valeurs de la procédure stockée SQL Server

exec TWEEPush_ValidateCO @CoFilter='CO IN(''1502'',''Mike'',''Clarkson'')', @TDate='09/18/`2017' 

fonctionne comme prévu en retournant deux valeurs:

@TempCOID @TempDate 
1502  09/10/2017 

La procédure stockée fait un travail et se termine par les deux valeurs étant fixées à la non nulle valeurs, avec la procédure stockée se terminant par:

SELECT 
    @TempCOID AS N'@TempCOID', 
    @TempDate AS N'@TempDate' 

Dans VB.net (Visual Basic, pas C), j'ai essayé de nombreuses approches différentes pour obtenir les résultats, mais ont pas eu de chance. Soit je reçois une erreur indiquant que le nom ne param existe pas, ou il finit par retourner des valeurs vides (tout est codé pour éviter les valeurs NULL dans les données de retour)

Dim sConnectStr As String = GetSQLConnectionString() 

Try 
    Using Connection As New SqlConnection(sConnectStr) 
     Connection.Open() 

     Dim Command As New SqlCommand("dbo.TWEEPush_ValidateCO", Connection) 
     Command.CommandType = CommandType.StoredProcedure 
     Command.Parameters.AddWithValue("@CoFilter", Filter) 
     Command.Parameters.AddWithValue("@TDate", Now()) 

     Dim PramCOIDRet As New SqlParameter 
     PramCOIDRet.ParameterName = "@TempCOID" 
     PramCOIDRet.SqlDbType = SqlDbType.NVarChar 
     PramCOIDRet.Size = 30 
     PramCOIDRet.Direction = ParameterDirection.Output 

     Dim PramDateRet As New SqlParameter 
     PramDateRet.ParameterName = "@TempDate" 
     PramDateRet.SqlDbType = SqlDbType.NVarChar 
     PramDateRet.Size = 30 
     PramDateRet.Direction = ParameterDirection.Output 

     Command.Parameters.Add(PramCOIDRet) 
     Command.Parameters.Add(PramDateRet) 

     Command.ExecuteNonQuery() 

     Dim COID as string = Command.Parameters("@TempCOID").Value 
     Dim CoDate as Date = CDate(Command.Parameters("@TempDate").Value) 
    End Using 
Catch ex As Exception 
End Try 

Peu importe ce code que je l'ai essayé, le le code ne renvoie jamais les données comme prévu. Qu'est-ce que je fais de mal? Est-ce que quelqu'un peut nous éclairer s'il vous plaît?

+2

Malgré les noms de colonnes plutôt étranges utilisés, ces "paramètres" ne sont pas réellement des paramètres. Vous obtiendrez simplement un résultat normal avec une seule ligne, avec les valeurs dans cela. Vous devriez utiliser ExecuteReader plutôt qu'ExecuteNonQuery (car il s'agit en fait d'une requête, c'est ce que fait SELECT), puis récupérer les résultats à partir de là. –

+0

Que faire si vous vérifiez 'PramDateRet.Value' et' PramCOIDRet.Value' – JamieD77

+1

Cette procédure ressemble étrangement à la réception d'une chaîne de caractères et à son exécution en tant que SQL dynamique. C'est très effrayant et est très probablement vulnérable à l'injection de sql. –

Répondre

1

Vous ne nous montrent votre code de procédure stockée - mais le plus probable, il y a quelque chose comme ceci:

CREATE PROCEDURE dbo.dbo.TWEEPush_ValidateCO 
    @CoFilter VARCHAR(100), -- just guessing here! 
    @TDate DATE    -- again - just guessing 
AS 
BEGIN 
    DECLARE @TempCOID INT; 
    DECLARE @TempDate DATE; 

    -- do some calculations here that define @TempCOID and @TempDate 
    -- this is just for demo purposes - I'm sure your calculation is a bit 
    -- more complex and involved... 
    SET @TempCOID = 1502; 
    SET @TempDate = '20170910'; 

    -- return the values in a SELECT statement 
    SELECT 
     @TempCOID AS N'@TempCOID', 
     @TempDate AS N'@TempDate' 
END 

Dans ce cas, vous êtes retourner un résultat SET - pas deux paramètres!

Vous devez obtenir vos valeurs comme ceci:

static void Main(string[] args) 
{ 
    string connectionString = ConfigurationManager.ConnectionStrings["YourConnectionString"].ConnectionString; 

    int tempCoid; 
    DateTime tempDate; 

    using (SqlConnection conn = new SqlConnection(connectionString)) 
    using (SqlCommand cmd = new SqlCommand("dbo.dbo.TWEEPush_ValidateCO", conn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.AddWithValue("@CoFilter", Filter); 
     cmd.Parameters.AddWithValue("@TDate", DateTime.Now); 

     conn.Open(); 

     using (var rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       tempCoid = rdr.GetFieldValue<int>(0); 
       tempDate = rdr.GetFieldValue<DateTime>(1); 
      } 
     } 

     conn.Close(); 
    } 
} 

(je suis sûr que vous avez l'idée - et vous pouvez facilement traduire en VB.NET, aussi).

Espérons que ça aide!

Marc

+0

Marc; c'est aussi proche que c'est dans le code et le proc SQL. Malheureusement, je ne reçois toujours pas de valeurs.Je n'ai pas eu le temps aujourd'hui de travailler sur ce qui sera probablement ma faute de codage (c'est à dire pas votre exemple). Dans tous les cas, les valeurs retournées par le SP ne sont jamais et ne peuvent jamais être nulles. Ils peuvent être vides, mais jamais nuls. –

+0

@marc_s, Désolé pour poser la question ci-dessous ici. Je n'ai aucune idée de la façon de gérer le scénario. Veuillez jeter un coup d'oeil. https://stackoverflow.com/questions/46285924/which-kind-of-table-design-best-suitable-for-normalization-in-sql-server. S'il vous plaît me suggérer la solution. – RGS

+1

@RGS: Je n'ai vraiment rien de plus à dire au-delà de ce qui a déjà été dit dans ces commentaires –