2011-02-09 3 views
3

Рассмотрим следующий код:ExecuteReader не возвращает никаких результатов, когда осмотрела запрос делает

 StringBuilder textResults = new StringBuilder(); 
     using(SqlConnection connection = new SqlConnection(GetEntityConnectionString())) 
     { 
      connection.Open(); 
      m.Connection = connection; 
      SqlDataReader results = m.ExecuteReader(); 
      while (results.Read()) 
      { 
       textResults.Append(String.Format("{0}", results[0])); 
      } 
     } 

Я Activity Monitor в Sql Server Mgmt Studio, базы данных, чтобы проверить точный запрос, который в настоящее время отправлены. Затем я скопировал этот текст запроса в окно редактора запросов в SSMS, и запрос вернул ожидаемые результаты. Однако SqlDataReader results всегда пуст, указав «перечисление не получило результатов».

Мое подозрение в том, что каким-то образом результаты возвращаются неправильно, что заставляет меня думать, что что-то не так с кодом выше, а не с самим запросом.

Есть ли что-нибудь, что может вызвать это в коде выше? Или что-то, что я забыл?

EDIT:

Вот запрос, как указано SQLCommand объекта:

SELECT DISTINCT StandardId,Number 
FROM vStandardsAndRequirements 
WHERE StandardId IN ('@param1','@param2','@param3') 
ORDER BY StandardId 

Вот запрос, как он появляется в Activity Monitor:

SELECT DISTINCT StandardId,Number 
FROM vStandardsAndRequirements 
WHERE StandardId IN ('ABC-001-0','ABC-001-0.1','ABC-001-0') 
ORDER BY StandardId 

Запрос работает против одного представления.

Когда я запустил второй запрос к базе данных, он вернул 3 строки.

SqlDataReader указывает 0 строк.

+0

Возможно, вам стоит показать нам запрос и то, что выглядят таблицы, довольно сложно сказать, что не получается без запроса/DDL. Код выше в порядке. – Matten

+0

Спасибо, сделаю. – morganpdx

ответ

1

попробуйте использовать адаптер Sqldata вместо sqldatreader.

StringBuilder textResults = new StringBuilder(); 

     using (var conn = new SqlConnection(GetEntityConnectionString()))) 
     { 
      using (
       var cmd = new SqlCommand(
      "SELECT DISTINCT StandardId,Number" + 
       "FROM vStandardsAndRequirements " + 
      "WHERE StandardId IN (@param1,@param2,@param3)" + 
      "ORDER BY StandardIdl" 

     , conn)) 
      { 

       var dSet = new DataSet(); 
       var dt = new Datatable(); 

       var da = new SqlDataAdapter(cmd); 

       cmd.Parameters.Add("@param1", SqlDbType.VarChar, 50).Value = "ABC-001-0"; 
     cmd.Parameters.Add("@param2", SqlDbType.VarChar, 50).Value = "ABC-001-0.1"; 
       cmd.Parameters.Add("@param3", SqlDbType.VarChar, 50).Value = "ABC-001-0"; 
       try 
       { 

        da.Fill(dSet); 

     dt = dSet.Tables[0]; 

     foreach(Datarow a in dt.Rows) 
     { 

      textResults.Append(a["StandardId"].tostring()).AppendLine(); 


     } 

     Messabox.Show(textResults.tostring); 

       } 
       catch (SqlException) 
       { 
        throw; 
       } 

     finally 
       { 
        if (conn.State == ConnectionState.Open) conn.Close(); 
       } 

      } 
     } 

С уважением.

2

Вы уверены, что это

WHERE StandardId IN ('@param1','@param2','@param3') 

вместо этого?

WHERE StandardId IN (@param1,@param2,@param3) 

Параметры не должны указываться, а не в объекте SQLCommand.

+0

Я попробовал это и получил 1 строку назад. Однако I * должен * получать три строки.Поэтому я думаю, что это может быть частью проблемы, но не для всех ... – morganpdx

+0

@morgan Почему вы думаете, что вам нужно получать 3 строки? Если StandardId уникален, я бы подумал, что 2 строки max, заданные 'WHERE StandardId IN ('ABC-001-0', 'ABC-001-0.1', 'ABC-001-0')' param1 и param3 одинаковы. – RichardTheKiwi

+0

@morgan - textResults также добавляет все результаты вместе без каких-либо запятых, труб или другого разделителя. Все, что вы получаете, это одна строка, поэтому трудно понять, есть ли несколько результатов. – RichardTheKiwi

0

Проверьте строку подключения и убедитесь, что вы не подключаетесь в качестве экземпляра пользователя.

http://msdn.microsoft.com/en-us/library/ms254504.aspx

+0

Проверено - в строке подключения нет «Пользовательского экземпляра», и я не использую Sql Server Express - это противоречит экземпляру полного SQL-сервера. – morganpdx

0

Очень приятно поведение я наблюдал

Я искал ошибки в коде:

... dr = command.ExecuteReader() ... If dr.Read Then ... 

и обнаружили, что 'dr.Read' работает отлично, но ... когда я наводил курсор на «dr», чтобы искать данные, возвращаемые значения исчезли!

Смежные вопросы