我在使用 Dapper 执行现有存储过程时遇到问题。存储过程采用一些参数和用户定义类型对象的列表。我模仿了C#中所需的参数,但有些转换不顺利,导致出现异常(如下所示),我不知道如何解决它。
Sql 存储过程:
ALTER PROCEDURE [dbo].[MySp]
@Name VARCHAR(60),
@Size BIGINT,
@Photos MyPhoto READONLY
AS
BEGIN
... logic
其中 MyPhoto 是用户定义的表格类型,其中:
Name VARCHAR(25),
Model VARCHAR(25)
在 C# 方面我有:
public class MyClassForSP
{
public string Name {get;set;}
public Int64 Size {get;set;}
public List<Photos> Photos {get;set;}
}
public class Photos
{
public string Name {get;set}
public string Model {get;set;}
}
到目前为止,一切看起来对我来说都是合乎逻辑的...所以我尝试执行一个sql请求:
public void ExecuteSp(MyClassForSP classForSp)
{
using IDbConnection connection = new SqlConnection(_settings.ConnectionString);
var result = await connection.QuerySingleAsync<MyResult>("dbo.MySp", classForSp,
commandType: CommandType.StoredProcedure);
}
结果我遇到了 Dapper 错误:System.NotSupportedException:“MyNameSpace.Photos 类型的成员不能用作参数值”
您需要通过提供 DataTable
来使用
表值参数。
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Model");
foreach (var photo in classForSp.Photos)
{
dt.Rows.Add(photo.Name, photo.Model);
}
using IDbConnection connection = new SqlConnection(_settings.ConnectionString);
var result = await connection.QuerySingleAsync<MyResult>("dbo.MySp",
new
{
Name = classForSp.Name,
Size = classForSp.Size,
Photos = dt.AsTableValuedParameter("MyPhoto")
},
commandType: CommandType.StoredProcedure);