Главная » C# » Обращение к базе данных с помощью ADO.NET

0

Для прямого обращения к базе данных посредством ADO.NET применяются иерфейсы ADO.NET. Первым шагом для получения доступа будет определение подключения.   Установив   подключение,   можно   манипулировать   информацией в таблицах базы данных — добавлять, удалять и обновлять записи в таблицах.

Мы  будем  продолжать  работать с базой данных для  примера лотереи,  созданной в предыдущих разделах, применяя для этого драйвер SQL Server Compact Edition ADO.NET.  В  частности,  мы займемся  написанием  кода для добавления,  выборки и удаления записей.

ПРИМЕЧАНИЕ

Написание кода ADO.NET может быть легкой или трудоемкой задачей по той причине, что драйверы ADO.NET отличаются друг от друга. В этом разделе мы будем уделять основное внимание первостепенным аспектам ADO.NET,  а не особенностям  сервера SQL Server Compact Edition. Дополнительную информацию о сервере SQL Server Compact Edition см. на Web-сайте http://arcanecode.wordpress.comflag/sql-server- compact-edition/.

Подключение к базе данных

Подключение  к  базе данных устанавливается  с  помощью  следующего  кода,  демотрирующего общий  ПОДХОД (код добавляется  в приложение DatabaseConsoleEx): IDbConnection connection •= new SqlCeConnection(

DatabaseConsoleEx.Properties.Settings.Default.lotteryConnectionString);

Переменная connection является экземпляром клиента базы  данных.  Использовие этой переменной можно сравнить с действием  поднятия  телефонной  трубки, когда  вы  хотите  кому-то  позвонить.  Для  подключения   необходимо  предоставить имя пользователя,  пароль  и  имя  базы  данных,  к  которой  выполняется  подкление. Вся эта информация находится в свойстве lotteryConnectionString, сержимое  которого  было  определено,  когда  мы  конфигурировали  источник данных в Visual С#  Express (см.  рис.  14.3).

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

connection.Open();

Теперь  мы  можем  работать с таблицами  базы данных.

Добавление данных в таблицу

Созданная  таблица  draws не  содержит  никаких  данных.   Восполним  этот  пробел и добавим в нее содержимое.  Для  этого  применяется  команда  INSERT языка  SQL, как показано  в следующем  коде:

IDbCommand cmd =

new SqlCeCommand(@"INSERT INTO draws (draw_date, first_number,

second_number, third_number, fourth_number, " +

@"fifth_number, sixth_number, bonus) VALUES (?, ?, ?, ‘?, ?, ?, ? , ?)") ;

cmd.Connection = connection;

IDbDataParameter paramDate = new SqlCeParameter () ,- paramDate.ParameterName = "SpDrawDate"; paramDate.DbType = System.Data.DbType.DateTime;

16 Зак. 555

paramDate.Size = 8; paramDate.SourceColumn = "draw_date"; paramDate.Value = DateTime.Now; cmd.Parameters.Add(paramDate);

IDbDataParameter param = new SqlCeParameter(); param.ParameterName = "@pFirstNumber"; param.DbType = System.Data.DbType.Int32; param.Size = 4;

param.SourceColumn = "first_number"; param.Value = 1; cmd.Parameters.Add(param);

param = new SqlCeParameter(); param.ParameterName = "@pBonus"; param.DbType = System.Data.DbType.Int32; param.Size = 4;

param.SourceColumn = "bonus"; param.Value = 1;

cmd. Parameters . Add (param) ,-

cmd.ExecuteNonQuery(); connection.Close();

Чтобы выполнить команду, необходимо создать экземпляр iDbCommand, где паретром конструктора является оператор SQL, который необходимо выполнить. Оператор SQL выглядит несколько странно, т. к. он содержит кавычки. Эти кавыи являются заполнителями, которые считаются параметрами SQL. Определение параметров SQL часто зависит от реализации ADO.NET, но общепринятым подхом является применение кавычек. Команда ассоциируется с подключением к базе данных С помощью свойства cmd.Connection.

Независимо от типа применяемого драйвера базы данных, каждый параметр имеет ТИП IDbDataParameter ИЛИ IDataParameter. С интерфейсо м IDbDataParameter ассоциируется специфичный для сервера SQL Server Compact Edition тип SqlCeParameter. Если бы мы использовали другую базу данных, то тип, реализуий интерфейс IDataParameter или IDbDataParameter, был бы определен пругому, но реализовывал бы тот же самый интерфейс.

Интерфейс IDbDataParameter имеет следующие свойства:

• ParameterName — имя параметра должно начинаться символом

• DbType — тип параметра;

•    siz e — размер параметра;

• SourceColumn — столбец для хранения параметра. Так как оператор INSERT не имеет именованных параметров, то это свойство используется,  чтобы  опредить, куда поместить значение;

•    v a l u e  — значение, сохраняемое в таблице.

ПРИМЕЧАНИЕ

Как  правило,  следует  использовать  и  манипулировать  стандартными  интерфейсами ADO.NET,  а не типами, специфичными для драйвера ADO.NET.

В примере показан код, когда нужно явно определить атрибуты каждого парамеа. Таким образом, мы можем видеть, что происходит, когда параметры преобруются и сохраняются в таблице. Упрощенный вариант будет выглядеть так:

IDbConnectio n    c o n n e c t i o n   =    ne w   SqlCeConnection (

D a t a b a s e C o n s o l e E x . P r o p e r t i e s . S e t t i n g s . D e f a u l t . l o t t e r y C o n n e c t i o n S t r i n g ) ; c o n n e c t i o n . O p e n ( ) ;

IDbComman d   cm d   =   ne w   SqlCeCommand (

@"INSER T   INT O   draw s     (draw_date ,     f i r s t _ n u m b e r , second_number ,     third_number /        fourth_number ,     "    +

@"fifth_number ,    sixth_number ,    bonus )    VALUE S    (@draw_date ,

@first_number ,     @second_number ,    @third_number, "    +

@"@fourth_number,@fifth_number,@sixth_number,(©bonus)")        ; cmd.Connectio n    =    c o n n e c t i o n ;

cmd.Parameters.Add(ne w    SqlCeParameter("SpDrawDate" ,     DateTime.Now)) ; cmd.Parameters.Add(ne w    SqlCeParameter("SpFirstNumber" ,      1 ) ) ;

cmd.Parameters.Add(ne w    SqlCeParameter("SpSecondNumber" ,      1 ) ) ;

cmd.Parameters.Add(ne w    SqlCeParameter("SpThirdNumber" ,      1 ) ) ;

cmd.Parameters.Add(ne w    SqlCeParameter("SpFourthNumber" ,      1 ) ) ;

cmd.Parameters.Add(ne w    SqlCeParameter("SpFifthNumber" ,      1 ) ) ;

cmd.Parameters.Add(ne w    SqlCeParameter("SpSixthNumber" ,      1 ) ) ;

cmd.Parameters.Add(ne w    SqlCeParameter("SpBonus" ,      1 ) ) ;

После того как параметры определены и им присвоено значение, SQL-запрос готов к исполнению. Оператор SQL INSERT не возвращает никаких данных, т. к. данные посылаются от приложения базе данных. Поэтому необходимо выполнить метод, который   не   ожидает   возвращения   данных.   Таким   методом   является   метод

E x e c u t e N o n Q u e r y ( ) :

i n t    r e t v a l    =    cmd.ExecuteNonQuery() ;

C o n s o l e . W r i t e L i n e ( " r e t v a l     ( "    +   r e t v a l    +    " ) " ) ;

Выборка данных из таблицы

Теперь, когда наши таблицы содержат данные, можно попробовать извлечь эти данные. Для этого предназначен оператор SELECT. Далее приводится код для прмотра данных в таблице draws:

IDbConnection connection = new SqlCeConnection( DatabaseConsoleEx.Properties.Settings.Default.lotteryConnectionString);

connection.Open();

IDbCommand cmd = new SqlCeCommand*(@"SELECT * FROM draws"); cmd.Connection = connection;

IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) {

Console.WriteLine("(" + reader.GetDateTime(O) + ") " +

reader.Getlnt32(l) + ••");

}

reader.Close(); connection.Close();

Для получения данных открывается  подключение,  создается  и  исполняется  комаа. В примере оператор SELECT не имеет никаких параметров, SELECT * означает выбор всех столбцов,  но также  можно определить идентификаторы для выборки определенных   столбцов.

В случае с оператором SELECT сервер возвращает данные.  Для  чтения  возвращеых данных вызывается метод ExecuteReader (). Этот метод отличается от метода ExecuteNonQuery (), используемого для добавления данных, в основном тем, что он возвращает  экземпляр  интерфейса  IDataReader. Интерфейс  IDataReader служит для обработки в цикле отдельных записей, что предоставляет нам возможность  илечь  отдельные  поля  записей.

Для доступа к полям вызывается соответствующий метод Getromro, которому педается индекс поля. Какой индекс использовать, может быть неясно. Индекс стветствующего поля связан с  позицией  столбца  в  таблице.  Например,  следующий код извлекает четвертый столбец из  набора  результатов,  который  имеет,  по  краей  мере,  четыре столбца,

reader.GetDouble(3)

Удаление записей из базы данных

Удаление данных из БД — почти такая же распространенная операция, как и их добавление. Для удаления записей таблицы применяется оператор SQL DELETE. Следующий  код удаляет определенную запись  из таблицы  draws:

IDbCommand cmd = null;

cmd = new SqlCeCommand(@"DELETE FROM draws WHERE draw_date=? ", connection);

IDbDataParameter paramDate = new SqlCeParameter(); paramDate.ParameterName = "SpDrawDate"; paramDate.DbType = Systern.Data.DbType.DateTime; paramDate.Size = 8;

paramDate.SourceColumn = "draw_date"; paramDate.Value = DateTime.Now; cmd.Parameters.Add(paramDate);

cmd.ExecuteNonQuery(); connection.Close();

Как  и  оператор  INSERT,  оператор  DELETE не  возвращает данных  и  используется

С методом ExecuteNonQuery*).

Закрытие подключения к базе данных

После выполнения SQL-операторов подключение к базе данных необходимо зрыть, чтобы указать, что работа с базой данных завершена. Подключение закрается посредством следующего кода:

connection.Close() ;

Выводы об использовании ADO.NET

Посмотрев на весь код, представленный в этом разделе, вы должны заметить слующие моменты, относящиеся к прямому использованию ADO.NET:

•    применяются общие интерфейсы, реализованные конкретной библиотекой;

•    все драйверы ADO.NET реализуют интерфейсы iDbConnection и iDbCommand;

•    драйвер  базы  данных  предоставляет  специфичные  классы   sqiCeConnection,

SqlCeCommand И SqlCeParameter;

•    ADO.NET не требует использования предопределенных фабрик. Можно обраться к фабрике по умолчанию, но это не обязательно. Можно также написать свою фабрику. Программисты, в погоне за полным контролем, настраивают код инициализации ADO.NET, чтобы тот подходил к их установкам. Но после иниализации кода программисты хотят применять общие подходы и используют интерфейсы;

•    код для работы с базой данных предусматривает открытие подключения, опреление команды SQL, такой как INSERT, DELETE И Т. П., присваивание парамеов SQL, исполнение команды SQL и закрытие подключения.

ПРИМЕЧАНИЕ

Для получения дополнительной информации об SQL см. страницу Википедии по SQL (http://en.wikipedia.org/wiki/SQL) и учебное пособие по SQL школы W3School (http://www.w3schools.com/sql/default.asp). Эти источники предоставляют хорошее объяснение основ SQL. Еще одним стоящим  внимания  источником  информации  по SQL является документация MSDN.

Теперь рассмотрим другой инструмент Visual Studio Для работы  с приложениями баз данных.

Dataset Designer

Вспомогательное приложение Dataset Designer предназначено для облегчения нисания приложений баз данных. В MSDN имеется подробное учебное пособие по созданию клиентских приложений баз данных (http://msdn2.microsoft.com/en- us/Iibrary/h0y4a0f6(VS.80).aspx), Пособие описывает, как выбирать опции и иользовать мастеров, но не дает объяснения некоторых основополагающих приипов. Мы применим Dataset Designer для установки отношений между таблицами приложения лотереи и рассмотрим код, который генерируется автоматически для создания этих отношений.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии