通过IEnumerable< string>到SQL Server存储过程中作为用户定义的表类型参数
本文关键字:过程中 用户 定义 类型参数 存储过程 存储 string IEnumerable Server SQL 通过 | 更新日期: 2023-09-27 18:03:31
我试图将字符串列表作为参数传递给存储过程,该存储过程期望具有单列的表的UDT。我遇到SqlCommand对象的错误,我发现帖子说要使用数据表:
如何在c#中传递用户定义表类型作为存储过程参数
考虑到我没有多个列,我想知道是否有更简单的方法。在此过程中,我将表类型作为对其他表的子选择来使用,因此保留此功能会很好。
是否有更好的方法,或者只是转换为DataTable?
谢谢!
您不必使用DataTable
:
System.Data。SqlClient支持从
DataTable
,DbDataReader
或System.Collections.Generic.IEnumerable<SqlDataRecord>
([T:System.Collections.Generic.IEnumerable ' 1)]对象填充表值参数。必须使用SqlParameter的TypeName属性为表值参数指定类型名称。TypeName必须匹配先前在服务器上创建的兼容类型的名称。下面的代码片段演示了如何配置SqlParameter来插入数据。
以上来自表值参数(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);
}
Kenny的建议正是我想要的。下面是实际的实现,减去正常的命令初始化。
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,
});