Параметры, которые используются в командах, могут быть нескольких типов. Тип параметра задается с помощью свойства
Direction
объекта SqlParameter. Данное свойство принимает одно из значений перечисления ParameterDirection:
Input
: параметр является входным, то есть предназначен для передачи значений в sql-выражение запроса. Это значение
по умолчанию для всех параметров
InputOutput
: параметр может быть как входным, так и выходным.
Output
: параметр является выходным, то есть используется для возвращения запросом каких-либо значений
ReturnValue
: параметр представляет результат выполнения выражения или хранимой процедуры
Используем выходные параметры для возвращения id строки, которая была добавлена:
using System; using System.Data; using System.Threading.Tasks; using Microsoft.Data.SqlClient; namespace HelloApp { class Program { static async Task Main(string[] args) { string connectionString = "Server=(localdb)\\mssqllocaldb;Database=adonetdb;Trusted_Connection=True;"; int age = 23; string name = "Kenny"; string sqlExpression = "INSERT INTO Users (Name, Age) VALUES (@name, @age);SET @id=SCOPE_IDENTITY()"; using (SqlConnection connection = new SqlConnection(connectionString)) { await connection.OpenAsync(); SqlCommand command = new SqlCommand(sqlExpression, connection); // создаем параметр для имени SqlParameter nameParam = new SqlParameter("@name", name); // добавляем параметр к команде command.Parameters.Add(nameParam); // создаем параметр для возраста SqlParameter ageParam = new SqlParameter("@age", age); // добавляем параметр к команде command.Parameters.Add(ageParam); // параметр для id SqlParameter idParam = new SqlParameter { ParameterName = "@id", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output // параметр выходной }; command.Parameters.Add(idParam); await command.ExecuteNonQueryAsync(); // получим значения выходного параметра Console.WriteLine($"Id нового объекта: {idParam.Value}"); } Console.Read(); } } }
Здесь к sql-выражению добавляется операция присвоения параметру id идентификатора добавленной строки: SET @id=SCOPE_IDENTITY()
.
Выражение SCOPE_IDENTITY()
представляет встроенную функцию MS SQL Server, которая возвращает идентификатор добавленной строки.
string sqlExpression = "INSERT INTO Users (Name, Age) VALUES (@name, @age);SET @id=SCOPE_IDENTITY()";
Для определения параметра используются его свойства. ParameterName
задает имя параметра, SqlDbType
указывает на тип параметра,
а свойство Direction
определяет тип параметра.
SqlParameter idParam = new SqlParameter { ParameterName = "@id", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output // параметр выходной };
После выполнения команды параметр получает значение, которое мы можем получить через его свойство Value
:
Console.WriteLine($"Id нового объекта: {idParam.Value}");