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


Автор: Teran 31.5.2006, 13:03
вот пример программы которая считывает таблицу в массив
Код

            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  

Автор: andrx 31.5.2006, 13:28
В книге :
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++} 

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

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

Автор: Дрон 31.5.2006, 13:46
Цитата(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?  

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

dr.Close();
dr = cmd.ExecuteReader();
 

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

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

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

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

Автор: andrx 31.5.2006, 14:16
Teran 
Цитата

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

ну а как же конечно, поэтому все таки может прислушаться к Дрон  и использовать ArrayList вместо массива ? 

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

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

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


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


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

Автор: Mascon 28.6.2006, 20:49
как вариант можно сделать и так 
cmd = select count(*) from .... тоесть повторение запроса который наполняет dr 
int Row_count = (int)cmd.ExecuteScalar();
а потом выполняете запрос наполняющий dr... 
нет не спрашивайте я не знаю может ли в принципе измениться число строк между запросами.....
если вас устроит передача работы по подсчету строк серверу базы данных.
это немного лучше чем  dr.Close() и тд... 

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