Опубликован: 11.09.2006 | Уровень: специалист | Доступ: свободно
Лекция 4:

Работа с данными

CommandText

Для извлечения таблиц и содержащихся в них данных используются SQL-запросы. Переменная CommandText содержит в себе SQL-запрос, синтаксис которого адаптирован для данного поставщика данных. Мы можем управлять извлечением данных, изменяя строку CommandText. Скопируйте папку проекта ProgrammDataSQL и назовите ее CommandText. Запустите проект и перейдите в код формы. Изменим string СommandText так, чтобы извлекать в DataGrid только поля CustomerID, ContactName, Country и Phone. Для этого удалим ненужные поля. В результате получится следующий SQL-запрос:

string CommandText = "SELECT CustomerID, ContactName, Country, Phone  FROM Customers";

Запустите приложение. Теперь на форму выводятся только соответствующие четыре поля (рис. 4.46).

Ограничение выводимых полей

Рис. 4.46. Ограничение выводимых полей

Выведем теперь все записи клиентов, имена которых начинаются на "М":

string CommandText = "SELECT CustomerID, ContactName, Country, 
Phone  FROM Customers where ContactName like 'M%'";

Запускаем приложение. Запрос выбрал только записи на букву "M" (рис. 4.47).

Ограничение выводимых полей

Рис. 4.47. Ограничение выводимых полей

Вы можете использовать все возможности языка SQL для отбора данных и модификации строки CommandText для получения нужного результата. Не пробуйте только использовать команды insert, update или deleteизменение записей в базе данных мы рассмотрим позже.

ConnectionString

Строка соединения ConnectionString определяет параметры, необходимые для установления соединения с источником данных. Строка соединений при использовании мастеров генерируется средой, но можно (и желательно — во избежание неточностей и ошибок) писать эту строчку вручную. Рассмотрим еще раз строки соединения, которые были созданы при подключении к базам данных xtreme и Northwind:

string ConnectionString = @"Jet 
OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Database 
Password=;Data Source=""E:\Program Files\Microsoft Visual Studio .NET 2003\Crystal 
Reports\Samples\Database\xtreme.mdb"";Password=;Jet OLEDB:Engine Type=5;Jet OLEDB:Global Bulk 
Transactions=1;Provider=""Microsoft.Jet.OLEDB.4.0"";Jet OLEDB:System database=;Jet 
OLEDB:SFP=False;Extended Properties=;Mode=Share Deny None;Jet OLEDB:New Database Password=;Jet 
OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without 
Replica Repair=False;User ID=Admin;Jet OLEDB:Encrypt Database=False";
Листинг 4.10. База данных xtreme, проект ProgrammDataMDB
string ConnectionString = 
"workstation id=7EA2B2F6068D473;packet size=4096;integrated security=SSPI;data sou" +
"rce=\"(local)\";persist security info=False;initial catalog=NorthwindCS";

В этой строках через точку с запятой просто перечисляются параметры соединения. В таблице 4.2 приводятся основные значения этих параметров.

Таблица 4.2. Основные параметры ConnectionString
Параметр Описание
Параметр Описание
Provider (Поставщик) Свойство применяется для установки или возврата имени поставщика для соединения, используется только для объектов OleDbConnection
Connection Timeout или Connect Timeout (Время ожидания связи) Длительность времени ожидания связи с сервером перед завершением попытки и генерацией исключения в секундах. По умолчанию 15
Initial Catalog (Исходный каталог) Имя базы данных
Data Source (Источник данных)
Имя используемого SQL-сервера, когда установлено соединение, или имя файла базы данных Microsoft Access
Password (Пароль) Пользовательский пароль для учетной записи SQL Server.
User ID (Пользовательский ID) Пользовательское имя для учетной записи SQL Server
Workstation ID Имя рабочей станции или компьютера
Integrated Security или Trusted Connection (Интегрированная безопасность или Доверительное соединение) Параметр, который определяет, является ли соединение защищенным. True, False и SSPI — возможные значения. (SSPI – эквивалент True.)
Persist Security Info (Удержание защитной информации) Когда установлено False, нуждающаяся в защите информация, такая как пароль, не возвращается как часть соединения, если связь установлена или когда-либо была установленной. Выставление этого свойства в True может быть рискованным в плане безопасности. По умолчанию False

При создании строки ConnectionString Мастером происходит генерирование довольно многих лишних параметров. Нельзя сказать, что они не нужны, — просто Мастер предусматривает все возможности использования этого подключения и вставляет соответствующие значения. В действительности необходимых значений для простого извлечения данных всего несколько:

  • Provider (только OLE DB)
  • Data Source
  • Initial Catalog
  • User ID/Password
  • Persist Security Info

Скопируйте папки с проектами ProgrammDataMDB и ProgrammDataSQL. Переименуйте копии в ConnStringMDB и ConnStringSQL. Измените значения ConnectionString следующим образом:

string ConnectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0""; Data 
Source=""E:\Program Files\Microsoft Visual Studio .NET 2003\Crystal 
Reports\Samples\Database\xtreme.mdb"";User ID=Admin;Jet OLEDB:Encrypt Database=False";
Листинг 4.11. База данных xtreme, проект ConnStringMDB
string ConnectionString = 
"workstation id=7EA2B2F6068D473;integrated security=SSPI;
data source=\"(local)\";persist security 
info=False;initial catalog=NorthwindCS";

Мы значительно сократили количество параметров, получив прежнюю функциональность приложений.

Где определяется строка подключения, когда мы создаем объект DataAdapter не программно, а с помощью Мастера? Среда генерирует строку подключения вместе с кодом для DataAdapter, и в этом нетрудно убедиться. Запустите приложение, которое мы делали, вообще ничего не зная об объектах ADO.NET, — DataWizardMDB. Перейдите в код формы, откройте область Windows Form Designer generated code и найдите строку подключения:

this.oleDbConnection1.ConnectionString = @"Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet 
OLEDB:Database Locking Mode=1;Jet OLEDB:Database Password=;Data 
Source=""D:\Uchebnik\Code\Glava4\RBProduct.mdb"";Password=;Jet OLEDB:Engine Type=5;Jet 
OLEDB:Global Bulk Transactions=1;Provider=""Microsoft.Jet.OLEDB.4.0"";Jet OLEDB:System 
database=;Jet OLEDB:SFP=False;Extended Properties=;Mode=Share Deny None;Jet OLEDB:New Database 
Password=;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet 
OLEDB:Compact Without Replica Repair=False;User ID=Admin;Jet OLEDB:Encrypt Database=False";
Листинг 4.12.

Когда мы переносим объект DataAdapter из панели инструментов Toolbox (со вкладки Data) на форму, вместе с ним образуется объект DBConnection, в свойствах которого указывается строка ConnectionString и другие параметры подключения (рис. 4.48)

Свойства объекта sqlConnection1 проекта VisualDataSQL

увеличить изображение
Рис. 4.48. Свойства объекта sqlConnection1 проекта VisualDataSQL

Управление соединением. Объект Connection

Большинство источников данных поддерживает ограниченное количество соединений. Так, база данных Microsoft Access может поддерживать одновременную работу не более чем с 50 пользователями. При попытке обращения к базе данных, лимит соединений которой исчерпан, пользователь не получит нужной ему информации и будет вынужден ждать освобождения соединения. Задача разработчика заключается в минимизации времени связи с базой данных, поскольку соединение занимает полезные системные ресурсы.

Когда вы вызываете у объекта DataAdapter метод (например, Fill), то он сам проверяет, открыто ли соединение. Если соединения нет, то DataAdapter открывает соединение, выполняет задачи и затем закрывает соединение.

Явное управление соединением — лучший подход к работе с базами данных. Он обладает рядом преимуществ:

  • дает более чистый и удобный для чтения код;
  • помогает при отладке приложения;
  • является более эффективным.

Для явного управления соединением используется объект Connection. Создайте новый проект и назовите его ConnectionMDB. Перетащите элемент управления DataGrid из панели инструментов Toolbox и установите свойству Dock значение Fill. Перейдите в код формы. Подключаем пространство имен:

using System.Data.OleDb;

В конструкторе Form1 после InitializeComponent создаем объект Connection:

OleDbConnection  conn = new OleDbConnection(ConnectionString);

В качестве параметра объекту conn передается строка подключения ConnectionString.

Можно также устанавливать строку подключения через свойство созданного объекта сonn:

OleDbConnection  conn  =  new OleDbConnection();
conn.ConnectionString  =  ConnectionString;

Теперь нам необходимо определить параметры самой строки ConnectionString. Вы можете сделать это вручную или скопировав код из приложения ConnStringMDB (подключаться будем к базе данных xtreme).

string ConnectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0""; 
Data Source=""E:\Program Files\Microsoft Visual Studio .NET 2003\Crystal 
Reports\Samples\Database\xtreme.mdb"";User ID=Admin;Jet OLEDB:Encrypt Database=False";
Листинг 4.13.

Теперь можно устанавливать соединение, вызывая метод Open объекта Connection:

OleDbConnection  conn  =  new OleDbConnection();
conn.ConnectionString  =  ConnectionString;
conn.Open();
Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/