【问题标题】:Using Dapper, how do I pass in the values for a sql type as param?使用 Dapper,如何将 sql 类型的值作为参数传递?
【发布时间】:2018-10-06 21:04:37
【问题描述】:

我正在尝试使用 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?

【问题讨论】:

    标签: asp.net sql-server asp.net-core dapper


    【解决方案1】:

    您可以传递 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多