代码之家  ›  专栏  ›  技术社区  ›  Judy007

使用Dapper,如何将sql类型的值作为param传入?

  •  0
  • Judy007  · 技术社区  · 6 年前

    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
    

    因此,它导致

    SqlException:@BrandIDSet1不是过程usp\u getFilteredCatalogItems的参数。

    如何将类型转换为正确的SQL?

    1 回复  |  直到 6 年前
        1
  •  2
  •   ali    6 年前

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