русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Доступ к данным C# | Си Шарп

Для доступа к данным на платформе .NET используется библиотека классов ADO.NET. Основу этой библиотеки составляют класс DataSet и классы, реализующие следующие основные интерфейсы: IDbConnection, IDbCommand, IDataReader, IDataAdapter. Используя ADO.NET возможно реализовать как классические клиент-серверные приложения, в которых клиентское приложение напрямую обращается к базе данных с помощью SQL-запросов, так и многоуровневые рассоединенные приложения, в которых важно иметь возможность работать с не имеющими постоянного подключения к серверу баз данных копиями данных.

Главную роль в создании рассоединенных приложений играет класс Dataset, позволяющий создавать локальный набор взаимосвязанных таблиц. Также необходимо отметить, что с помощью ADO.NET можно обращаться к самым различным источникам данных. Работы с различными источниками данных реализована с помощью управляемых провайдеров (managed provider). Управляемый провайдер - набор классов, реализующих интерфейсы IDbConnection, IDbCommand, IDataReader, IDbDataAdapter и предназначенный для работы с определенным источником данных. Для работы с Microsoft SQL Server и Oracle используются провайдеры SQL и Oracle, оптимизированные для работы именно с этими СУБД. Кроме того, в состав ADO.NET включен провайдер OLEDb, позволяющий работать с любыми источниками данных, поддерживающих протокол OLE DB.

Интерфейс IDbConnection (реализован в классе SqlConnection провайдера SQL) - предназначен для создания соединения (connection) с источником данных. Для указания источника данных для создания соединения используется строка соединения (connection string). Строка соединения содержит пары "параметр=значение", разделенных символом точка с запятой. Информация, которая должна быть указана в строке соединения, зависит от источника данных. При создании соединения с Microsoft SQL Server необходимо указать значения для следующих параметров: server - имя компьютера (или его IP адрес), на котором установлен Microsoft SQL Server; uid - учетная запись пользователя Microsoft SQL Server, от имени которого создается соединение; pwd - пароль учетной записи пользователя Microsoft SQL Server, от имени которого создается соединение; database - имя базы данных, с которой необходимо создать соединение. Строка соединения может быть указана при вызове конструктора объекта класса SqlConnection, либо через присвоение значения свойству ConnectionString интерфейса IDbConnection.

Для открытия соединения с базой данных используется метод void Open() интерфейса IDbConnection. Для закрытия соединения с базой данных используется метод void Close() интерфейса IDbConnection. Шаблон работы с соединением:

SqlConnection con = new SqlConnection("server=...;uid=...;pwd=...;database=...");
con.Open();
try{
...
}
finally{
con.Close();
}

На практике используются два варианта работы с соединением с базой данных. Если количество пользователей невелико и клиентское приложение при этом часто обращается к базе данных рекомендуется создать один объект соединения с базой данных для всего приложения и держать соединение открытым в течение всего времени работы приложения.

Если количество пользователей велико и клиентское приложение не часто обращается к базе данных, рекомендуется открывать соединение только на время выполнения запросов и использовать организацию пула соединений (connection pooling). Открытие соединения с базой данных обычно требует определенного времени и ресурсов. Пул соединений содержит коллекцию открытых соединений с базой данных. При вызове метода Open пул соединений проверяет наличие свободного соединения в пуле и возвращает его клиентскому приложению. При вызове метода Close соединение фактически не закрывается, а возвращается обратно в пул соединений. Соединения объединяются в пул соединений по признаку совпадения строки соединения. Если открывается соединение, в котором строка соединения отличается от строки, использованной в предыдущих соединениях, создается новый пул соединений. Использование пула соединений позволяет существенно повысить производительность приложений с большим количеством одновременно работающих пользователей. Использование пула соединений включено по умолчанию при работе с ADO.NET.

Рекомендуется выносить информацию о строке соединения во внешний файл или хранить ее в реестре. Такой подход позволяет гибко, безопасно и централизованно настраивать подключение к источнику данных. Для доступа к реестру используется класс RegistryKey. Для указания требуемой корневой ветки реестра используются статические поля CurrentUser и LocalMachine класса Registry. Данные поля применяются для инициализации переменных типа RegistryKey. Для открытия нужной ветки реестра используется метод RegistryKey CreateSubKey(string subkey), который открывает существующую ветку реестра или создает новую. Для чтения значения из реестра применяется метод object GetValue(string name). Для записи значения в реестр применяется метод void SetValue(string name,object value). Шаблон чтение значения из реестра:

RegistryKey key=Registry.CurrentUser;
key=key.CreateSubKey("ветка реестра");
try {
value=(string)key.GetValue("параметр");
if (value == null)
throw new Exception();
}
catch {
key.SetValue("параметр", "значение");
}

Интерфейс IDbCommand (реализован в классе SqlCommand провайдера SQL) - предназначен для выполнения произвольных SQL запросов к базе данных. Текст SQL запроса обычно указывается при вызове конструктора объекта класса SqlCommand. Также при вызове конструктора следует указать объект соединения с базой данных. При формировании строки SQL запроса можно использовать форматирование строк с помощью статического метода Format класса String.

Для выполнения SQL запроса к базе данных, который не возвращает в качестве результата набора записей, используется метод int ExecuteNonQuery() интерфейса IDbCommand. При вызове метод возвращает количество записей, задействованных при выполнении запроса. Данный метод применяется при выполнении таких запросов, как, например, INSERT, UPDATE, DELETE или выполнении содержащих их хранимых процедур, а также запросов языка манипулирования данными и языка управления данными. Шаблон выполнения метода ExecuteNonQuery:

SqlConnection con;
...
SqlCommand com = new SqlCommand("текст запроса SQL",con);
try{
com.ExecuteNonQuery();
}
catch(Exception ex){
}

Так как при выполнении запроса SQL могут возникнуть различные ошибки, рекомендуется помещать вызов метода ExecuteNonQuery в блок try-catch.

Для выполнения SQL запроса к базе данных, который возвращает в качестве результата набор записей, используется метод IDataReader ExecuteReader(CommandBehavior behavior) интерфейса IDbCommand. В классе SqlCommand также определен упрощенный метод SqlDataReader ExecuteReader(). Метод ExecuteReader применяется для получения данных из базы данных, которые в клиентском приложении доступны только для чтения (read-only) и могут быть просмотрены только по порядку (forward-only). Использование ExecuteReader особенно эффективно для получения большого количества данных, поскольку полученные данные не кэшируются в оперативной памяти.

Для чтение следующей записи из объекта, поддерживающего интерфейс IDataReader, используется метод bool Read() интерфейса IDataReader, возвращающий значение true, если запись успешно прочитана, и false в противном случае. Необходимо обратить внимание на тот факт, что метод Read должен быть вызван до первого обращения к полям записи. Для чтения значений в полях очередной записи можно использовать метод object GetSqlValue (int i) класса SqlDataReader, в качестве параметра которого указывается номер поля (нумерация полей начинается с нуля). Также для доступа к значениям полей можно использовать индексатор по номеру или по имени поля. Шаблон выполнения метода ExecuteReader:

SqlConnection con;
...
SqlCommand com = new SqlCommand("текст запроса SQL",con);
try{
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read()){
for (int i = 0; i < rd.FieldCount; i++)
object value=rd.GetSqlValue(i);
или object value=rd[i];
}
}
catch(Exception ex){
}
finally{
rd.Close();
}

Если имена полей известны, то шаблон выполнения метода ExecuteReader может выглядеть следующим образом:

SqlConnection con;
...
SqlCommand com = new SqlCommand("текст запроса SQL",con);
try{
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read()){
object value=rd["имя поля"];
}
}
catch(Exception ex){
}
finally{
rd.Close();
}

Рекомендуется выносить тексты запросов SQL, которые используются при работе с интерфейсом IDbCommand, во внешний файл или в таблицу в базе данных. Подобное решение позволяет существенно упросить разработку и сопровождение программы. Внешний файл, хранящий тексты запросов SQL, может иметь формат XML. Для доступа к файлам в формате XML используется класс XmlDocument. Для открытия требуемого файла используется метод void Load(string filename) класса XmlDocument.

Для нахождения в документе XML требуемого узла по его имени используется метод XmlNode SelectSingleNode(string xpath) класса XmlDocument. В качестве параметра методу SelectSingleNode передается запрос XPath, в котором указывается информация о требуемом узле. На практике часто используются следующие шаблоны запросов XPath:

"//узел" - выбор узла по его имени;
"//узел[@атрибут='значение']" - выбор узла по его имени и значению атрибута.

Для доступа к содержимому узла применяется класс XmlNode. Информация в узле может находится в форме текстового значения узла или в форме атрибутов узла. Для доступа к текстовому значению узла используются свойства string Value{ get; set; } и string InnerText{ get; set; } класса XmlNode. Шаблон получения текстового значения узла по его имени:

XmlDocument doc=new XmlDocument();
try{
doc.Load("имя файла");
XmlNode node=doc.SelectSingleNode("//имя узла");
string value=node.Value; 
}
catch(Exception ex){
}

Для доступа к атрибутам узла используется свойство XmlAttributeCollection Attributes{ get; } класса XmlNode, возвращающее коллекцию объектов класса XmlAttribute. Доступ к элементам коллекции атрибутов может производится по индексу или по имени. Для доступа к текстовому значению атрибута используется свойство string Value{ get; set; } класса XmlAttribute. Шаблон получения атрибута узла по его имени:

XmlDocument doc=new XmlDocument();
try{
doc.Load("имя файла");
XmlNode node=doc.SelectSingleNode("//имя узла");
string value=node.Attributes["имя атрибута"].Value; 
}
catch(Exception ex){
}

Для доступа к подчиненным узлам используется свойство XmlNodeList ChildNodes{ get; } класса XmlNode, возвращающее коллекцию объектов класса XmlNode. Шаблон перебора подчиненных узлов заданного по имени узла:

XmlDocument doc=new XmlDocument();
try{
doc.Load("имя файла");
XmlNode node=doc.SelectSingleNode("//имя узла");
foreach(XmlNode child in node.ChildNodes){
string value=child.Value;
}
}
catch(Exception ex){
}

Для хранения текстов запросов SQL можно использовать файл XML со следующей структурой:

<?xml version="1.0" encoding="UTF-8"?>
<sql>
<query name="имя запроса">текст запроса</query>
</sql>

Шаблон выполнения запроса SQL, текст которого сохранен в файле XML с приведенной выше структурой:

string query;
XmlDocument doc=new XmlDocument();
try{
doc.Load("имя файла");
XmlNode node=doc.SelectSingleNode("//query[@name='имя запроса']");
query=node.Value;
}
catch(Exception ex){
}
SqlConnection con= new SqlConnection("server=...;uid=...;pwd=...;database=...");
con.Open();
SqlCommand com = new SqlCommand(query,con);
try{
com.ExecuteNonQuery();
}
catch(Exception ex){
}

Интерфейс IDataAdapter (реализован в классе SqlDataAdapter провайдера SQL) - предназначен для заполнения данными из источника данных объекта DataSet и последующего обновления источника данных в соответствии со сделанными в объекте DataSet изменениями. Текст SQL запроса для получения данных обычно указывается при вызове конструктора объекта класса SqlDataAdapter. Также при вызове конструктора следует указать объект соединения с базой данных. При формировании строки SQL запроса можно использовать форматирование строк с помощью статического метода Format класса String.

Для заполнения объекта DataSet данными используется метод int Fill(DataSet dataSet) интерфейса IDataAdapter. При вызове метод возвращает количество записей, переданных в объект DataSet. Шаблон выполнения метода Fill:

SqlConnection con;
...
DataSet data;
SqlDataAdapter ad = new SqlDataAdapter("текст запроса SQL",con);
try{
ad.Fill(data);
}
catch(Exception ex){
}

Для доступа к таблице в объекте DataSet используется свойство DataTableCollection Tables{ get; } класса DataSet, возвращающее коллекцию объектов класса DataTable. Доступ к элементам коллекции таблиц может производится по индексу или по имени. Для доступа к требуемой записи таблицы используется свойство DataRowCollection Rows { get; } класса DataTable, возвращающее коллекцию объектов класса DataRow. Доступ к элементам коллекции записей производится по индексу. Для доступа к требуемому полю записи таблицы используется индексатор по номеру или по имени поля класса DataRow. Шаблон чтения данных объекта DataSet:

DataSet data;
...
for(int i=0; i < data.Tables[0].Rows.Count; i++){
for(int j=0; j < data.Tables[0].Columns.Count; j++){
object value=data.Tables[0].Rows[i][j];
}
}

Для изменения значений в полях таблицы в объекте DataSet необходимо присвоить новое значение полю требуемой записи.

DataSet data;
...
data.Tables[0].Rows[номер записи][номер поля]=значение;
data.Tables[0].Rows[номер записи]["название поля"]=значение;

Для добавления новой записи в таблицу в объекте DataSet необходимо создать новую запись, вызвав метод DataRow NewRow() класса DataTable, присвоить значения полям созданной запис и добавить запись в коллекцию записей таблицы, вызвав метод void Add(DataRow row) свойства Rows класса DataTable.

DataSet data;
...
DataRow row=data.Tables[0].NewRow();
row["название поля"]=значение;
...
data.Tables[0].Rows.Add(row);

Для удаления записи из таблицы в объекте DataSet необходимо вызвать метод void Delete() класса DataRow, а затем вызвать метод void AcceptChanges() класса DataTable.

DataSet data;
...
data.Tables[0].Rows[номер записи].Delete();
data.Tables[0].AcceptChanges();

Для сохранения всех сделанных в объекте DataSet изменений в источник данных необходимо вызвать метод int Update(DataSet dataSet) интерфейса IDataAdapter. При вызове метод возвращает количество записей, измененных в источнике данных.

DataSet data;
...
try{
ad.Update(data);
}
catch(Exception ex){
}

Просмотров: 11927

Вернуться в оглавление:Введение в разработку распределенных информационных систем




Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.