Передача табличных данных в качестве параметра хранимой процедуры или функции (C#)

В предыдущей статье мы рассмотрели работу с параметрами возвращающими табличное значение в MS SQL Server. Но, как использовать преимущество таких параметров в клиентском приложении?

На самом деле, ответ на это вопрос во многом зависит от платформы, на которой приложение разрабатывается. В данной статье мы рассмотрим работу передачу табличных данных в качестве параметра хранимой процедуры или функции в C#.

В ходе рассмотрения мы будем использовать табличный тип данных и функцию описанные в статье по ссылке. Поэтому настоятельно рекомендуется вначале ознакомиться с данной статьёй, чтобы лучше понимать, о чём идёт речь.

В C# табличные наборы данных можно передать MS SQL Server в виде объекта DataTable, который по своей структуре соответствует требуемому табличному типу данных. Сформируем таблицу с необходимой структурой и заполним её данными.

DataTable carList = new DataTable();
carList.Columns.Add("id");
carList.Columns.Add("ModelTitle");
carList.Rows.Add(1, "UAZ");
carList.Rows.Add(2, "Lada");
carList.Rows.Add(3, "KAMAZ");

Теперь передадим эту таблицу в качестве параметра функции. Так как мы передаём данные табличного типа определённого пользователем требуется обязательно указать имя типа данных в свойстве TypeName.

SqlCommand command = new SqlCommand("SELECT dbo.CarListCount(@cars) AS t", connection);
command.Parameters.AddWithValue("@cars", carList);
command.Parameters["@cars"].TypeName = "dbo.CarList";

После этого можно выполнить функцию и получить её значение. Ниже приведён примерный полный код для данной операции.

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand("SELECT dbo.CarListCount(@cars) AS t", connection);
    command.Parameters.AddWithValue("@cars", carList);
    command.Parameters["@cars"].TypeName = "dbo.CarList";
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            int a = (int)reader.GetValue(0);
        }
    };
};

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

К сожалению стандартные ORM библиотеки от Microsoft (LinqToSQL, Entity Framework) имеют, в лучшем случае, ограниченную поддержку пользовательских табличных типов. Поэтому при работе с ними требуется выполнение прямого SQL запроса.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *