Динамическая привязка базы данных в С#

У меня есть проект, который соединяется с производственной базой данных и захватывает таблицы и представления. Код, который я унаследовал, подключается к базе данных SQL Server через SqlConnection, при этом пользователь предоставляет учетные данные и местоположение базы данных, которые они предоставляют. Когда необходимы данные, он использует соединение и строку SQL для создания SqlDataAdapter и заполняет новый DataSet. Затем эти данные отображаются после манипулирования им, заменяя имена столбцов таблиц соответствующими отображаемыми именами, что-то вроде этого.

Проблема заключается в том, что весь процесс медленный, и обледенение на торте состоит в том, что он отображает большие объемы данных в ListViews, которые не требуют любезности для предоставления десяти тысяч строк данных. По причинам дизайна мы не собираемся ломать страницы - есть элемент управления поиском - и я могу реализовать виртуальный ListView с огромными усилиями, чтобы просто вернуться туда, где я был. Я просто думаю, что это неправильное приложение для ListViews - я подключаюсь к базе данных, и я показываю записи. Звучит как работа для DataGridView.

К сожалению, это просто не сработает. Я пытаюсь привязать DataGridView к DataSet, который я получил из кода подключения через DataBinder, но когда я его запускаю, чтобы посмотреть данные, сидящие в DataSet, в то время как DataGridView полностью пуст.

Однако, если я использую привязку GUI в своей тестовой базе данных, принимая текущую схему базы данных и мои учетные данные, вот и все, что работает. Но я не могу использовать этот материал, потому что он просто недостаточно гибкий - я не хочу определять схему в коде, которую я должен менять каждый раз, когда мы обновляем базу данных, и мне нужен доступ к строке подключения, и Кажется, я не понимаю этого из созданного TableAdapter.

Я пропустил что-то простое здесь, чтобы сделать мое решение DataSet/BindingSource? Я лаяю неправильное дерево?

Разве это даже стоит возиться со связкой? Весь текст привязки, который я вижу, кажется, дает мне 90% пути, но тогда я не могу изменить строку подключения или отсортировать определенные столбцы так, как я хочу, и мне кажется, что я хочу дать ему определенную схему который будет разорваться, как только база данных изменится, тогда как рукописный код, по крайней мере, защищён и будет достаточно гибким. Я не сокращаю функции, и медленное решение уже работает - если мне нужно отказаться от некоторых моих требований, чтобы заставить его работать, мы просто справимся с тем, что у нас есть.

3 ответа

Он должен работать нормально, пока вы указали имя таблицы (иначе IIRC использует первую таблицу). Конечно, вы можете упростить ситуацию, предоставив DGV соответствующий DataTable (а не DataSet). Вы также можете проверить, что автоматическое создание столбцов включено в DGV. Но привязка к ad-hoc DataTable отлично работает; Я использую его все время для примеров и т.д.


Я не уверен, что вы вообще не можете изменить Query или просто в контексте ситуации, о которой вы говорили в конце своего сообщения.

Но я бы предложил реализовать какой-то пейджинг, если вы можете, и только отыскивать строки конкретной страницы, на которой находится пользователь данных. Это создало бы огромную разницу в производительности, особенно если набор результатов такой же большой, как вы говорите. Это, вероятно, будет самым большим увеличением производительности, которое вы могли бы сделать, на мой взгляд. И вы можете сохранить текущую рабочую реализацию listview. Кроме того, даже если у вас есть сетка с вашим собственным запросом, заполняющим ее, вам все равно понадобится какая-то стратегия поискового вызова, или это будет слишком медленным.

я просто схватил случайную статью об осуществлении, но вы можете найти многие другие

РЕДАКТИРОВАТЬ: Что касается вашего обновленного Вопроса, весь мой ответ был, если он не сломался, не исправить. Если список просматривается прямо сейчас, зачем его менять?


откройте свой набор данных в дизайнере, щелкните на адаптере и измените соединение на общедоступный (по умолчанию он будет внутренним), затем вы можете получить к нему доступ

как и для остальных ваших проблем, покажите нам, что код-databinding на datagridview отлично работает AFAIK...

licensed under cc by-sa 3.0 with attribution.