Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 457; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.214 (0.006 с.) |