Не получать результаты из базы данных - PullRequest
2 голосов
/ 27 сентября 2019

В моем коде C # я пытаюсь открыть соединение с базой данных SQL Server и получить счетчик.Я скопировал код (за исключением самого запроса) из другого написанного мной приложения, которое работает нормально.Я выполнил запрос - и версию, которую я построил, и запрос, который строит код (я использую переменные) - и они оба работают нормально, возвращая одинаковое количество.Я просто ничего не получаю обратно.

Я установил контрольные точки и проверил соединение и запрос, и это то, чего я ожидаю.Когда я погуглил это, я просто получил результаты для людей, у которых совершенно другие проблемы, поэтому я в тупике.Я не знаю, почему я ничего не получаю обратно.Где ошибка?

SqlConnection RRconnection = new SqlConnection();
RRconnection.ConnectionString = "Data Source=;Initial Catalog=;User id=;Password=";

RRconnection.Open();
string ridQuery = "SELECT COUNT (t.RxTimeStamp) FROM...";

SqlCommand query = new SqlCommand(ridQuery, RRconnection);

SqlDataReader data = query.ExecuteReader();

if (data.Read())
    transcount = Convert.ToInt32(data.GetValue(0));

В случае, если вышеприведенный абзац не был ясен, я ожидаю, что запрос вернет счетчик 1592064 (для конкретного экземпляра, который я тестирую), и вместо этого естьнет данных в data.

Вероятно, не связано, но мой запрос включает три внутренних объединения.Это первый раз, когда я сделал так много, так что, может быть, это может быть проблемой?Кроме случаев, когда это вызывало проблему, это не сработало бы, когда я запускаю запрос?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

пытались ли вы использовать SqlCommand.ExecuteScalar Method

SqlCommand query = new SqlCommand(ridQuery, RRconnection);
Int32 transcount = (Int32) query.ExecuteScalar();

Обновление

Я не уверен, почему ваш запрос не работал,возможно попробуйте дать столбцу count псевдоним :

string ridQuery = "SELECT COUNT (t.RxTimeStamp) AS RxCount FROM ...";
0 голосов
/ 27 сентября 2019

Лучше всего использовать ExecuteScalar, если запрос возвращает одно значение.

ExecuteScalar; возвращает значение объекта, поэтому должно быть Convert для правильного типа

int totalCount = Convert.ToInt32(cmd.ExecuteScalar());

Итак, на ваш вопрос

Это ExecuteReader, не используйте для получения Select Count результата, но проблем нетэтот кодВы можете увидеть общее значение счетчика для этого кода.

Примечание : Объект SqlDataReader представляет собой потоковый и прямой запрос результатов запроса из источника данных.Метод Read обрабатывает только одну строку в памяти, а затем перезаписывает старую запись при повторении следующей строки.

ExecureReader; В вашем случае читатель: первая строка и первый столбецзаполненный результат запроса, другие строки и столбец установлены в ноль.

if(reader.Read())
{
   int totalRows = Convert.ToInt32(reader.GetValue(0));  //convert returned value        
}

Примечание: используйте имя столбца и используйте метод преобразования специального типа для чтения - мой лучший выбор.

reader.GetInt32(reader.GetOrdinal("TotalCount"))

Совет,

  • Не использовать ExecuteReader для чтения для одного значения
  • Используйте ExecuteScalar, а затем приведите результат к правильному типу
  • Используйте IDisposible объекты (Connection, Command, Reader) внутри для using кода блога.используя закрытие блока и уничтожение текущего объекта.
  • Вы не должны читать using код блога по значению индекса столбца
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...