2011-03-23 3 views
6

J'essaie d'obtenir le jeu de résultats et la valeur de retour d'un proc stocké sur le serveur SQL 2008. Quand je lance le proc dans le studio de gestion sql, j'obtiens le jeu de résultats et la valeur de retour.Valeur renvoyée à l'aide de SqlCommand

Cependant, lorsque j'essaie d'obtenir la valeur en C# 4.0, la valeur du paramètre est nulle. Voici mon code C#.

using (ConnectionManager<SqlConnection> cn = ConnectionManager<SqlConnection>.GetManager(CultureInfo.CurrentCulture.Name)) 
{ 
    using (SqlCommand cm = cn.Connection.CreateCommand()) 
    { 
     cm.CommandText = "Name of proc here"; 
     cm.CommandType = CommandType.StoredProcedure; 

     cm.Parameters.AddWithValue("@ApplicationId", ApplicationId);           
     cm.Parameters.AddWithValue("@Index", Index); 

     if (PageSize > 0) 
      cm.Parameters.AddWithValue("@PageSize", PageSize); 

     cm.Parameters.Add("@ReturnValue", SqlDbType.Int); 
     cm.Parameters["@ReturnValue"].Direction = ParameterDirection.ReturnValue; 

     using (IDataReader dr = cm.ExecuteReader()) 
     { 
      SafeDataReader sdr = new SafeDataReader(dr); 
      while (sdr.Read()) 
      { 
       UserApplicationEntity uae = new UserApplicationEntity(); 
       uae.UserId = sdr.GetGuid("UserId"); 
       uae.ExternalId = sdr.GetString("ExternalId"); 
       Result.Value.Collection.Add(uae); 
      } 

      Result.Value.TotalResults = (int)cm.Parameters["@ReturnValue"].Value; 
     } 
    } 
} 

La dernière ligne où j'appelle Result.Value.TotalResults = (int) cm.Parameters [ "@ de ReturnValue"] Valeur; est où la valeur est nulle. Chaque tutoriel ou post que j'ai trouvé, je semble faire tout correctement. À ce stade, je pense que je manque juste quelque chose de petit et que j'ai besoin d'un autre ensemble d'yeux. J'ai également essayé de définir le paramètre de retour avant tous les autres comme un message que j'ai trouvé sur le site MS a dit que je devais, mais peu importe où il est, il renvoie null.

Répondre

7

La valeur de retour est envoyée en dernier dans la réponse de la base de données, vous devez donc lire complètement le jeu de résultats avant de pouvoir accéder à la valeur de retour.

Que fait la classe SafeDataReader? Est-il possible que cela empêche la lecture de l'ensemble des résultats?

Essayez de déplacer le code qui lit la valeur renvoyée en dehors du bloc using pour le lecteur de données. Cela peut aider à faire avancer la réponse au-delà du jeu de résultats afin que la valeur de retour soit disponible.

+0

A dû le déplacer en dehors du bloc using pour l'obtenir pour fermer le lecteur. Jamais je n'aurais pensé que c'était le cas. Merci! – phreak3eb

Questions connexes