Передача IEnumerable <string> в хранимую процедуру SQL Server в качестве пользовательского параметра типа таблицы

1

Я пытаюсь передать список строк в качестве параметра в процедуру хранения, которая ожидает UDT таблицы с одним столбцом. Я сталкиваюсь с ошибками с объектом SqlCommand, и я нашел сообщения, которые говорят, что используют DataTable:

Как передать пользовательский тип таблицы как хранимый параметр в С#

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

Есть ли лучший способ или просто конвертировать в DataTable?

Благодарю!

Теги:
sql-server
stored-procedures
user-defined-types

2 ответа

3
Лучший ответ

Вам не нужно использовать DataTable:

System.Data.SqlClient поддерживает DbDataReader табличных параметров из DbDataReader DataTable, DbDataReader или System.Collections.Generic.IEnumerable<SqlDataRecord> ([T: System.Collections.Generic.IEnumerable'1)]. Вы должны указать имя типа для параметра table-valued, используя свойство TypeName для SqlParameter. ТипName должен соответствовать имени совместимого типа, ранее созданного на сервере. Следующий фрагмент кода демонстрирует, как настроить SqlParameter для вставки данных.

Вышеприведенное из табличных значений (MSDN).

... но использование DataTable, вероятно, намного проще, чем альтернативы; здесь простой пример, показывающий, как создать DataTable из IEnumerable<string>:

IEnumerable<string> strings = new List<string>() { "blah", "blah blah", "blah blah blah" };

DataTable table = new DataTable();

table.Columns.Add(
    new DataColumn()
    {
        DataType = Type.GetType("System.String"),
        ColumnName = "String"
    });

DataRow row;

foreach (string aString in strings)
{
    row = table.NewRow();
    row["String"] = aString;
    table.Rows.Add(row);
}
2

Совет Кенни был тем, что я искал. Здесь фактическая реализация, минус инициализация нормальной команды.

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn() 
 { DataType = Type.GetType("System.String"), ColumnName = "colname" });

DataRow row;

stringArray.ToList().ForEach(s => 
 { 
   row = dt.NewRow();
   row["colname"] = s;
   dt.Rows.Add(row); 
 });

cmd.Parameters.Add(new SqlParameter("@colname", SqlDbType.Structured)
 {
   Direction = ParameterDirection.Input,
   Value = dt,
 });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню