2010-05-31 3 views
0

Si je lance une procédure de magasin avec deux valeurs de paramètres (admin, admin) (paramètres: admin, admin) Je reçois le message suivant:en utilisant une procédure stockée pour la connexion en C#

Session_UID User_Group_Name  Sys_User_Name  
------------------------------------ -------------------------------------------------- - 
NULLAdministratorsNTMSAdmin 
No rows affected. 
(1 row(s) returned) 
@RETURN_VALUE = 0 
Finished running [dbo].[p_SYS_Login]. 

Pour obtenir le même message dans C# J'ai utilisé le code suivant:

string strConnection = Settings.Default.ConnectionString;   
using (SqlConnection conn = new SqlConnection(strConnection)) 
{ 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     SqlDataReader rdr = null; 
     cmd.Connection = conn; 
     cmd.CommandText = "p_SYS_Login"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     SqlParameter paramReturnValue = new SqlParameter(); 
     paramReturnValue.ParameterName = "@RETURN_VALUE"; 
     paramReturnValue.SqlDbType = SqlDbType.Int; 
     paramReturnValue.SourceColumn = null; 
     paramReturnValue.Direction = ParameterDirection.ReturnValue; 

     cmd.Parameters.Add(paramReturnValue); 

     cmd.Parameters.Add(paramGroupName); 
     cmd.Parameters.Add(paramUserName); 
     cmd.Parameters.AddWithValue("@Sys_Login", "admin"); 
     cmd.Parameters.AddWithValue("@Sys_Password", "admin"); 

     try 
     { 
      conn.Open(); 
      rdr = cmd.ExecuteReader(); 
      string test = (string)cmd.Parameters["@RETURN_VALUE"].Value; 
      while (rdr.Read()) 
      { 
       Console.WriteLine("test : " + rdr[0]); 
      } 
     } 
     catch (Exception ex) 
     { 
      string message = ex.Message; 
      string caption = "MAVIS Exception"; 
      MessageBoxButtons buttons = MessageBoxButtons.OK; 

      MessageBox.Show(
      message, 
      caption, 
      buttons, 
      MessageBoxIcon.Warning, 
      MessageBoxDefaultButton.Button1); 
     } 
     finally 
     { 
      cmd.Dispose(); 
      conn.Close(); 
     } 
    } 
} 

mais je ne reçois rien dans SqlDataReader rdr; Y a-t-il quelque chose qui me manque?

+0

Je n'ai pas essayé cela, mais je soupçonne que les classes 'DataReader' ne sont jamais remplies que par des ensembles de résultats *, et non par des valeurs renvoyées. –

+0

Pouvez-vous modifier la procédure stockée pour renvoyer la valeur de succès dans le jeu de résultats au lieu de la valeur de retour? Cela peut résoudre le problème. –

+0

... et avez-vous inspecté la valeur de la variable 'test'? Il est complètement ignoré dans le code après sa création et son affectation. –

Répondre

0

La valeur à la colonne 0 Session_UID est nul comme vous l'avez montré, donc je pense que cela peut être la raison pour laquelle vous ne recevez pas quoi que ce soit ici:

Console.WriteLine("test : " + rdr[0]); 

mais en aparté que vous pourriez obtenir exception de référence null.

encore pourquoi ne pas essayer:

Console.WriteLine("Return Value: " + test); 

while(rdr.Read()){ 
    Console.WriteLine("test: " + rdr[0]+" " + rdr[1]+ " " + rdr[1]); 
} 
0

Si vous voulez récupérer une valeur de retour, mais aucune ligne, vous ne devriez pas utiliser le .ExecuteReader() mais l'appel .ExecuteNonQuery():

try 
{ 
    conn.Open(); 
    object result = cmd.ExecuteNonQuery(); 

    string test = (string)cmd.Parameters["@RETURN_VALUE"].Value; 
    conn.Close(); 
} 
catch (Exception ex) 
{ 
    .... 
} 

de plus, puisque vous avez votre SqlCommand dans un bloc using...., il n'y a vraiment pas de point dans le bloc finally de votre essai - la déclaration using prendra soin de déjà .

Questions connexes