Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
Вот небольшой участок кода общее время заполнение 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(); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:12 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
Совет первый, скорее всего напрямую к времени выполнения не относящийся. Закрывай соединение сразу же после считывания всех данных. Т.е. сразу же после цикла while. Конечно других параллельно висящих клиентов бд скорее всего нет (раз это Pocket PC). Но все же. Совет второй. Попробуй вместо Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:22 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
А если попытаться "залить" таблицу через DataAdapter, используя метод Fill? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:22 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
SqlDataREader можно сделать DataSource для DataGrid. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:30 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
SqlCe не использую :-) Там можно использовать хранимые процедуры? Этот запрос повторно (второй и следующий вызов) тоже выполняется 10 секунд? Попробуйте замерить чистую скорость открытия соединения и чистую скорость заполнения DataTable при помощи DataReader. Надо выяснить где у вас слабое звено, может быть и не в заполнении DataTable все дело. Попробуйте добавить: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Если вы используете DataTable - то пробовали заполнять DataTable при помощи метода Fill DataAdapter'а? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:33 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
авторSqlDataREader можно сделать DataSource для DataGrid. если можно поподробнее,а то на компакте много чего не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:35 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
авторЕсли вы используете DataTable - то пробовали заполнять DataTable при помощи метода Fill DataAdapter'а?пробовал но пока без успеха. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:37 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
>пробовал но пока без успеха. Без успеха по скорости, или не получилось? И еще 10 секунд - как замеряете по секундомеру или на глазок :-) Ведь речь здесь может идти на миллисекунды 100 записей не показатель. Сделайте хотя бы 1000 записей, тогда разница между различными способами будет более заметна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:41 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
авторБез успеха по скорости, или не получилось?не получилось,в данном случае скорость это очень важно осуществляется сбор заказов,и оператор выбирает по справочнику,там своя иерархия,но в группе редко более 100 элементов,так вот хочется чтобы перерисовка Grida при выборе другой группы была максимально быстрой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:45 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
авторИ еще 10 секунд - как замеряете по секундомеру или на глазок :-) Ведь речь здесь может идти на миллисекундызамерял по часам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:47 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
Ваш код: Код: plaintext 1. 2. 3. 4. 5. Так должно быть быстрее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. И интересует чистая производительность DataReader, а не всей процедуры создания DataTable, открытия соединения, заполнения DataTable. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:47 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
авторИ интересует чистая производительность DataReader, а не всей процедуры создания DataTable, открытия соединения, заполнения DataTable.имеется в виду время выполнения запроса т.е. cmd.ExecuteReader();-это или??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:53 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
>меется в виду время выполнения запроса т.е. cmd.ExecuteReader();-это или??? Интересует вот этот кусочек: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:57 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
Все таки рекомендую значительно увеличить количество считываемых записей, пусть потом будет всего 100 зато вы будете знать что используете самый производительный из возможных способов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:59 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
вот это самый долгий отрезок 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 происходит секунды две не больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 11:01 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
авторВсе таки рекомендую значительно увеличить количество считываемых записей, пусть потом будет всего 100 зато вы будете знать что используете самый производительный из возможных способов.сейчас нет возможности но сегодня дома обязательно попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 11:02 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
Да и хватит считать время выполнения отдельных конструкций по настенным часам с кукушкой :-) Интересуют выполнение следующих двух вариантов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. И этого варианта: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Результаты естественно в студию :-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 11:24 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
я только изменил подсчет времени,предложеный не поехал 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 посмотреть. авторСовет третий. Не создавай каждый раз структуру таблицы заново. Создай один раз и храни ее как член класса. Когда таблица становится ненужной, очищай ее (данные), но сам объект с готовой схемой будет жить. а можно пример или ссылку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 10:40 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
>смотрел правда на 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. Я так понял тебе эти данные изменять не надо, а надо их всего лишь отобразить? Если так то чем тебе не подходит совет hDrummer: "SqlDataREader можно сделать DataSource для DataGrid" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 10:53 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
Еще пара ламерских вопросов: как сделать так чтобы скажем поля id,vzaim не отображались в гриде при том что они там заполнены,и еще должна быть некая дополнительная колонка куда надо вводить количество т. е цифры,а dataGrid вроде бы как не редактируется??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 11:08 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
>ак сделать так чтобы скажем поля id,vzaim не отображались в гриде при том что они там заполнены,и еще должна быть некая дополнительная колонка Для этого в DataGrid есть специальная коллекция TableStyles. Где и задаются те колонки которые выводятся, а которые нет а также определяется текст заголовок, формат столбцов и т.д. >и еще должна быть некая дополнительная колонка Какая колонка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 11:15 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
ну колонка - куда надо вводить количество т. е цифры(т.е. чтобы она была редактируемая),а dataGrid вроде бы как не редактируется??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 11:18 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
>ну колонка - куда надо вводить количество т. е цифры(т.е. чтобы она была редактируемая),а dataGrid вроде бы как не редактируется??? За возможность редактирования, и не редактирования колонок отвечает свойство ReadOnly. Я правильно понял: Показываете пользователю 100 записей, он их отрабатывает - вводит числа в один столбец , а потом что? Сохраняете изменения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 12:23 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
да потом эти введенные данные я буду отображать в документе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 13:04 |
|
||
|
Заполнение DataGrid(как сделать быстрее)
|
|||
|---|---|---|---|
|
#18+
Ну добавьте тогда соответствующую колонку в свой 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 15:12 |
|
||
|
|

start [/forum/topic.php?fid=20&fpage=1022&tid=1439036]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 406ms |

| 0 / 0 |
