Как отправить параметр типа таблицы в T-SQL при использовании C # IDataReader? - PullRequest
3 голосов
/ 25 сентября 2011

Я написал t-sql sp, который получает таблицу в качестве параметра.

Я пытался вызвать ее из c #, но не знал, какой тип использовать:

database.AddInParameter(command, "@ID", DbType.String, id);
database.AddInParameter(command, "@TemplatesIds", DbType.WhatType??, dt);

using (IDataReader reader = database.ExecuteReader(command))
{
    while (reader.Read())
    {
    }
}

Что я должен использовать?

Ответы [ 3 ]

5 голосов
/ 25 сентября 2011

Поскольку вы используете t-sql, то вы можете использовать SqlDbType.Structured, если вы используете SQLCommand под вашим (я предполагаю) IDbCommand

var dt = new DataTable();
... set up dt ...
par = new SqlParameter("@TemplatesIds", SqlDbType.Structured, dt)

Есть довольно много примеров использования этого здесь на MSDN.

2 голосов
/ 25 сентября 2011
1 голос
/ 10 декабря 2015

может быть не лучший подход, но работает:

-- Create the data type
CREATE TYPE dbo.PlantList AS TABLE 
(
    plant_code char(1) Not Null Primary Key
)
GO

метод расширения

public static class DatabaseExtensions
{
    public static void AddTableTypeParameter<T>(this Database database, DbCommand command, string name, string sqlType, IEnumerable<T> values)
    {
        var table = new DataTable();
        PropertyInfo[] members = values.First().GetType().GetProperties();
        foreach (var member in members)
        {
            table.Columns.Add(member.Name, member.PropertyType);
        }

        foreach (var value in values)
        {
            var row = table.NewRow();
            row.ItemArray = members.Select(m => m.GetValue(value)).ToArray();
            table.Rows.Add(row); 
        }
        var parameter = new SqlParameter(name, SqlDbType.Structured)
        {
            TypeName = sqlType,
            SqlValue = table
        };
        command.Parameters.Add(parameter);
    }

}

и вызовите его следующим образом:

database.AddTableTypeParameter(command, "@region_filter_plants", "dbo.PlantList", regionFilterPlants.Select(p => new { plant_code = p }));
...