Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Соединение с базой и чтение данныхСодержание книги
Поиск на нашем сайте
Задача. Вам нужно установить соединение с базой данных и выдать простой запрос к ней. Решение. Работа с большинством баз данных сводится к следующим шагам: 1) Создать соединение с помощью строки соединения. 2) Выдать команду в соответствии с синтаксисом SQL. 3) Выполнить команду через соединение и, возможно, получить данные. В следующих разделах вы увидите конкретные примеры того, как это делается. Чтобы код примеров в этой главе был работоспособным, в большинстве случаев требуется пространство имен System.Data.SqlClient, даже если в коде отсутствуют прямые ссылки на него. Реализацию данной задачи см. проект ConnectToSqlServer. Соединение с SQL Server Среда.NET поставляется с классом, обеспечивающим соединение с SQL Server, поэтому мы начнем с этого сервера базы данных. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient;
namespace ConnectToSqlServer { class Program { static void Main(string[] args) { try { string connectionString = GetConnectionString(); using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); //He забудьте передать команде объект-соединение using (SqlCommand cmd = new SqlCommand( "SELECT * FROM Books", conn) using (SqlDataReader reader = cmd.ExecuteReader()) { // Класс SqlDataReader читает ряды и базы данных // по одному, по мере того, как вы их запрашиваете while (reader.Read()) { Console.WriteLine("{0}\t{1}\t{2}", reader.GetInt32(0), reader.GetString(1), reader.GetInt32(2)); } } } } catch (SqlException ex) { Console.Write(ex); } Console.ReadKey(); } // Хранить строки соединения в исходном коде не нужно. // но здесь это сделано в иллюстративных целях static string GetConnectionString() { // Укажите источник данных, соответствующий // локальной копии SQL Server на вашем компьютере return @"Data source=NICOL_SRV\SQLEXPRESS; Initial Catalog=TestDB; Integrated Security=SSPI"; } } }
Этот код выводит следующие результаты: Les Miserables 1862 Notre-Dame de Paris 1831 Le Rhin 1842 Соединение с MySQL Фирма Sun (обладатель прав на MySQL в то время, когда писались эти строки) поставляет.NET-классы для работы с базами данных MySQL. Вы можете выбрать любой из двух вариантов установки: - воспользоваться программой-установщиком, которая поместит библиотеку MySql.Data.dll в глобальный кэш сборки (GAC, Global Assembly Cache), чтобы приложения MySql могли обращаться к ней; - поместить MySql.Data.dll в свой проект и обращаться к ней непосредственно из файловой системы. В коде, сопровождающем эту главу, выбрана вторая возможность. Хотя это дело вкуса, я предпочитаю минимизировать внешние зависимости проекта. После добавления ссылки на компонент код оказывается практически идентичным коду, работающему с SQL Server. Реализацию данной задачи см. проект ConnectToMySQL. using System; using System.Collections.Generic; using System.Linq; using System.Text; using MySql.Data.MySqlClient;
namespace ConnectToMySQL { class Program { static void Main(string[] args) { try { string connectionString = GetConnectionString(); // Практически код тот же самый, // но везде появился префикс “My” using (MySqlConnection conn = new MySqlConnection(connectionString)) { conn.Open(); using (MySqlCommand cmd = new MySqlCommand( "SELECT * FROM Books", conn)) using (MySqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("{0}\t{1}\t{2}", reader.GetInt32(0), reader.GetString(1), reader.GetInt32(2)); } } } } catch (MySqlException ex) { Console.Write(ex); } Console.ReadKey(); } // Хранить строки соединения в исходном коде не надо, // но здесь это сделано в иллюстративных целях static string GetConnectionString() { return @"Data source=localhost;Initial Catalog=TestDB; user=ben;password=password;"; } } }
Написание программы, не зависящей от сервера базы данных Задача. Вам нужна программа, которая будет работать с разными серверами баз данных. Решение. Вы, конечно, заметили, как похожи программы, работающие с MySQL и SQL Server. Дело в том, что все классы для обращения к базам данных в.NET являются производными от одного набора классов и интерфейсов. Если имеется возможность быстро переключаться с одного сервера баз данных на другой, то неплохо было бы максимально абстрагироваться от сервера, как это сделано в следующем простом примере. Реализацию данной задачи см. проект ConnectToEither. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.Common;
namespace ConnectToEither { class Program { enum DatabaseServerType { SqlServer, MySQL };
static void PrintUsage() { Console.WriteLine("ConnectToEither.exe[SqlServer | MySql]"); } static void Main(string[] args) { DatabaseServerType dbType; if (args.Length < 1) { PrintUsage(); return; } if (string.Compare("SqlServer", args[0]) == 0) { dbType = DatabaseServerType.SqlServer; } else if (string.Compare("MySQL", args[0]) == 0) { dbType = DatabaseServerType.MySQL; } else { PrintUsage(); return; } try { string connectionString = GetConnectionString(dbType); using (DbConnection conn = CreateConnection(dbType, connectionString)) { conn.Open(); using (DbCommand cmd = CreateCommand(dbType, "SELECT * FROM Books", conn)) using (IDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("{0}\t{1}\t{2}", reader.GetInt32(0), reader.GetString(1), reader.GetInt32(2)); } } } } catch (DbException ex) { Console.Write(ex); } Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } static string GetConnectionString(DatabaseServerType dbType) { switch (dbType) { case DatabaseServerType.SqlServer: return @"Data source=NICOL_SRV\SQLEXPRESS; Initial Catalog=TestDB; Integrated Security=SSPI"; case DatabaseServerType.MySQL: return @"Data source=localhost; Initial Catalog=TestDB; user=ben;password=password;"; } throw new InvalidOperationException(); } private static DbConnection CreateConnection( DatabaseServerType dbType, string connectionString) { switch (dbType) { case DatabaseServerType.SqlServer: return new System.Data.SqlClient.SqlConnection( connectionString); case DatabaseServerType.MySQL: return new MySql.Data.MySqlClient.MySqlConnection( connectionString); } throw new InvalidOperationException(); } private static string CreateSelectString( DatabaseServerType dbType) { // Необходимо помнить,что разные серверы // нередко предполагают немного разный синтаксис языка SQL, // но у такого простого запроса, как этот, синтаксис единый return "SELECT * FROM Books"; } private static DbCommand CreateCommand( DatabaseServerType dbType, string query, DbConnection conn) { switch (dbType) { case DatabaseServerType.SqlServer: return new System.Data.SqlClient.SqlCommand(query, conn as System.Data.SqlClient.SqlConnection); case DatabaseServerType.MySQL: return new MySql.Data.MySqlClient.MySqlCommand( query, conn as MySql.Data.MySqlClient.MySqlConnection); } throw new InvalidOperationException(); } } }
Примечания Когда вы пользуетесь базовыми классами для работы с базами данных, в вашем распоряжении имеются только функциональные возможности, общие для всех серверов. Но даже в этом случае есть вероятность, что какая-то база данных не поддерживает весь интерфейс. То есть, при попытке написать код, не зависящий от базы данных, вы все-таки вынуждены реализовать функциональность, специфичную для отдельных баз данных. В реальной ситуации вам придется потратить больше усилий, если вы хотите написать действительно полезный код, не зависящий от базы данных. Базы данных включают в себя множество функциональных составляющих, таких как триггеры, представления, хранимые процедуры и т. д. Поэтому достижение подлинной независимости кода потребует немалого труда.
|
||||
Последнее изменение этой страницы: 2016-04-26; просмотров: 370; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.10.75 (0.006 с.) |