Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6
После установки подключения мы можем выполнить к базе данных какие-либо команды, например, добавить в базу данных объект, удалить, изменить его или просто извлечь. Команды представлены объектом интерфейса 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
вывести добавленную строку:
Обновление будет происходить аналогично, только теперь будет использоваться 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