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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать колличество строк в таблице, с помощью OleDbDataReader 
V
    Опции темы
Teran
  Дата 31.5.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

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



вот пример программы которая считывает таблицу в массив
Код

            OleDbCommand cmd = new OleDbCommand("SELECT * FROM TEST ", db.Connection);
            OleDbDataReader dr;
            db.Open();
            dr = cmd.ExecuteReader();

            string[,] Mass = new string[10, 5];
            int MassX=0;
            while (dr.Read())
            {
                Mass[MassX,0]=dr["TEST_ID"].ToString();
                Mass[MassX,1]=dr["TEST1"].ToString();
                Mass[MassX,2]=dr["TEST2"].ToString();
                Mass[MassX,3]=dr["TEST3"].ToString();
                Mass[MassX,4]=dr["TEST4"].ToString();

                MassX++;
                                                 }


здесь я знаю что таблица имеет 10 строк и 5 сстолбцов
но как мне задать массив когда я не буду знать колличество строк заранее
Его можно както получить с помощю OleDbDataReader?
 smile  smile  smile  


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
andrx
Дата 31.5.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

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



В книге :
ADO.NET Сборник рецептов для пофессионалов ISBN 5-469-00239-X, стр.101

по этому поводу говорится:
Проблема
Требуется определить, возратил ли только что выполненный запрос хотябы одну запись.
Решение
Используйте свойство DataRowCollection.Count, DataReader.HasRows или метод DataReader.Read().
В коде примера создается и наполняется данными объект DataTable, после чего с помощью свойства Count объекта DataRowCollection определяется ...

Вообщем выходит, что для решения проблемы необходимо либо использовать DataTable или делать цикл с DataReader.Read().

Как вариант решения проблемы, перед объявлением и заполнением Mass [] можно выполнить  while (dr.Read()) {MassX++} 
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
Teran
Дата 31.5.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

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



Цитата(andrx @  31.5.2006,  13:28 Найти цитируемый пост)
Как вариант решения проблемы, перед объявлением и заполнением Mass [] можно выполнить  while (dr.Read()) {MassX++}  

а как после этого возвратить DataReader возвратить в исходное положение(до цикла) ведь после прохождения по всем строкам он не возвращается в начало?  smile 
 


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
Дрон
Дата 31.5.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

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



Цитата(Teran @  31.5.2006,  14:03 Найти цитируемый пост)
но как мне задать массив когда я не буду знать колличество строк заранее

Мне кажется решить эту задачу гораздо проще, чем высчитывать строки.
Сделай так (пример для .NET 1.1, в .NET 2.0 уже есть типизированные коллекции -- там ещё проще):
Код

ArrayList arrList = new ArrayList();
while (dr.Read())
{
      string[] str = new string[5];
      str[0]=dr["TEST_ID"].ToString();
      str[1]=dr["TEST1"].ToString();
      str[2]=dr["TEST2"].ToString();
      str[3]=dr["TEST3"].ToString();
      str[4]=dr["TEST4"].ToString();
      arrList.Add(str);
}
string[][] Mass = (string[][])arrList.ToArray(typeof(string[])); // не проверял, но вроде так должно быть


А вообще не понимаю, зачем тебе такие извращения?
Почему бы не использовать нормальный DataSet?  

Это сообщение отредактировал(а) Дрон - 31.5.2006, 13:46


--------------------
Да. Именно так.
PM   Вверх
andrx
Дата 31.5.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

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



Teran
Может следует прислушаться к Дрон  !
А для перемещения в начало DataReader ничего лучшего не придумал кроме как :

dr.Close();
dr = cmd.ExecuteReader();
 
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
Teran
Дата 31.5.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

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



Цитата(Дрон @  31.5.2006,  13:46 Найти цитируемый пост)
Почему бы не использовать нормальный DataSet

у меня DataReader работает раза в 2 быстрее 

а повторный вызов
Цитата(andrx @  31.5.2006,  13:56 Найти цитируемый пост)
dr.Close();
dr = cmd.ExecuteReader();

тоже займет некоторое процессорное время (а когда все это приплюсуеш получатся - тормоза проги) 


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
andrx
Дата 31.5.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

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



Teran 
Цитата

... получатся - тормоза проги)

ну а как же конечно, поэтому все таки может прислушаться к Дрон  и использовать ArrayList вместо массива ? 
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
Teran
Дата 31.5.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

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



Цитата(andrx @  31.5.2006,  14:16 Найти цитируемый пост)
может прислушаться к Дрон  и использовать ArrayList вместо массива

я так и сделал
 
всем спасибо!  smile  


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
arilou
Дата 3.6.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Цитата(Teran @  31.5.2006,  14:07 Найти цитируемый пост)
у меня DataReader работает раза в 2 быстрее 


Цитата(Teran @  31.5.2006,  13:38 Найти цитируемый пост)
а как после этого возвратить DataReader возвратить в исходное положение(до цикла)


Именно потому, что DataReader работает быстрее, ты не можешь его вернуть в начало smile Это как forward-only cursor. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Mascon
Дата 28.6.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



как вариант можно сделать и так 
cmd = select count(*) from .... тоесть повторение запроса который наполняет dr 
int Row_count = (int)cmd.ExecuteScalar();
а потом выполняете запрос наполняющий dr... 
нет не спрашивайте я не знаю может ли в принципе измениться число строк между запросами.....
если вас устроит передача работы по подсчету строк серверу базы данных.
это немного лучше чем  dr.Close() и тд... 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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