Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Соединение с базой и чтение данных

Поиск

Задача. Вам нужно установить соединение с базой данных и выдать простой за­прос к ней.

Решение. Работа с большинством баз данных сводится к следующим шагам:

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.191.154.132 (0.006 с.)