asp.net - 使用 Dapper,如何将 sql 类型的值作为参数传递?
问题描述
我正在尝试使用 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);
推荐阅读
- angular - 如何测试角度 - catchError 运算符'rxjs'
- android - 如何在 dataBinding 中为视图设置监听器功能(如 setOnClickListener)
- python - 为什么 Python 进度库会打印额外的字符
- xml - 带有列表框的多选下拉菜单
- c++ - 尝试制作自定义字符串类,但我不断收到 C2440 和 E0415 错误
- gdb - 使用 gdb 调试 xv6 内核 - 所选架构 i386 与报告的目标架构不兼容
- c# - 如何从公共静态无效中将值放入文本框中
- google-apps-script - 如何修复 DriveApp.getFiles() ... file.getName() 崩溃记录器(谷歌脚本 API)
- sql - 这个 JPA @Query 有什么问题?
- python - 数据框包含空值,但过滤后不显示空值。Python - 为机器学习准备数据