通过IEnumerable< string>到SQL Server存储过程中作为用户定义的表类型参数

本文关键字:过程中 用户 定义 类型参数 存储过程 存储 string IEnumerable Server SQL 通过 | 更新日期: 2023-09-27 18:03:31

我试图将字符串列表作为参数传递给存储过程,该存储过程期望具有单列的表的UDT。我遇到SqlCommand对象的错误,我发现帖子说要使用数据表:

如何在c#中传递用户定义表类型作为存储过程参数

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

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

谢谢!

通过IEnumerable< string>到SQL Server存储过程中作为用户定义的表类型参数

您不必使用DataTable:

System.Data。SqlClient支持从DataTable, DbDataReaderSystem.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,
 });