我正在尝试将字符串列表作为参数传递到存储过程中,该过程期望具有单个列的表的UDT。我遇到了SqlCommand对象的错误,并且我发现了使用DataTable的帖子:
How to pass User Defined Table Type as Stored Procedured parameter in C#
我想知道是否有更简单的方法考虑到我没有多列。在这个过程中,我使用表类型作为对其他表的子选择,所以保持这个功能会很好。
有更好的方法,还是只转换为DataTable?
谢谢!
答案 0 :(得分:3)
您不必使用DataTable
:
System.Data.SqlClient支持从
DataTable
,DbDataReader
或System.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,
});