将表值参数传递给存储过程

时间:2016-11-03 06:02:34

标签: c# sql-server stored-procedures dapper table-valued-parameters

在我的项目中,我们使用Dapper连接数据库进行操作。

我在SQL Server数据库中创建了一个存储过程:

CREATE PROCEDURE dbo.usp_Check
    @TestTableType [dbo].[TestTableType] READONLY
AS
BEGIN
  SELECT 
      TestTableType.BrokerNPN,
      CASE WHEN Sales.BrokerNPN IS NULL THEN 0 ELSE 1 END as isBrokerNPNExist
  FROM 
      [dbo].[tbl_Sales] Sales
  LEFT JOIN 
      @TestTableType TestTableType ON Sales.BrokerNPN = TestTableType.BrokerNPN
END 

在C#中,我试图使用这样的TVP来使用我的存储过程:

public void CheckSP(List<string> ParamData)
{
    using (var connection = new ConnectionProvider("DbName").GetOpenConnection())
    {
        var dt = new DataTable("dbo.TestTableType");
        dt.Columns.Add("NPN", typeof(string));
        dt.Rows.Add("12345");

        // First attempt
        var result = connection.Query<CheckData>("usp_Check", new { BrokerNPN = ParamData }, CommandType.StoredProcedure).ToList();

        // Second attempt
        var result = connection.Query<CheckData>("usp_Check", new { BrokerNPN = dt}, CommandType.StoredProcedure).ToList();
    }
}

但我无法将TVP传递给存储过程。

首次尝试时,我收到此错误

  

过程或函数CheckBrokerNPNExist指定了太多参数

对于第二次尝试,我不能直接使用pass DataTable

2 个答案:

答案 0 :(得分:0)

在c#code

中的[dbo]。[TestTableType]中使用相同的列名

答案 1 :(得分:0)

我认为您只是使用错误的名称作为参数......

请参阅存储过程定义:

CREATE PROCEDURE dbo.usp_Check
    @TestTableType [dbo].[TestTableType] READONLY

您的参数名为@TestTableType - 但当您从C#调用此存储过程时,您使用的是其他名称:

var result = connection
                .Query<CheckData>("usp_Check", 
                                  new { BrokerNPN = ParamData }, 
                                  CommandType.StoredProcedure).ToList();

我会尝试使用同名

var result = connection
                .Query<CheckData>("usp_Check", 
                                  new { TestTableType = ParamData }, 
                                  CommandType.StoredProcedure).ToList();