CREATE DATABASE [Cars] ON (NAME = N'Cars_Data', FILENAME= N'С:Program FilesMicrosoft SQL ServerMSSQLDataCars_Data.MDF', SIZE = 2, FILEGROWTH = 10%)
LOG ON (NAME = N'Cars_Log', FILENAME = N'C:Program FilesMicrosoft SQL ServerMSSQLDataCars_Log.LDF', SIZE = 1, FILEGROWTH = 10%)
GO
Теперь выполните сценарий. После этого откройте окно утилиты SQL Server Enterprise Manager. Вы сможете увидеть там три связанные таблицы (с некоторыми уже введенными данными) и одну хранимую процедуру. На рис. 22.4 показаны таблицы, формирующие базу данных Cars.
Рис. 22.4. База данных Cars
Соединение с базой данных в Visual Studio 2005
Итак, база данных Cars создана, и вы можете установить соединение с этой базой данных из Visual Studio 2005. Это позволит просматривать и редактировать различные объекты базы данных в среде разработки Visual Studio 2005. Используя меню View, откройте окно Server Explorer (Обозреватель серверов). Затем щелкните правой кнопкой мыши на узле Data Connections (Связь с данными) и выберите Add Connection (Добавить соединение) из контекстного меню. В появившемся диалоговом окне выберите в качестве источника данных Microsoft SQL Server. В следующем диалоговом окне выберите имя своей машины из раскрывающегося списка Server Name (Имя сервера) или просто укажите localhost а также укажите правильную информацию для входа в систему. Наконец, выберите базу данных Cars из раскрывающегося списка Select or enter a database name (Выбрать или ввести имя базы данных), рис. 22.5.
Рис. 22.5. Соединение с базой данных Cars в Visual Studio 2005
После завершения описанной процедуры, в рамках поддерева Data Connections должен появиться узел для Cars. Обратите внимание на то. что здесь же можно увидеть и записи любой таблицы, если щелкнуть на ее имени правой кнопкой мыши и выбрать Show Table Data (Показать данные таблицы) из появившегося контекстного меню (рис. 22.6).
Рис. 22.6. Просмотр данных таблицы
Связный уровень ADO.NET
Напомним, что связный уровень ADO.NET позволяет взаимодействовать с базой данных, используя объекты соединения, команд и чтения данных вашего поставщика данных. Вы уже использовали эти объекты в предыдущем примере DataProviderFactory, но давайте рассмотрим соответствующий процесс еще раз более подробно. Чтобы соединиться с базой данных и прочитать ее записи с помощью объекта чтения данных, необходимо выполнить следующие шаги
1. Разместить, настроить и открыть объект соединения.
2. Разместить и настроить объект команды, передав ему объект соединения в виде аргумента конструктора или с помощью свойства Connection.
3. Вызвать ExecuteReader() для сконфигурированного объекта команды.
4. Обработать каждую запись, используя метод Read() объекта чтения данных.
Для начала создайте новое консольное приложение с названием CarsDataReader. Нашей целью является открытие соединения (с помощью объекта SqlConnection) а отправка SQL-запроса (с помощью объекта SqlCommand) для получения всех записей из таблицы Inventory базы данных Cars. Затем мы используем SqlDataReader, чтобы напечатать результаты с помощью индексатора типа. Вот соответствующий программный код Main(), за которым следует его анализ.
class Program {
static void Main(string[] args) {
Console.WriteLine("***** Забавы с чтением данных *****n");
// Создание и открытие соединения.
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "uid=sa;pwd=;Initial Catalog=Cars;Data Source=(local)";
cn.Open();
// Создание объекта SQL-команды.
string strSQL = "Select * From Inventory";
SqlCommand myCommand = new SqlCommand(strSQL, cn);
// Получение объекта чтения данных в стиле ExecuteReader().
SqlDataReader myDataReader;
myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
// Цикл по результатам.
while (myDataReader.Read()) {
Console.WriteLine("-› Марка – {0}, имя – {1}, цвет – {2}.",
myDataReader["Make"].ToString().Trim(),
myDataReader["PetName"].ToString().Trim(),
myDataReader["Color"].ToString().Trim());
}
// Поскольку был указан CommandBehavior.CloseConnection,
// для соединения нет необходимости явно вызывать Close().
myDataReader.Close();
}
}
Работа с объектами соединения
Первым шагом в работе с поставщиком данных является создание соединения с источником данных, для чего мы используем объект соединения (который, как вы помните, получается из Disconnection). Типы соединения .NET получают на вход форматированную строку соединения, содержащую набор пар имен и значений, разделенных точками с запятой. Эта информация используется для идентификации машины, с которой требуется установить соединение, параметров безопасности, имени базы данных на удаленной машине и других данных, связанных с конкретным поставщиком данных.
По предыдущему программному коду вы можете заключить, что имя Initial Catalog (исходный каталог) дает ссылку на базу данных, с которой вы пытаетесь соединиться (Pubs, Northwind, Cars и т.д.). Имя Data Source (Источник данных) идентифицирует имя машины, поддерживающей базу данных (для простоты здесь предполагается, что для администраторов локальной системы никакого пароля не требуется).
Замечание. Чтобы узнать больше о парах имен и значений для той конкретной СУБД, которую используете вы, в документации .NET Framework 2.0 SDK найдите и прочитайте описание свойства ConnectionString объекта соединения для вашего поставщика данных.
После создания строки соединения само соединение с СУБД устанавливается с помощью вызова Open(). В дополнение к ConnectionString, Open() и Close() объект соединения предлагает еще целый ряд членов, которые позволяют настроить дополнительные параметры соединения, например, такие, как время ожидания и свойства транзакций. Описания некоторых членов базового класса DbConnection предлагаются в табл. 22.6.
Таблица 22.6. Члены типа DbConnection
Член Описание BeginTransaction() Метод, используемый для начала транзакции ChangeDatabase() Метод, используемый для смены базы данных при открытом соединении ConnectionTimeout Доступное только для чтения свойство, возвращающее значение времени ожидания установки соединения, прежде чем будет сгенерирована ошибка (значением по умолчанию является 15 секунд). Чтобы изменить значение, используемое по умолчанию, укажите в строке соединения требуемое значение Connect Timeout (Например, Сonnect Timeout=30) Database Свойство, сообщающее имя базы данных, используемой объектом соединения DataSource Свойство, сообщающее информации о месте размещения базы данных, используемой объектом соединения GetSchema() Метод, возвращающий объект DataSet, который содержит схему базы данных, полученную от источник данных State Свойство, устанавливающее текущее состояние соединения в соответствии со значениями из перечня ConnectionState
Как видите, свойства типа DbConnection в большинстве своем доступны только для чтения (в силу своей природы) и оказываются полезными только тогда, когда вы хотите получить характеристики соединений в среде выполнения. Чтобы переопределить значение, устанавливаемое по умолчанию, вы должны изменить строку соединения. Например, следующая строка соединения увеличивает время ожидания соединения с 15 до 30 секунд (путем указания соответствующего значения в сегменте Connect Timeout строки соединения).
static void Main(string[] args) {
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "uid=sa;pwd=;initial Catalog=Cars;" +
"Data Source= (local);Connect Timeout = 30";
cn.Open();
// Новая вспомогательная функция (см. ниже).
ShowConnectionStatus(cn);
…
}
В этом фрагменте программного кода обратите внимание на то, что теперь объект соединения передается в виде параметра новому вспомогательному статическому методу ShowConnectionStatus() класса Program, реализованному так, как показано ниже.
static void ShowConnectionStatus(DbConnection cn) {
// Отображение информации о текущем объекте соединения.
Console.WriteLine("***** Информация о соединении *****");
Console.WriteLine("Размещение базы данных: {0}", cn.DataSource);
Console.WriteLine("Имя базы данных: {0}", cn.Database);
Console.WriteLine ("Время ожидания: {0}", cn.ConnectionTimeout);