C# / Dapper - 将 DataTable 作为输入参数传递给存储过程

问题描述 投票:0回答:2

在C#中,我使用Dapper与SQL Server交互。我调用一个接受 2 个用户定义的表作为参数的存储过程。

我正在将

DataTable
传递给我的存储过程。根据这个page,传递
DataTable
的语法是这样的:

DataTable value = new DataTable();

DynamicParameters allParameters = new DynamicParameters();
allParameters.Add("name", value, value.AsTableValuedParameter("dbo.udt_MyTable"), ParameterDirection.Input, -1);

但我收到此错误:

参数 3:无法从 'Dapper.SqlMapper.ICustomQueryParameter' 转换为 'System.Data.DbType?'

我的语法有什么问题吗?上述功能在 Dapper 中不起作用吗?

c# sql sql-server dapper
2个回答
0
投票
using (SqlConnection con1 = new SqlConnection(connectionstring))
 {
  using (SqlCommand cmd1 = new SqlCommand("your_procedure_name"))
    {
        cmd1.CommandType = CommandType.StoredProcedure;
        cmd1.Connection = con1;                                               

    SqlParameter Param = cmd1.Parameters.AddWithValue("@parameter_name", dt);
    Param.SqlDbType = SqlDbType.Structured;
        con1.Open();
        cmd1.ExecuteNonQuery();
        con1.Close();
    }
}

0
投票

虽然 UsmanMirza 发布的答案可以工作(这就是我在切换到 Dapper 之前所做的),但问题是如何使用 Dapper 来做到这一点。为了做到这一点,不要将参数放入 DynamicParameters 类型变量中,而是“内联(不确定这个词是否正确)”并将参数标记为表值参数。可以在这个简洁的示例 GitHub 页面上找到一个很好的示例。这是摘录:

private void ShowTVP(SqlConnection conn) { Console.WriteLine("Testing TVP"); Console.WriteLine(); var ut = new DataTable("UserTagsType"); ut.Columns.Add("UserId", typeof(int)); ut.Columns.Add("Tag", typeof(string)); ut.Rows.Add(5, "Developer"); ut.Rows.Add(5, "Data Guy"); ut.Rows.Add(1, "SysAdmin"); int affectedRows = conn.Execute( "INSERT INTO dbo.[UserTags] SELECT * FROM @ut", new { @ut = ut.AsTableValuedParameter("UserTagsType") }); Console.WriteLine($"Inserted {affectedRows} values into dbo.[UserTags] via TVP."); Console.WriteLine(); }
    
© www.soinside.com 2019 - 2024. All rights reserved.