Работа с базами данных в C#

Цель занятия

Познакомиться с принципами работы с базами данных в C#. Научиться читать, записывать и выбирать информацию из таблиц баз данных, используя SQL-запросы. Освоить работу с классами ADO.NET [8, 9].

Краткие теоретические сведения

В настоящем практическом занятии рассматривается работа с базами данных на основе классов ADO.NET. Имеется три способа использования этих классов через соединения:

□      SqlConnection;

□      OleDbConnection;

□      OdbcConnect ion.

Соединение sqiconnection предназначено для работы с сервером баз даных MS SQL-server 2000. В этой работе мы его не рассматриваем. Соединение OleDbConnection используется для связи "напрямую" с локальной базой данных (поддерживаются только базы данных Microsoft). Соединение 0dbcConnection

использует механизм драйверов ODBC для связи с широким диапазоном баз данных.

Начнем с oieDbConnection. Приводим сразу работоспособный пример и затем комментируем его (листинг 4.3).

i Листинг 4.3. Работа с базой данных на основе OleDbConnection

using System; using System.Data; using System.Data.01eDb; namespace lessonbasaconsole

/// <summary>

/// Summary description for Classl.

/// </summa ry> class Classl

/// <summary>

/// The main entry point for the application.

/ / / < / summa ry>

[STAThread]

static void Main(string[] args)

//

// TODO: Add code to start application here //

string connectingString =0"provider=Microsoft.Jet.OLEDB.4.0;

data source= c:\disk_d\msdev\mydb.mdb";

OleDbConnection myConn = new OleDbConnection (connectingString);

//Сформировать строку запросов

string selectString ="Select name,group from stud"; 01eDbCommand myCommand= myConn.CreateCommand(); myCommand.CommandText= selectString;

OleDbDataAdapter oda= new 01eDbDataAdapter(); oda.SelectCommand=myCommand;

DataSet myDataset= new DataSet(); myConn.Open();

string dataTableName="studA"; oda.Fill(myDataset,dataTableName);

DataTable myDataTable= myDataset.Tables[dataTableName]; foreach (DataRow dr in myDataTable.Rows)

{

Console.WriteLine("Name="+dr["name"]);

Console.WriteLine("Group="+dr["group"]);

}

string s= Console.ReadLine(); myConn.Close() ;

}

}

}

Сразу обратим внимание на подключаемые библиотеки классов. А теперь рассмотрим фрагмент, реализующий соединение с базой. Сначала строим строку соединения с локальной базой:

string connectingString=0"provider=Microsoft.Jet.OLEDB.4. 0;

data source= c:\disk_d\msdev\mydb.mdb";

Указанная здесь база данных mydb.mdb построена в Access. Она содержит таблицу stud, которая, в свою очередь, содержит всего два ПОЛЯ: name И group.

Следующая строка

OleDbConnection myConn = new OleDbConnec- tion (connectingString);

создает новое соединение с этой базой.

Затем с помощью трех строк:

string selectString ="Select name,group from stud"; OleDbCommand myCommand= myConn.CreateCommand();

myCommand.CommandText= selectString;

строим SQL-комавду для выполнения выборки из таблицы stud. Затем нужно подключить адаптер для связи с базой:

01eDbDataAdapter oda= new 01eDbDataAdapter(); oda.SelectCommand=myCommand;

Созданную ранее SQL-комавду присваиваем полю seiectcom- mand объекта-адаптера.

Далее создаем объект типа DataSet, который хранит выбираемые наборы данных из таблиц и хранит, в том числе, сами таблицы. После этого открываем соединение:

DataSet myDataset= new DataSet(); myConn.Open();

Теперь с помощью команд:

string dataTableName="studA"; oda.Fill(myDataset,dataTableName);

как раз и осуществляем выборку данных из базы и помещение их в условную таблицу studA (заметим, что имя реальной таблицы — stud).

Итак, oieAdapter располагает командой для связи с базой, и с помощью этой команды соединен с объектом-соединением (connection). Таким образом, при открытии соединения данные могут быть считаны адаптером в память. Адаптер выбирает данные и помещает их в таблицу studA командой oda.Fill(myDataset,dataTableName).

Теперь остается только прочитать данные из таблицы studA и отобразить их на консоли:

DataTable myDataTable= myDataset.Tables[dataTableName]; foreach (DataRow dr in myDataTable.Rows)

{

Console.WriteLine("Name="+dr["name"]);

Console.WriteLine("Group="+dr["group"]);

}

Результат работы представлен на рис. 4.3.

Рис. 4.3. Вывод на консоль записей таблицы stud

Описанный здесь порядок действий при работе с базой данных является общим и для двух других типов соединений.

Приводим пример той же программы для работы с ODBC (листинг 4.4). Заметим, что предварительно нужно создать ODBC- соединение с помощью утилиты ODBC Administrator, как это было сделано в Java (см. разд. "Java и базы данных"главы 2).

Листинг 4.4. Пример работы с базой данных на основе интерфейса ODBC

using System; using System.Data; using System.Data.Odbc; namespace odbcexample

/// <summary>

/// Summary description for Classl.

/// </summa ry> class Classl

/// <summary>

/// The main entry point for the application. / / / < / summa ry>

[STAThread]

static void Main(string[] args)

//

// TODO: Add code to start application here //

string connectingString ="DSN=myaccess";

OdbcConnection myConn = new OdbcConnection (connect ingString);

string mySelectQuery = "SELECT name,group FROM stud"; OdbcCommand myCommand = new OdbcCommand(mySelectQuery); myCommand.Connection= new OdbcConnection(connectingString); OdbcDataAdapter oda= new OdbcDataAdapter(); oda.SelectCommand=myCommand;

//Сформировать строку запроса DataSet myDataset= new DataSet(); myConn.Open();

string dataTableName="studA"; oda.Fill(myDataset,dataTableName);

DataTable myDataTable= myDataset.Tables[dataTableName]; foreach (DataRow dr in myDataTable.Rows)

{

Console.WriteLine("Name="+dr["name"]);

Console.WriteLine("Group="+dr["group"]);

}

string s= Console.ReadLine(); myConn.Close() ;

}

}

}

Обратим внимание на строки:

OdbcCommand myCommand = new OdbcCommand(mySelectQuery); myCommand.Connection= new OdbcConnection(connectingString); которыми отличается этот способ от предыдущего, а именно: нужно определять СВОЙСТВО Connection У объекта OdbcCommand. В остальном сходство обоих листингов вполне усматривается.

Запросы, отличные от SELECT, реализуются, как показано далее на примере команды iNSERT для вставки записи (листинг 4.5).

using System; using System.Data; using System.Data.Odbc; namespace odbcexample

/// <summary>

/// Summary description for Classl.

/// </summa ry> class Classl

/// <summary>

/// The main entry point for the application.

/ / / < / summa ry>

[STAThread]

static void Main(string[] args)

{

//

// TODO: Add code to start application here //

string myConnectionString="DSN=myaccess";

string myExecuteQuery="insert into stud values(‘han’,2,null)";

OdbcConnection myConnection = new OdbcConnection(myConnectionString);

OdbcCommand myCommand = new OdbcCommand(myExecuteQuery, myConnection);

myConnection.Open();

myCommand.ExecuteNonQuery();

myConnection.Close();

string s=Console.ReadLine();

Видим, что достаточно воспользоваться в этом случае только объектами odbcConnection и odbcCommand. Сам запрос выполняется на открытом соединении командой myCom- mand. ExecuteNonQuery (). Этот запрос, разумеется, не создает результирующего набора записей. Проверить результат его выполнения можно непосредственно, открыв таблицу stud в Access.

Задание

Создать консольное приложение, которое позволяло бы не только выбирать записи из базы данных, но и добавлять и удалять их. Для этих целей следует использовать язык запросов SQL.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100