Команды

66

Создание команды

Теперь, когда мы разобрались с ролью объекта подключения, можно рассмотреть, как отправлять SQL-запросы в базу данных. Тип SqlCommand (порожденный от DbCommand) представляет собой объектно-ориентированное представление SQL-запроса, имени таблицы или хранимой процедуры. Тип команды указывается свойством CommandType, которое принимает значения из перечисления CommandType:

Возможные значения перечисления CommandType
Значение Пример SQL-запроса
Text (по умолчанию) string select = "SELECT ContactName FROM Customers";
SqlCommand cmd = new SqlCommand(select, cn);
StoredProcedure SqlCommand cmd = new SqlCommand("CustOrderHist", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CustomerID", "QUICK");
TableDirect OleDbCommand cmd = new OleDbCommand("Categories", conn);
cmd.CommandType = CommandType.TableDirect;

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

using (SqlConnection cn = new SqlConnection())
            {
                cn.ConnectionString = connect.ConnectionString;
                try
                {
                    //Открыть подключение
                    cn.Open();

                    // Создание объекта команды с помощью конструктора
                    string strSQL = "Select * From Inventory";
                    SqlCommand myCommand = new SqlCommand(strSQL, cn);

                    // Создание еще одного объекта команды с помощью свойств
                    SqlCommand testCommand = new SqlCommand();
                    testCommand.Connection = cn;
                    testCommand.CommandText = strSQL;
                }
                catch (SqlException ex)
                {
                    // Протоколировать исключение
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    // Гарантировать освобождение подключения
                    cn.Close();
                }
            }

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

Выполнение команд

После того, как команда определена, ее необходимо выполнить. Существует много способов издания оператора, в зависимости от того, какой возврат ожидается (если ожидается) от команды. Классы <provider>Command предлагают следующие методы выполнения:

ExecuteNonQuery()

выполняет команду, но не возвращает вывода;

ExecuteReader()

выполняет команду и возвращает типизированный IDataReader;

ExecuteScalar()

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

В дополнение к этим методам класс SqlCommand предлагает следующий метод: ExecuteXmlReader() — выполняет команду и возвращает объект XmlReader, который может быть использован для прохода по фрагменту XML, возвращенному из базы данных.

Метод ExecuteNonQuery() обычно используется для операторов UPDATE, INSERT или DELETE, где единственным возвращаемым значением является количество обработанных строк. Однако метод может вернуть результаты, если осуществляется вызов хранимой процедуры с выходными параметрами.

string strSQL = "UPDATE Customers SET LastName = 'Johnson' WHERE LastName = 'Walton'";
SqlCommand myCommand = new SqlCommand(strSQL, cn);
int i = myCommand.ExecuteNonQuery();

Метод ExecuteReader() выполняет команду и возвращает типизированный объект-читатель данных, в зависимости от используемого поставщика. Возвращенный объект может применяться для итерации по возвращенным записям.

string strSQL = "SELECT * FROM Inventory";
SqlCommand myCommand = new SqlCommand(strSQL, cn);
SqlDataReader dr = myCommand.ExecuteReader();
while (dr.Read())
     Console.WriteLine("ID: {0} Car Pet Name: {1}",dr[0],dr[3]);

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

Этот метод возвращает объект, который при необходимости может быть приведен к соответствующему типу. Если вызванный оператор SQL возвращает только один столбец, метод ExecuteScalar() предпочтительнее использовать перед любым другим методом, извлекающим столбец. Это также применимо к хранимым процедурам, которые возвращают единственное значение.

Пройди тесты
Лучший чат для C# программистов