Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции OOP c#.doc
Скачиваний:
46
Добавлен:
22.09.2019
Размер:
3.38 Mб
Скачать

4.4. Выполнение команд и запросов к базе данных

Работа с базой данных основана на выполнении запросов. Запросы принято классифицировать по следующей схеме:

1. Запросы, не возвращающие данных. Такие запросы часто называют командным (action query). Основных видов командных запросов два:

  • DML-запросы (Data Manipulation Language, язык управления данными). Они изменяют содержимое базы. Вот несколько примеров DML-запросов:

UPDATE Customers SET CompanyName = 'NewCompanyName'

WHERE CustomerID = 'ALF'

INSERT INTO Customers (CustomerID, CompanyName)

VALUES ('NewID', 'NewCustomer')

DELETE FROM Customers WHERE CustomerID = 'ALF'

  • DDL-запросы (Data Definition Language, язык определения данных). Эти запросы изменяют структуру БД:

CREATE TABLE Disks ([id] [int] NOT NULL,

[title] [varchar] (50) NOT NULL,

[artist_id] [int] NULL)

DROP PROCEDURE StoredProc

2. Запросы, возвращающие данные (select query). Эти запросы производят выборку данных из базы либо путем выполнения SQL-оператора SELECT, либо при помощи вызова хранимой процедуры, возвращающей некий результат (возможно, набор данных).

Для выполнения запросов любых типов в ADO.NET используются объекты класса Command (конкретное имя класса специфично для поставщика данных). Класс команды реализует интерфейс IDbCommand.

Для создания объекта Command существуют два основных способа. Первый – использование конструктора. Класс SqlCommand содержит три перегруженных конструктора: конструктор без параметров; конструктор, которому передается как параметр текст команды; конструктор, принимающий как параметры текст команды и объект-соединение:

SqlCommand cmd = new SqlCommand();

SqlCommand cmd1 = new SqlCommand("SELECT * FROM Artists");

SqlConnection con = new SqlConnection("Data Source=(local);" +

"Initial Catalog=CD_Rent;" +

"Integrated Security=SSPI");

SqlCommand cmd = new SqlCommand("SELECT * FROM Artists", con);

Второй способ – это создание команды на основе объекта Connection:

SqlConnection c = new SqlConnection();

SqlCommand cmd3 = c.CreateCommand();

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

SqlConnection c = new SqlConnection();

SqlCommand cmd = new SqlCommand();

cmd.Connection = c;

Свойство CommandText содержит текст команды, а свойство CommandType определяет, как следует понимать этот текст. Это свойство может принимать следующие значения:

  • CommandType.Text. Текст команды – это SQL-инструкции. Обычно такие команды передаются в базу без предварительной обработки (за исключением случаев передачи параметров). Этот тип команды устанавливается по умолчанию.

  • CommandType.StoredProcedure. Текст команды – это имя хранимой процедуры, которая находится в базе данных.

  • CommandType.TableDirect. Команда предназначена для извлечения из БД полной таблицы. Имя таблицы указывается в CommandText. Данный тип команд поддерживает только поставщик OLE DB.

Еще одну возможность для настройки команд предоставляет свойство CommandTimeout. Это время в секундах, в течение которого ожидается начало выполнения команды (по умолчанию – 30 секунд). Следует учитывать, что после начала выполнения команды данное свойство никакой роли не играет. Выполнение команды не прервется, даже если она будет получать данные из базы на протяжении, к примеру, одной минуты.

// Пример настройки команды

SqlConnection con = new SqlConnection();

con.ConnectionString = "Server=(local);Database=CD_Rent;" +

"Integrated Security=SSPI";

SqlCommand cmd = new SqlCommand();

cmd.Connection = con;

cmd.CommandText = "SELECT * FROM Artists";

// Следующую строку можно не писать

cmd.CommandType = CommandType.Text;

cmd.CommandTimeout = 3;

За подготовкой команды следует ее выполнение. Естественно, до выполнения команда должна быть связана с соединением, и это соединение должно быть открыто. В ADO.NET существует несколько способов выполнения команд, которые отличаются лишь информацией, возвращаемой из БД. Ниже перечислены методы выполнения команд, поддерживаемые всеми поставщиками.

  • ExecuteNonQuery(). Этот метод применяется для запросов, не возвращающих данные. Метод возвращает суммарное число строк, добавленных, измененных или удаленных в результате выполнения команды. Если выполнялся DDL-запрос, метод возвращает значение -1.

  • ExecuteScalar(). Метод выполняет команду и возвращает первый столбец первой строки первого результирующего набора данных. Метод может быть полезен при выполнении запросов или хранимых процедур, возвращающих единственных результат.

  • ExecuteReader(). Этот метод выполняет команду и возвращает объект DataReader. Тип возвращаемого ридера соответствует поставщику. Метод ExecuteReader() используется, когда требуется получить набор данных из базы (например, как результат выполнения команды SELECT).

В качестве примера использования метода ExecuteScalar() приведем код, при помощи которого подсчитывается число записей в таблице Artists:

SqlConnection con = new SqlConnection();

con.ConnectionString = "Server=(local);Database=CD_Rent;" +

"Integrated Security=SSPI";

SqlCommand cmd =

new SqlCommand("SELECT COUNT(*) FROM Artists", con);

con.Open();

// Приведение типов необходимо, так как метод ExecuteScalar()

// возвращает значение типа object

int count = (int) cmd.ExecuteScalar();

con.Close();

Console.WriteLine(count);

Изменим в предыдущем примере единственную строку:

SqlCommand cmd = new SqlCommand("SELECT * FROM Artists", con);

Как видим, команда настроена на получение набора данных. Однако в результате выполнения кода примера получим на консоли число 1. Это первый элемент в первой колонке id.

Поставщик SQL Server поддерживает метод, возвращающий объект класса, производного от XmlReader. Это метод ExecuteXmlReader(). Метод поддерживается для SQL Server 2000 и более поздних версий и требует, чтобы возвращаемые запросом или хранимой процедурой данные были в формате XML:

SqlConnection con = new SqlConnection();

con.ConnectionString = . . .;

SqlCommand cmd = new SqlCommand();

cmd.Connection = con;

cmd.CommandText = "SELECT * FROM Artists FOR XML AUTO";

// Открыли соединение

con.Open();

// Получили XmlReader

XmlReader xml = cmd.ExecuteXmlReader();

// Здесь как-то читаем и обрабатываем XML-данные

. . .

// Закрываем соединение

con.Close();