Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||||||||||||
1 | ||||||||||||||||
Неоднократная загрузка повторных таблиц в DataSet16.07.2017, 07:55. Показов 1351. Ответов 9
Метки нет (Все метки)
Доброго времени суток, Господа.
Есть база данных от Visual Fox Pro. Нужно с ней работать из программы на C#. Создал два класса:
Примерно у меня получилось вот так:
Добавлено через 10 часов 51 минуту Еще актуально
0
|
16.07.2017, 07:55 | |
Ответы с готовыми решениями:
9
Загрузка в DataSet нескольких таблиц Асинхронное загрузка таблиц в DataSet Обновление таблиц в DataSet Связи таблиц DataSet |
Администратор
|
|||||||||||||||||||||
16.07.2017, 16:14 | 2 | ||||||||||||||||||||
Сообщение было отмечено Bretbas как решение
Решение
Bretbas, что-то мешает удалить все таблицы из DataSet перед загрузкой? Таблицы не связаны так что проблем быть не должно
длинный postscriptum
P.S. Код очень неряшливый. Пока не поздно стоит заняться рефакторингом.
1) В первую очередь нужно избавиться от static полей и свойств. Они здесь неуместны. Кроме разве что строки соединения. 2) Соединение нет нужды постоянно хранить. Открыли, поработали, закрыли. 3) Не нужно изобретать собственные методы для очистки состояния. Имею в виду методы destroy(). Если класс владеет каким-то ресурсами, то правильнее делать их освобождение в реализации IDisposable. Это заодно заставит избавиться от static 4) При работе с реестром нужно не забывать закрывать ключи. И не нужно создавать ветки если задача только прочитать значение. 5) Непоняно зачем метод showSettingForm() два раза показывает форму SettingForm. Опечатка? 6) Методы loadDataBase() делает слишком много действий. Его нужно разбить и упростить, отделив при этом работу с БД от взаимодействия с UI. Чуть лучшенный вариант смотри ниже. Его не получится просто так вставить взамен старого - наверняка в коде есть куча зависимостей от "старых" классов, но по крайней мере покажет направление для улучшения.
1
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||||||||||||
16.07.2017, 17:35 [ТС] | 3 | |||||||||||||||
OwenGlendower,
Да я так делал
dataSet1.Tables.Clear(); , но почему-то не срабатывало это. Может быть из-за моего неряшливого кода. Я плохо знаю C#, приходится делать как попало. Принцип вашего приведенного кода, с приминением рефакторинга, мне понятен, внедрить в свой код смогу. Единственное мне не понятно вот эта функция:
GetDataTable(string connectionString, string query) , и та в свою очередь, вызывает создание объекта типа OleDbConnection ? Зачем оборачивать создание этого объекта в using:
0
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
16.07.2017, 20:35 [ТС] | 5 |
OwenGlendower,
execute(string tableName, DataSet dataSet, string query) , создается НОВЫЙ объект типа OleDbConnection . Вызов execute неоднократный.Добавлено через 2 часа 8 минут Все вроде поправил свой код в более менее нормальный вид. Остались также два вопроса: 1. При неоднократном вызове execute(string tableName, DataSet dataSet, string query) создается постоянно объект OleDbConnection , если это так, то это не есть хорошо.2. Если пользователь будет нажимать неоднократно настройки, выбирать тот же путь, по которому уже ранее были загружены таблицы в DataSet, то таблицы будут заново грузится в DataSet и увеличивать его в двое и тд(это я уже писал выше). OwenGlendower, как Вы написали выше, достаточно просто перед вызовом loadDataBase() вызывать dataSet1.Tables.Clear(); . Я так и сделал, и до этого делал, только у меня не получалось. А именно после этого вызова datagridview перестает отображать таблицу CARD, вообще перестает отображать все. Хотя в DataSet таблицы имеются
0
|
12502 / 8687 / 1310
Регистрация: 21.01.2016
Сообщений: 32,633
|
|
17.07.2017, 08:19 | 6 |
Помещайте все вызовы
execute в одном блоке using или не используйте using , в ручную закрывайте подключение, когда это будет возможно.Загружайте настройки только в первый раз (кешируйте) или очищайте таблицу.
1
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
17.07.2017, 09:22 [ТС] | 7 |
Usaga,
Мне нужно несколько раз вызвать функцию execute, чтобы подгрузить все таблицы. Каждый раз когда я вызываю execute, создается новый объект OleDbConnection. Что тут нужно помещать в using? Или каждый раз когда прошел успешный вызов execute, нужно закрывать соединение?
Я очищал, но после этого перестает отображать DataGridView
0
|
12502 / 8687 / 1310
Регистрация: 21.01.2016
Сообщений: 32,633
|
|
17.07.2017, 09:27 | 8 |
Нет. Просто соединение закрывать нужно принципиально, но не обязательно после каждого запроса. Либо все вызовы в одном блоке
Using делайте (если возможно), либо вообще не используйте using и вручную закрывайте соединение (Close() или Dispose() ), когда оно уже станет ненужным.
1
|
Администратор
|
||||||
17.07.2017, 15:07 | 9 | |||||
Ключевое здесь скорее постоянное открытие и закрытие соединения, а не создание объекта. Тем не менее оба момента несложно обойти создав соединение один раз.
Видимо нужно заново перебиндить данные к dataGridView1.
0
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||
17.07.2017, 18:58 [ТС] | 10 | |||||
Спасибо, так и сделал У меня просто параноя начинается, когда я вижу неоднократное создание одинаковых, ненужных объектов. Это C++ виноват...
Да, но он тогда сбивает все настройки столбцов DataGridView, которые я сделал в конструкторе, и приходится все ручками кодом писать, чтобы восстановить все как было Пришлось применить альтернативное решение:
0
|
17.07.2017, 18:58 | |
17.07.2017, 18:58 | |
Помогаю со студенческими работами здесь
10
Произведение таблиц из dataset Изменение порядка таблиц в dataSet Создание и заполнение таблиц в DataSet Отображение в DataGridView представления таблиц из DataSet Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |