| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > Получить количество |
| Автор: FelikZ 2.7.2007, 13:01 | ||
есть такого типа запрос:
Конечно можно сделать еще один запрос с "count" но может можно как-то без этого обойтись? Спасибо! |
| Автор: emmanuil 2.7.2007, 13:18 |
| датаРидером не узнаешь, если только после этого кода [code=csharp] int i = 0; while (sdr.Read()) { i++; } [\code] Либо загоняй результат в таблицу, либо делай запрос Добавлено через 1 минуту и 45 секунд Или в том же запосе возврати вместе со всеми прочими строками еще и количество строк |
| Автор: dio30 2.7.2007, 13:20 |
| sdr.RecordsAffected() не пробовал? |
| Автор: emmanuil 2.7.2007, 13:41 | ||
| RowAffected совсем не пойдет! The number of rows changed, inserted, or deleted; 0 if no rows were affected or the statement failed; and -1 for SELECT statements. Ридером не узнать никак, ИМХО, только так как я написал выше! Добавлено через 4 минуты и 31 секунду вот самый простой sql пример
Добавлено через 6 минут и 18 секунд вместо ридера используй адаптер и таблицу |
| Автор: emmanuil 2.7.2007, 13:58 |
| код не проверял! вот вместо ридера попробуй using (SqlConnection scon = new SqlConnection("Database=asp_forum; Data Source=localhost; Integrated Security=true;")) { using (SqlDataAdapter da = new SqlDataAdapter("select U_ID,U_Login from Users", scon)) { using (DataTable dt = new DataTable()) { int rowCount = da.Fill(dt); // должен возвратить количество // если не возвратил, то тогда так da.Fill(dt); int rowCount = dt.Rows.Count; if (rowCount == 0) return; for (int i = 0; i < rowCount; i++) { MessageBox.Show(dt.Rows[i]["col_name"].ToString()); } // или так foreach (DataRow dr in dt.Rows) { MessageBox.Show(dr["col_name"].ToString()); } } } } Добавлено через 4 минуты и 30 секунд SqlDataReader для быстрого считывания строк из базы, он не ставит перед собой цели знать весь набор данных, только строку! |
| Автор: FelikZ 2.7.2007, 15:55 | ||
emmanuil, Спасибо так работает!
|
| Автор: Idsa 2.7.2007, 17:09 |
| Рассмотрим предложенные способы: 1. Прогон всех значений DataReader в цикле. Стоит только представить, что запрос возвращает 100000... записей, и становится просто страшно 2. Заполнение таблицы через DataAdapter. Аналогично первому способу, производительность оставляет желать лучшего. 3. Получать количество строк в запросе. Здесь экономится и быстродействие, и трафик. emmanuil, предложил реализацию через хранимую процедуру. Почему бы и нет... хотя нужды в этом никакой нет, ведь достаточно воспользоваться агрегатной функцией count: "select count(U_ID) from Users". |
| Автор: emmanuil 3.7.2007, 04:52 | ||
А это разве не COUNT?!
Да и где написано, что я предлагал хранимку?! Тот запрос везде пойдет! А на счет адаптера, то в первоначальном примере FelikZ пробегался по всем строкам ридером, так что не имеет значения, всеравно придется пробегать по всем строкам! Один запрос лучше делать тогда, когда просто нужно узнать количество, а в этом случае это будет лишнее обращение к базе. Все зависит от конкретной задачи! А для первоначального примера, думаю лучшим будет пример с адаптером, почему я уже написал! |
| Автор: Idsa 4.7.2007, 17:57 |
| emmanuil, ага, я немного невнимательно прочитал первый пост. |