2010-09-27 22 views
4

Je viens de rencontrer un problème étrange où je ne peux pas extraire la procédure SQL stockée sur la valeur du paramètre. J'ai frappé avec ce problème pendant près de 2 heures.Problème lors de la lecture d'un paramètre à partir d'une procédure stockée à l'aide de C#

code

est très simple

using (var con = new SqlConnection(connectionString)) 
     { 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("sp_mgsearach", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      SqlParameter param1 = new SqlParameter("@SearchTerm", SqlDbType.VarChar); 
      param1.Value = searchTerm; 
      param1.Direction = ParameterDirection.Input; 
      cmd.Parameters.Add(param1); 
      SqlParameter param2 = new SqlParameter("@start", SqlDbType.Int); 
      param2.Value = start; 
      param2.Direction = ParameterDirection.Input; 
      cmd.Parameters.Add(param2); 
      SqlParameter param3 = new SqlParameter("@end", SqlDbType.Int); 
      param3.Value = end; 
      param3.Direction = ParameterDirection.Input; 
      cmd.Parameters.Add(param3); 
      SqlParameter param4 = new SqlParameter("@total", SqlDbType.Int); 
      param4.Direction = ParameterDirection.InputOutput; 
      param4.Value = 0; 
      cmd.Parameters.Add(param4); 


      var reader = cmd.ExecuteReader(); 
      LoadHits(reader);   
      if (lstHits.Count > 0) 
       total = Convert.ToInt32(cmd.Parameters["@total"].Value); 
      else 
       total = 0; 

     } 

la valeur @total est toujours nulle. Mais quand j'exécute la requête générée par profiler dans l'analyseur de requête, il renvoie bien.

Enfin, j'ai trouvé cela est dû à la connexion SQL.

Il fonctionne très bien si je fermer la connexion avant de lire le hors

param
  LoadHits(reader);   
      con.close() 
      if (lstHits.Count > 0) 
       total = Convert.ToInt32(cmd.Parameters["@total"].Value); 
      else 
       total = 0; 

WT .., je ne peux pas figure pourquoi il se comporte comme ça .. Quelqu'un at-il une idée?

Répondre

7

Les valeurs des paramètres sont retournées à la fin du flux TDS (puisque vous pouvez changer à la fin de votre requête, après avoir sélectionné les données). Vous devez être sûr de consommer tous les données TDS (ou au moins, provoquer des tampons à rincées, qui Close() fait pour vous) afin d'obtenir les valeurs des paramètres mis à jour, par exemple:

do { while(reader.Read() {} } 
while (reader.NextResult()); 

Le il en va de même pour les erreurs SQL soulevées tard dans la requête. Vous pouvez également essayer d'ajouter un using; cela peut également être suffisant:

using(var reader = cmd.ExecuteReader()) { 
    LoadHits(reader); 
}