在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 中不起作用吗?
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();
}
}
虽然 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();
}