2010-09-27 10 views
4

Я просто сталкиваюсь с какой-то странной проблемой, когда я не могу получить значение параметра хранимой процедуры sql. Я столкнулся с этой проблемой почти 2 часа.Проблема при считывании параметра из хранимой процедуры с использованием C#

код очень прост

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; 

     } 

@total значение всегда нуль. Но когда я выполняю запрос, сгенерированный через профилировщик в анализаторе запросов, он возвращает штраф.

Наконец-то я нашел, что это связано с SQL-соединением.

Он отлично работает, если я закрыть соединение перед чтением затраченного Param

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

WT .., я просто не могу понять, почему он ведет себя так, как это .. кто-нибудь есть идеи?

ответ

7

Значения параметров возвращаются в конце потока TDS (так как вы можете изменить его в конце вашего запроса, после выбора данных). Вы должны быть уверены, чтобы потреблять все данные TDS (или, по крайней мере, привести буферы должны быть промыты, который Close() делает для вас), чтобы получить обновленные значения параметров, например:

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

То же самое относится к ошибкам SQL, возникшим в конце запроса. Вы также можете попробовать добавить using; это также может быть достаточно:

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