Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Заполнение DataGrid(как сделать быстрее) / 25 сообщений из 27, страница 1 из 2
02.06.2004, 10:12
    #32544060
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
Вот небольшой участок кода общее время заполнение Grida при 100 записях
в результатах запроса 10 секунд,мне кажется что это сильно долго,причем сам запрос выполняется моментально а вот заполнение строк в таблице самый продолжительный этап,выполняется это на Pocket PC,может кто -нибудь подскажет как можно оптимизировать.
private void button6_Click(object sender, System.EventArgs e)
{
DataTable myDataTable = new DataTable();
DataColumn myColumn;
DataRow myRow;
DataView myDataView;

myColumn = new DataColumn();
myColumn.DataType = System.Type.GetType("System.String");
myColumn.ColumnName = "id";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "name";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "vzaim";
myDataTable.Columns.Add(myColumn);
//*******************************
SqlCeConnection conn = null;
conn = new SqlCeConnection ("Data Source = \\SDMMC Disk\\Test.sdf");
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();

cmd.CommandText = "SELECT id,name,vzaim FROM SpravKontr"; SqlCeDataReader rdr = cmd.ExecuteReader();
//MessageBox.Show(myDataTable.Rows.Count.ToString());
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[0] = rdr.GetSqlString(0).ToString();
myRow[1] = rdr.GetSqlString(1).ToString();
myRow[2]=rdr.GetSqlString(2).ToString();
myDataTable.Rows.Add(myRow);

}
myDataView = new DataView(myDataTable);
//MessageBox.Show(myDataTable.Rows.Count.ToString());
dataGrid1.DataSource = myDataView;
//myDataTable.Rows.Clear();
conn.Close();
}
...
Рейтинг: 0 / 0
02.06.2004, 10:22
    #32544094
Bigheadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
Совет первый, скорее всего напрямую к времени выполнения не относящийся. Закрывай соединение сразу же после считывания всех данных. Т.е. сразу же после цикла while. Конечно других параллельно висящих клиентов бд скорее всего нет (раз это Pocket PC). Но все же.
Совет второй. Попробуй вместо
Код: plaintext
1.
myDataView = new DataView(myDataTable);
использовать
Код: plaintext
1.
myDataView = myDataTable.DefaultView;
Совет третий. Не создавай каждый раз структуру таблицы заново. Создай один раз и храни ее как член класса. Когда таблица становится ненужной, очищай ее (данные), но сам объект с готовой схемой будет жить.
...
Рейтинг: 0 / 0
02.06.2004, 10:22
    #32544096
vooo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
А если попытаться "залить" таблицу через DataAdapter, используя метод Fill?
...
Рейтинг: 0 / 0
02.06.2004, 10:30
    #32544117
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
SqlDataREader можно сделать DataSource для DataGrid.
...
Рейтинг: 0 / 0
02.06.2004, 10:33
    #32544129
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
SqlCe не использую :-)

Там можно использовать хранимые процедуры?
Этот запрос повторно (второй и следующий вызов) тоже выполняется 10 секунд?
Попробуйте замерить чистую скорость открытия соединения и чистую скорость заполнения DataTable при помощи DataReader. Надо выяснить где у вас слабое звено, может быть и не в заполнении DataTable все дело.

Попробуйте добавить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
myRow = myDataTable.NewRow();
myRow.BeginEdit(); // эту строчку
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myRow.EndEdit(); // и эту строчку
myDataTable.Rows.Add(myRow);

Если вы используете DataTable - то пробовали заполнять DataTable при помощи метода Fill DataAdapter'а?
...
Рейтинг: 0 / 0
02.06.2004, 10:35
    #32544134
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
авторSqlDataREader можно сделать DataSource для DataGrid.
если можно поподробнее,а то на компакте много чего не работает.
...
Рейтинг: 0 / 0
02.06.2004, 10:37
    #32544141
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
авторЕсли вы используете DataTable - то пробовали заполнять DataTable при помощи метода Fill DataAdapter'а?пробовал но пока без успеха.
...
Рейтинг: 0 / 0
02.06.2004, 10:41
    #32544158
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
>пробовал но пока без успеха.

Без успеха по скорости, или не получилось?
И еще 10 секунд - как замеряете по секундомеру или на глазок :-) Ведь речь здесь может идти на миллисекунды

100 записей не показатель. Сделайте хотя бы 1000 записей, тогда разница между различными способами будет более заметна.
...
Рейтинг: 0 / 0
02.06.2004, 10:45
    #32544171
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
авторБез успеха по скорости, или не получилось?не получилось,в данном случае скорость это очень важно осуществляется сбор заказов,и оператор выбирает по справочнику,там своя иерархия,но в группе редко более 100 элементов,так вот хочется чтобы перерисовка Grida при выборе другой группы была максимально быстрой.
...
Рейтинг: 0 / 0
02.06.2004, 10:47
    #32544174
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
авторИ еще 10 секунд - как замеряете по секундомеру или на глазок :-) Ведь речь здесь может идти на миллисекундызамерял по часам
...
Рейтинг: 0 / 0
02.06.2004, 10:47
    #32544179
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
Ваш код:
Код: plaintext
1.
2.
3.
4.
5.
myRow = myDataTable.NewRow();
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myDataTable.Rows.Add(myRow);

Так должно быть быстрее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
myRow = myDataTable.NewRow();
myRow.BeginEdit(); // добавил эту строку
myRow[ 0 ] = rdr[ 0 ];  //  изменил строку. 
myRow[ 1 ] = rdr[ 1 ]; // изменил строку
myRow[ 2 ]=rdr[ 2 ]; //  изменил строку
myRow.EndEdit(); // добавил эту строку
myDataTable.Rows.Add(myRow);

И интересует чистая производительность DataReader, а не всей процедуры создания DataTable, открытия соединения, заполнения DataTable.
...
Рейтинг: 0 / 0
02.06.2004, 10:53
    #32544204
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
авторИ интересует чистая производительность DataReader, а не всей процедуры создания DataTable, открытия соединения, заполнения DataTable.имеется в виду время выполнения запроса
т.е. cmd.ExecuteReader();-это или???
...
Рейтинг: 0 / 0
02.06.2004, 10:57
    #32544221
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
>меется в виду время выполнения запроса
т.е. cmd.ExecuteReader();-это или???

Интересует вот этот кусочек:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
cmd.CommandText = "SELECT id,name,vzaim FROM SpravKontr"; SqlCeDataReader rdr = cmd.ExecuteReader();
//MessageBox.Show(myDataTable.Rows.Count.ToString());
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myDataTable.Rows.Add(myRow);

}
...
Рейтинг: 0 / 0
02.06.2004, 10:59
    #32544229
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
Все таки рекомендую значительно увеличить количество считываемых записей,
пусть потом будет всего 100 зато вы будете знать что используете самый производительный из возможных способов.
...
Рейтинг: 0 / 0
02.06.2004, 11:01
    #32544238
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
вот это самый долгий отрезок
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[0] = rdr.GetSqlString(0).ToString();
myRow[1] = rdr.GetSqlString(1).ToString();
myRow[2]=rdr.GetSqlString(2).ToString();
myDataTable.Rows.Add(myRow);

}
после того как он выполняется ,отображение Grida происходит секунды две не больше.
...
Рейтинг: 0 / 0
02.06.2004, 11:02
    #32544248
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
авторВсе таки рекомендую значительно увеличить количество считываемых записей,
пусть потом будет всего 100 зато вы будете знать что используете самый производительный из возможных способов.сейчас нет возможности но сегодня дома обязательно попробую.
...
Рейтинг: 0 / 0
02.06.2004, 11:24
    #32544321
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
Да и хватит считать время выполнения отдельных конструкций по настенным часам с кукушкой :-)

Интересуют выполнение следующих двух вариантов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
System.DateTime before = DateTime.Now;

while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myDataTable.Rows.Add(myRow);
}

System.DateTime after = DateTime.Now;
System.TimeSpan diff = after - before;
System.Windows.Forms.MessageBox.Show("My variant: " + diff.Milliseconds.ToString());

И этого варианта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
System.DateTime before = DateTime.Now;

while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow.BeginEdit(); // добавил эту строку
myRow[ 0 ] = rdr[ 0 ];  //  изменил строку. 
myRow[ 1 ] = rdr[ 1 ]; // изменил строку
myRow[ 2 ]=rdr[ 2 ]; //  изменил строку
myRow.EndEdit(); // добавил эту строку
myDataTable.Rows.Add(myRow);
}

System.DateTime after = DateTime.Now;
System.TimeSpan diff = after - before;
System.Windows.Forms.MessageBox.Show("Sa variant: " + diff.Milliseconds.ToString());

Результаты естественно в студию :-).
...
Рейтинг: 0 / 0
03.06.2004, 10:40
    #32546014
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
я только изменил подсчет времени,предложеный не поехал
1000 записей
long before = DateTime.Now.TimeOfDay.Ticks;
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow.BeginEdit(); // добавил эту строку
myRow[0] = rdr[0]; // изменил строку.
myRow[1] = rdr[1]; // изменил строку
myRow[2]=rdr[2]; // изменил строку
myRow.EndEdit(); // добавил эту строку
myDataTable.Rows.Add(myRow);
}
conn.Close();
double after = DateTime.Now.TimeOfDay.Ticks;
1000 записей | 100 записей
первый проход - 45 сек.|6 сек.
второй - 44 сек.|5 сек.
третий - 39 сек.|5 сек.
четвертый - 47 сек.|4 сек.
мой вариант
long before = DateTime.Now.TimeOfDay.Ticks;
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[0] = rdr.GetSqlString(0).ToString();
myRow[1] = rdr.GetSqlString(1).ToString();
myRow[2]=rdr.GetSqlString(2).ToString();
myDataTable.Rows.Add(myRow);

}
conn.Close();
double after = DateTime.Now.TimeOfDay.Ticks;
1000 записей | 100 записей
первый проход - 50 сек.|9
второй - 43 сек.|8
третий - 58 сек.|7
четвертый - 184 сек.|7


верхняя часть
DataTable myDataTable = new DataTable();
DataColumn myColumn;
DataRow myRow;
DataView myDataView;

myColumn = new DataColumn();
myColumn.DataType = System.Type.GetType("System.String");
myColumn.ColumnName = "id";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "name";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "vzaim";
myDataTable.Columns.Add(myColumn);
//*******************************
SqlCeConnection conn = null;
conn = new SqlCeConnection ("Data Source = \\SDMMC Disk\\Test.sdf");
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();

cmd.CommandText = "SELECT id,name,vzaim FROM SpravKontr"; SqlCeDataReader rdr = cmd.ExecuteReader();

смотрел правда на 100 записях,первый раз 4 сек.,все последующие 1 сек.,если кому нибудь будет интересно могу этот кусок и на 1000 посмотреть.



авторСовет третий. Не создавай каждый раз структуру таблицы заново. Создай один раз и храни ее как член класса. Когда таблица становится ненужной, очищай ее (данные), но сам объект с готовой схемой будет жить. а можно пример или ссылку.
...
Рейтинг: 0 / 0
03.06.2004, 10:53
    #32546055
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
>смотрел правда на 100 записях,первый раз 4 сек.,все последующие 1 сек.,если кому нибудь будет интересно могу этот кусок и на 1000 посмотреть.

Конечно интересно

>а можно пример или ссылку.
Да все уже у тебя есть, осталось только поправить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
private DataTable myDataTable;

//Например в Load формы создадим DataTable один раз
private void Form1_Load(object sender, System.EventArgs e)
{
  CreateDataTable();		
}

private void CreateDataTable()
{
this.myDataTable = new DataTable();
DataColumn myColumn;
DataRow myRow; 
DataView myDataView;

myColumn = new DataColumn();
myColumn.DataType = System.Type.GetType("System.String");
myColumn.ColumnName = "id";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "name";
myDataTable.Columns.Add(myColumn);

myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "vzaim";
myDataTable.Columns.Add(myColumn);
}

private void button6_Click(object sender, System.EventArgs e)
{
this.myDataTable.Clear() // Очистим от старых записей
//*******************************
SqlCeConnection conn = null;
conn = new SqlCeConnection ("Data Source = \\SDMMC Disk\\Test.sdf");
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();

cmd.CommandText = "SELECT id,name,vzaim FROM SpravKontr"; SqlCeDataReader rdr = cmd.ExecuteReader();
//MessageBox.Show(myDataTable.Rows.Count.ToString());
while (rdr.Read())
{
myRow = myDataTable.NewRow();
myRow[ 0 ] = rdr.GetSqlString( 0 ).ToString();
myRow[ 1 ] = rdr.GetSqlString( 1 ).ToString();
myRow[ 2 ]=rdr.GetSqlString( 2 ).ToString();
myDataTable.Rows.Add(myRow);

}
myDataView = new DataView(myDataTable);
//MessageBox.Show(myDataTable.Rows.Count.ToString());
dataGrid1.DataSource = myDataView;
//myDataTable.Rows.Clear();
conn.Close();
}

Я так понял тебе эти данные изменять не надо, а надо их всего лишь отобразить?
Если так то чем тебе не подходит совет hDrummer:
"SqlDataREader можно сделать DataSource для DataGrid"
...
Рейтинг: 0 / 0
03.06.2004, 11:08
    #32546093
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
Еще пара ламерских вопросов:
как сделать так чтобы скажем поля id,vzaim не отображались в гриде при том что они там заполнены,и еще должна быть некая дополнительная колонка
куда надо вводить количество т. е цифры,а dataGrid вроде бы как не редактируется???
...
Рейтинг: 0 / 0
03.06.2004, 11:15
    #32546111
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
>ак сделать так чтобы скажем поля id,vzaim не отображались в гриде при том что они там заполнены,и еще должна быть некая дополнительная колонка

Для этого в DataGrid есть специальная коллекция TableStyles. Где и задаются те колонки которые выводятся, а которые нет а также определяется текст заголовок, формат столбцов и т.д.

>и еще должна быть некая дополнительная колонка
Какая колонка?
...
Рейтинг: 0 / 0
03.06.2004, 11:18
    #32546126
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
ну колонка - куда надо вводить количество т. е цифры(т.е. чтобы она была редактируемая),а dataGrid вроде бы как не редактируется???
...
Рейтинг: 0 / 0
03.06.2004, 12:23
    #32546329
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
>ну колонка - куда надо вводить количество т. е цифры(т.е. чтобы она была
редактируемая),а dataGrid вроде бы как не редактируется???

За возможность редактирования, и не редактирования колонок отвечает свойство ReadOnly.

Я правильно понял:

Показываете пользователю 100 записей, он их отрабатывает - вводит числа в один столбец , а потом что? Сохраняете изменения?
...
Рейтинг: 0 / 0
03.06.2004, 13:04
    #32546452
wait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
да потом эти введенные данные я буду отображать в документе.
...
Рейтинг: 0 / 0
03.06.2004, 15:12
    #32546857
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение DataGrid(как сделать быстрее)
Ну добавьте тогда соответствующую колонку в свой DataTable. И эту колонку также выводите в DataGrid. Только на нее ставим ReadOnly = false. На остальные ReadOnly = true. В итоге вы увидите в datagrid необходимые столбцы , редактировать только сможете myIntColumn.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
private void CreateDataTable()
{
this.myDataTable = new DataTable();
DataColumn myColumn;
DataRow myRow; 
DataView myDataView;
myColumn = new DataColumn();
myColumn.DataType = System.Type.GetType("System.String");
myColumn.ColumnName = "id";
myDataTable.Columns.Add(myColumn);
myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "name";
myDataTable.Columns.Add(myColumn);
myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.String");
myColumn.ColumnName = "vzaim";
myDataTable.Columns.Add(myColumn);
//дополнительный столбец
myColumn = new DataColumn();
myColumn.DataType = Type.GetType("System.Int32");
myColumn.ColumnName = "myIntColumn";   -- название столбца
 
myDataTable.Columns.Add(myColumn);
}
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Заполнение DataGrid(как сделать быстрее) / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]