【问题标题】:Pass table-valued parameter to a stored procedure将表值参数传递给存储过程
【发布时间】:2016-11-03 06:02:33
【问题描述】:

在我的项目中,我们使用 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。

【问题讨论】:

  • 执行时遇到什么错误?您的代码看起来符合条件,它应该执行存储过程查询。
  • 你创建了DataTable,但没有使用它
  • @TetsuyaYamamoto 我添加了其他方式,我尝试使用 DataTable 使用 TVP。
  • 我在您的代码中没有看到 CheckBrokerNPNExist 过程/函数。可否添加以供参考?问题来自CheckBrokerNPNExist 中的其他参数,这些参数比声明的参数长。

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


【解决方案1】:

在c#代码中的[dbo].[TestTableType]中使用相同的列名

【讨论】:

    【解决方案2】:

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

    查看您的存储过程定义:

    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();
    

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      相关资源
      最近更新 更多