При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Работа с данными
Выбираем таблицу Customer (Customers), нажимаем кнопку Add и затем Close. Затем в окне Query Builder выбираем все столбцы (All Columns), как показано на рис. 4.35.
Рис. 4.35. Добавление столбцов. Поставив галочку напротив пункта (All Columns), мы извлекаем все столбцы из таблицы
Нажимаем кнопку OK. В окне Generate the SQl statements, к которому мы вернулись, приводится SQL-запрос, созданный Мастером:
SELECT Customer.* FROM Customer SELECT Customers.* FROM Customers
Обратите внимание, что синтаксис этих запросов несущественно отличается от "классического" SQL- запроса, рассмотренного выше.
Нажимаем кнопку Next. В окне "Обзор результатов мастера" (View Wizard Results) приводится список результатов работы Мастера. Вид этого списка может отличаться так, как это изображено на рис. 4.36 и рис. 4.37.
Чем обусловлено это различие? Для базы данных Access мастером создана возможность не только просмотра данных из базы данных — SQL-запрос SELECT, но и возможность ее изменения — запросы INSERT, UPDATE, DELETE. Для базы данных SQL Server создана лишь возможность просмотра базы данных. Для изменения данных необходимо проходить авторизацию (рис. 4.31) с учетной записью администратора базы данных.
Нажимаем кнопку Finish. Для объекта OleDbDataAdapter возникает окно (рис. 4.27), которое мы уже описывали выше.
Мастер создал на панели компонент по два элемента, oleDbDataAdapter1 и oleDbConnection1 для VisualDataMDB и sqlDbDataAdapter1 и sqlDbConnection1 для VisualDataSQL. oleDbDataAdapter1 (или sqlDbDataAdapter1 ) является основным компонентом типа OleDbDataAdapter (или SqlDataAdapter ), который мы создавали при помощи мастера. Объект oleDbConnection1 (или sqlDbConnection1) был создан мастером как необходимый элемент подключения к базе. Образно говоря, мы получили адаптер (DataAdapter1) и вилку (Connection1) для подключения к источнику данных. Теперь нам необходимо добавить объект DataSet — тот самый "буфер", в котором будет храниться информация, полученная из базы данных. Щелкаем на oleDbDataAdapter1 (или sqlDbDataAdapter1) для его выделения. Открываем свойства этого элемента. На информационной панели щелкаем на ссылку Generate DataSet для создания объекта DataSet6Можно также создать объект DataSet, перетащив его на форму из вкладки Data панели инструментов ToolBox (р ис. 4.38):
В появившемся окне Generate DataSet задаем имена — dsCustomer и dsCustomers соответственно. Итак, все "невидимые" части механизма подключения к базе данных у нас уже есть. Осталось теперь связать видимый интерфейс с данными. Объектом, отображающим данные на форме, у нас является dataGrid1. В свойстве этого элемента DataSource (источник данных) выбираем в качестве источника созданный объект dsCustomer1 (рис. 4.39).
На форме в режиме дизайна у нас немедленно появилась символическая таблица со знаком (+). Последнее, что нам осталось сделать, — это заполнить объект DataSet (здесь dsCustomer1 ). Переходим в код форм и вносим соответствующие добавления:
using System.Data.OleDb; // Подключаем пространство имен для работы с поставщиком OleDb private void Form1_Load(object sender, System.EventArgs e) { oleDbDataAdapter1.Fill(dsCustomer1); } using System.Data.SqlClient; // Подключаем пространство имен для работы с поставщиком SQL private void Form1_Load(object sender, System.EventArgs e) { sqlDataAdapter1.Fill(dsCustomers1); }
В обоих случаях в методе загрузки формы вызываем метод Fill объекта oleDbDataAdapter1 (или oleDbDataAdapter1 ) и передаем ему в качестве параметра dsCustomer1. Опять же, говоря образно, мы "заливаем" данные из адаптера в DataSet, который затем распоряжается ими, — здесь мы определили, что DataSet выступает в качестве источника данных для dataGrid1.
Запустите приложения. Щелкните на знак (+), а затем на ссылку Customer. Готовые приложения будут иметь следующий вид (рис. 4.40 и рис. 4.41):
На диске, прилагаемом к книге, вы найдете эти приложения (Code\Glava4\VisualDataMDB и Code\Glava4\VisualDataSQL).