Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить количество, полученых row 
V
    Опции темы
FelikZ
Дата 2.7.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



есть такого типа запрос:
Код

        SqlConnection scon = new SqlConnection("Database=asp_forum; Data Source=localhost; Integrated Security=true;");
        SqlCommand scom = new SqlCommand("select U_ID,U_Login from Users", scon);
        scon.Open();

        SqlDataReader sdr = scom.ExecuteReader();
        string[] users;
        if (!sdr.HasRows)
            return;
        else
        {
//
//Здесь мне нужно узнать, соколько раз пройдет sdr.Read или сколько row я получил в результате запроса
//
            while (sdr.Read()) 
            {
                
            }
        }


Конечно можно сделать еще один запрос с "count" но может можно как-то без этого обойтись?
Спасибо!


--------------------
user posted image
PM WWW ICQ Skype   Вверх
emmanuil
Дата 2.7.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



датаРидером не узнаешь, если только после этого кода
[code=csharp]
int i = 0;
while (sdr.Read()) 
{
    i++;
}
[\code]
Либо загоняй результат в таблицу, либо делай запрос

Добавлено через 1 минуту и 45 секунд
Или в том же запосе возврати вместе со всеми прочими строками еще и количество строк
PM MAIL   Вверх
dio30
Дата 2.7.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.10.2006

Репутация: нет
Всего: нет



sdr.RecordsAffected() не пробовал?
PM MAIL   Вверх
FelikZ
Дата 2.7.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



[/quote]
Цитата(dio30 @  2.7.2007,  13:20 Найти цитируемый пост)
sdr.RecordsAffected() не пробовал?

Сейчас в БД у меня записи две а "sdr.RecordsAffected" вернуло вобще -1

Цитата(emmanuil @  2.7.2007,  13:18 Найти цитируемый пост)
Или в том же запосе возврати вместе со всеми прочими строками еще и количество строк

Можно пример плз


--------------------
user posted image
PM WWW ICQ Skype   Вверх
emmanuil
Дата 2.7.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



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 пример
Код

declare
    @iRowsCount    int

select
    @iRowsCount = count(town_id)
from
    Towns (nolock)
        
select
    town_id,
    town_name,
    row_count = @iRowsCount
from
    Towns (nolock)


Добавлено через 6 минут и 18 секунд
вместо ридера используй адаптер и таблицу
PM MAIL   Вверх
emmanuil
Дата 2.7.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



код не проверял!
вот вместо ридера попробуй

                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 для быстрого считывания строк из базы, он не ставит перед собой цели знать весь набор данных, только строку!
PM MAIL   Вверх
FelikZ
Дата 2.7.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



emmanuil, Спасибо так работает!
Код

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); // должен возвратить количество
                    // если не возвратил, то тогда так


                    if (rowCount == 0)
                        return;
                   
                }
            }
        }




--------------------
user posted image
PM WWW ICQ Skype   Вверх
Idsa
Дата 2.7.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Рассмотрим предложенные способы:
1. Прогон всех значений DataReader в цикле. Стоит только представить, что запрос возвращает 100000... записей, и становится просто страшно smile
2. Заполнение таблицы через DataAdapter. Аналогично первому способу, производительность оставляет желать лучшего.
3. Получать количество строк в запросе. Здесь экономится и быстродействие, и трафик.
emmanuil, предложил реализацию через хранимую процедуру. Почему бы и нет... хотя нужды в этом никакой нет, ведь достаточно воспользоваться агрегатной функцией count: "select count(U_ID) from Users".


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
emmanuil
Дата 3.7.2007, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



А это разве не COUNT?!  smile
Код

declare
    @iRowsCount    int

select
    @iRowsCount = count(town_id)
from
    Towns (nolock)

Да и где написано, что я предлагал хранимку?! Тот запрос везде пойдет!
А на счет адаптера, то в первоначальном примере FelikZ пробегался по всем строкам ридером, так что не имеет значения, всеравно придется пробегать по всем строкам! Один запрос лучше делать тогда, когда просто нужно узнать количество, а в этом случае это будет лишнее обращение к базе. Все зависит от конкретной задачи! А для первоначального примера, думаю лучшим будет пример с адаптером, почему я уже написал!
PM MAIL   Вверх
Idsa
Дата 4.7.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



emmanuil, ага, я немного невнимательно прочитал первый пост.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1250 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.