Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Получить количество


Автор: FelikZ 2.7.2007, 13:01
есть такого типа запрос:
Код

        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" но может можно как-то без этого обойтись?
Спасибо!

Автор: 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() не пробовал?

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

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

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

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

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

declare
    @iRowsCount    int

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


Добавлено через 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, Спасибо так работает!
Код

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;
                   
                }
            }
        }


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

Автор: emmanuil 3.7.2007, 04:52
А это разве не COUNT?!  smile
Код

declare
    @iRowsCount    int

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

Да и где написано, что я предлагал хранимку?! Тот запрос везде пойдет!
А на счет адаптера, то в первоначальном примере FelikZ пробегался по всем строкам ридером, так что не имеет значения, всеравно придется пробегать по всем строкам! Один запрос лучше делать тогда, когда просто нужно узнать количество, а в этом случае это будет лишнее обращение к базе. Все зависит от конкретной задачи! А для первоначального примера, думаю лучшим будет пример с адаптером, почему я уже написал!

Автор: Idsa 4.7.2007, 17:57
emmanuil, ага, я немного невнимательно прочитал первый пост.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)