将IEnumerable <string>作为用户定义的表类型参数</string>传递给SQL Server存储过程

时间:2014-05-15 20:37:17

标签: c# sql-server stored-procedures user-defined-types

我正在尝试将字符串列表作为参数传递到存储过程中,该过程期望具有单个列的表的UDT。我遇到了SqlCommand对象的错误,并且我发现了使用DataTable的帖子:

How to pass User Defined Table Type as Stored Procedured parameter in C#

我想知道是否有更简单的方法考虑到我没有多列。在这个过程中,我使用表类型作为对其他表的子选择,所以保持这个功能会很好。

有更好的方法,还是只转换为DataTable?

谢谢!

2 个答案:

答案 0 :(得分:3)

您不必使用DataTable

  

System.Data.SqlClient支持从DataTableDbDataReaderSystem.Collections.Generic.IEnumerable<SqlDataRecord>([T:System.Collections.Generic.IEnumerable`1)]对象填充表值参数。您必须使用SqlParameter的TypeName属性为表值参数指定类型名称。 TypeName必须与先前在服务器上创建的兼容类型的名称匹配。以下代码片段演示了如何配置SqlParameter以插入数据。

以上内容来自Table-Valued Parameters (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);
}

答案 1 :(得分: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,
 });