2014-05-15 34 views
1

我试图将字符串列表作为参数传递到存储过程,该过程期望具有单列的表的UDT。我正在与SqlCommand对象错误,我发现那个帖子说使用数据表:将IEnumerable <string>作为用户定义的表类型参数传递给SQL Server存储过程

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

我想知道是否有考虑到我没有多列一个简单的方法。在该过程中,我正在将表类型作为子选择与其他表进行操作,因此保留此功能将很不错。

有没有更好的方法,或者只是转换为DataTable?

谢谢!

+0

参见[目前公认的答案(http://stackoverflow.com/a/1253737/173497)现有问题[C# - 转换IEnumerable的数据表来(http://stackoverflow.com/questions/1253725/convert-ienumerable-to-datatable),您可以使用它将一个'IEnumerable'转换为'DataTable'。 –

回答

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可能比替代品容易得多;这里是展示如何从IEnumerable<string>创建DataTable一个简单的例子:

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, 
}); 
相关问题