gpt4 book ai didi

c# - Dapper 是否支持 SQL 2008 表值参数 2?

转载 作者:太空狗 更新时间:2023-10-29 18:11:12 24 4
gpt4 key购买 nike

我知道 dapper 可以支持 TVF,但是如何将额外的参数与 TVF 一起发送(而不将其添加到 IntDynamicParam 类)?请参阅 Tests.cs 中的以下示例,我已修改以添加额外参数:

connection.Execute("CREATE TYPE int_list_type AS TABLE (n int NOT NULL PRIMARY KEY)");
connection.Execute("CREATE PROC get_ints @x int, @ints int_list_type READONLY AS select * from @ints");

我尝试了以下但出现错误(不存在从对象类型 SqlMapper.Tests+IntDynamicParam 到已知托管提供程序 native 类型的映射。):

var p = new DynamicParameters();
p.Add("x", 4);
p.Add("ints",new IntDynamicParam(new int[] { 1, 2, 3 }));

var nums = connection.Query<int>("get_ints", p).ToList();

感谢 Sam 的回复,但问题有点不同。我想知道如何将另一个变量与元组一起传递。请参阅下面修改后的 SP:

CREATE TYPE int_tuple_list_type AS TABLE (n int NOT NULL PRIMARY KEY, n2 int)

CREATE PROC get_int_tuples
@someVar varchar(10),
@ints int_tuple_list_type READONLY
AS select * from @ints

最佳答案

IDynamicParameters 没有什么神奇之处,您只需担心在准备好运行的打开 IDbCommand 上实现 AddParameters

假设您想要一个整数元组,您可以实现以下内容:

CREATE TYPE int_tuple_list_type 
AS TABLE (n int NOT NULL PRIMARY KEY, n2 int)
CREATE PROC get_int_tuples @ints
int_tuple_list_type READONLY AS select * from @ints

接着是:

class TupleIntDynamicParam : Dapper.SqlMapper.IDynamicParameters
{
IEnumerable<int> tuples;
public IntDynamicParam(IEnumerable<Tuple<int,int>> tuples)
{
this.tuples= tuples;
}

public void AddParameters(IDbCommand command)
{
var sqlCommand = (SqlCommand)command;
sqlCommand.CommandType = CommandType.StoredProcedure;

List<Microsoft.SqlServer.Server.SqlDataRecord> number_list =
new List<Microsoft.SqlServer.Server.SqlDataRecord>();

// Create an SqlMetaData object that describes our table type.
Microsoft.SqlServer.Server.SqlMetaData[] tvp_definition = {
new Microsoft.SqlServer.Server.SqlMetaData("n", SqlDbType.Int),
new Microsoft.SqlServer.Server.SqlMetaData("n2", SqlDbType.Int) };

foreach (int n in tuples)
{
// Create a new record, using the metadata array above.
Microsoft.SqlServer.Server.SqlDataRecord rec =
new Microsoft.SqlServer.Server.SqlDataRecord(tvp_definition);
rec.SetInt32(0, n.Item1);
rec.SetInt32(1, n.Item2);
number_list.Add(rec); // Add it to the list.
}

// Add the table parameter.
var p = sqlCommand.Parameters.Add("ints", SqlDbType.Structured);
p.Direction = ParameterDirection.Input;
p.TypeName = "int_tuple_list_type";
p.Value = number_list;

}
}

然后你可以传入元组:

var nums = connection.Query("get_int_tuples", 
new TupleIntDynamicParam (new Tuple<int,int>[]
{
Tuple.Create(1,2), Tuple.Create(2,3)
})).ToList();

关于c# - Dapper 是否支持 SQL 2008 表值参数 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6913610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com