我正在尝试使用 dapper 并将我在此处使用 DDL 定义的整数列表传递给存储过程
CREATE TYPE [dbo].[BrandIDSet] AS TABLE ([BrandID] INT NULL);
我创建了这个存储过程:
CREATE PROCEDURE dbo.usp_getFilteredCatalogItems
@BrandIDSet [dbo].[BrandIDSet] READONLY
并尝试在 C# 代码中将该参数的值传递为
public async Task<PaginatedCatalogItemsVM> GetFilteredCatalogItems(int pageSize, int pageNumber, List<int> brandIDSet)
{
..
string storedProcName = "dbo.usp_getFilteredCatalogItems";
paginatedItemsVM.CatalogItemResults = await connection.QueryAsync<CatalogItemVM>(storedProcName, new { BrandIDSet = brandIDSet }, commandType: CommandType.StoredProcedure);
然而,dapper 似乎并没有按预期转换列表。使用上面的代码,将导致执行以下 SQL
exec dbo.usp_getFilteredCatalogItems @BrandIDSet1=1
这是不对的,因为 BrandIDSet1 不是参数的名称。精氨酸。
因此,结果是
SqlException:@BrandIDSet1 不是过程 usp_getFilteredCatalogItems 的参数。
如何将类型转换为正确的 SQL?
您可以传递 DataTable 以获得正确的结果。您可以尝试下面的代码;
var dt = new DataTable();
dt.Columns.Add(new DataColumn("BrandID", typeof(int)));
foreach (var id in brandIDSet)
{
var row = dt.NewRow();
row["BrandId"] = id;
dt.Rows.Add(row);
}
string storedProcName = "dbo.usp_getFilteredCatalogItems";
paginatedItemsVM.CatalogItemResults = await connection.QueryAsync<CatalogItemVM>(storedProcName, new { BrandIDSet = dt }, commandType: CommandType.StoredProcedure);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)