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

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

После установки подключения мы можем выполнить к базе данных какие-либо команды, например, добавить в базу данных объект, удалить, изменить его или просто извлечь. Команды представлены объектом интерфейса System.Data.IDbCommand. Провайдер для MS SQL предоставляет его реализацию в виде класса SqlCommand. Этот класс инкапсулирует sql-выражение, которое должно быть выполнено.

Для выполнения команды нам потребуется sql-выражение и объект подключения:

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand();
    command.CommandText = "SELECT * FROM Users";
    command.Connection = connection;
}

С помощью свойства CommandText устанавливается SQL-выражение, которое будет выполняться. В данном случае это запрос на получение всех объектов из таблицы Users. А с помощью свойства Connection можно установить объект подключения SqlConnection.

В качестве альтернативы можно было бы использовать одну из версий конструктора класса:

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
string sqlExpression = "SELECT * FROM Users";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand(sqlExpression, connection);
}

Чтобы выполнить команду, необходимо применить один из методов SqlCommand:

  • ExecuteNonQuery: просто выполняет sql-выражение и возвращает количество измененных записей. Подходит для sql-выражений INSERT, UPDATE, DELETE.

  • ExecuteReader: выполняет sql-выражение и возвращает строки из таблицы. Подходит для sql-выражения SELECT.

  • ExecuteScalar: выполняет sql-выражение и возвращает одно скалярное значение, например, число. Подходит для sql-выражения SELECT в паре с одной из встроенных функций SQL, как например, Min, Max, Sum, Count.

Добавление объектов

Выполним команду по добавлению одного объекта в таблицу Users базы данных usersdb, которая ранее была создана:

class Program
{
    static void Main(string[] args)
    {
        string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
        string sqlExpression = "INSERT INTO Users (Name, Age) VALUES ('Tom', 18)";
            
		using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlCommand command = new SqlCommand(sqlExpression, connection);
            int number = command.ExecuteNonQuery();
            Console.WriteLine("Добавлено объектов: {0}", number);
        }
        Console.Read();
    }
}

Для вставки объекта используется sql-выражение INSERT, которое имеет следующий синтаксис:

INSERT INTO название_таблицы (столбец1, столбец2, столбецN) VALUES ( значение1, значение2, значениеN)

В данном случае мы знаем, что в базе данных у нас есть таблица Users, в которой есть три столбца - Id и Age, хранящие целое число, и Name, хранящий строку. Поэтому соответственно мы добавляем для столбца Name значение 'Tom', а для столбца Age число 18.

Здесь метод ExecuteNonOuery() возвращает число затронутых строк (в данном случае добавленных в таблицу объектов). Хотя нам необязательно возвращать результат метода, но данный результат может использоваться в качестве проверки, что операция, в частности, добавление, прошла успешно.

Чтобы убедиться, что данные добавлены, мы можем перейти к таблице Users в SQL Server Management Studio и с помощью опции Select Top 1000 Rows вывести добавленную строку:

Добавление в БД через SqlCommand

Обновление объектов

Обновление будет происходить аналогично, только теперь будет использоваться sql-выражение UPDATE, которое имеет следующий синтаксис:

UPDATE название_таблицы
SET столбец1=значение1, столбец2=значение2, столбецN=значениеN
WHERE некоторый_столбец=некоторое_значение

Применим это выражение:

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";

string sqlExpression = "UPDATE Users SET Age=20 WHERE Name='Tom'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand(sqlExpression, connection);
    int number = command.ExecuteNonQuery();
    Console.WriteLine("Обновлено объектов: {0}", number);
}

Здесь обновляется строка, в которой Name=Tom, то есть выше добавленный объект. Если в таблице будет несколько строк, у которых Name=Tom, то обновятся все эти строки.

Удаление

Удаление производится с помощью sql-выражения DELETE, которое имеет следующий синтаксис:

DELETE FROM таблица
WHERE столбец = значение

Удалим, например, всех пользователей, у которых имя Tom:

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
string sqlExpression = "DELETE  FROM Users WHERE Name='Tom'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand(sqlExpression, connection);
    int number = command.ExecuteNonQuery();
    Console.WriteLine("Удалено объектов: {0}", number);
}

Во всех трех случаях фактически меняется только sql-выражение, а остальная логика остается неизменной. И мы также можем выполнять сразу несколько операций:

static void Main(string[] args)
{
    string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";

    Console.WriteLine("Введите имя:");
    string name = Console.ReadLine();

    Console.WriteLine("Введите возраст:");
    int age = Int32.Parse(Console.ReadLine());

    string sqlExpression = String.Format("INSERT INTO Users (Name, Age) VALUES ('{0}', {1})", name, age);
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        // добавление
        SqlCommand command = new SqlCommand(sqlExpression, connection);
        int number = command.ExecuteNonQuery();
        Console.WriteLine("Добавлено объектов: {0}", number);

		// обновление ранее добавленного объекта
		Console.WriteLine("Введите новое имя:");
        name = Console.ReadLine();
        sqlExpression = String.Format("UPDATE Users SET Name='{0}' WHERE Age={1}", name, age);
        command.CommandText = sqlExpression;
        number = command.ExecuteNonQuery();
        Console.WriteLine("Обновлено объектов: {0}", number);
    }       
    Console.Read();
}

Консольный вывод:

Введите имя:
Tom
Введите возраст:
41
Добавлено объектов: 1
Введите новое имя:
Alex
Обновлено объектов: 1
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850