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

C# 将表值参数传递给存储过程,c#,sql-server,stored-procedures,dapper,table-valued-parameters,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

在我的项目中,我们使用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();
    }
}
public void CheckSP(列表数据)
{
使用(var connection=newconnectionprovider(“DbName”).GetOpenConnection())
{
var dt=新的数据表(“dbo.TestTableType”);
添加(“NPN”,类型(字符串));
dt.行添加(“12345”);
//第一次尝试
var result=connection.Query(“usp_Check”,new{BrokerNPN=ParamData},CommandType.StoredProcedure).ToList();
//第二次尝试
var result=connection.Query(“usp_Check”,new{BrokerNPN=dt},CommandType.StoredProcedure.ToList();
}
}
但是我无法将TVP传递给存储过程

对于第一次尝试,我得到了这个错误

过程或函数checkbrokernpexist指定的参数太多


在第二次尝试中,我不能直接使用pass
DataTable

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

我认为您只是在参数中使用了一个错误的名称

请参阅存储过程定义:

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结果=连接
.Query(“usp\U检查”,
新的{BrokerNPN=ParamData},
CommandType.StoredProcedure.ToList();
我会尝试使用相同的名称

var result = connection
                .Query<CheckData>("usp_Check", 
                                  new { TestTableType = ParamData }, 
                                  CommandType.StoredProcedure).ToList();
var结果=连接
.Query(“usp\U检查”,
新的{TestTableType=ParamData},
CommandType.StoredProcedure.ToList();

我认为您只是使用了一个错误的参数名称

请参阅存储过程定义:

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结果=连接
.Query(“usp\U检查”,
新的{BrokerNPN=ParamData},
CommandType.StoredProcedure.ToList();
我会尝试使用相同的名称

var result = connection
                .Query<CheckData>("usp_Check", 
                                  new { TestTableType = ParamData }, 
                                  CommandType.StoredProcedure).ToList();
var结果=连接
.Query(“usp\U检查”,
新的{TestTableType=ParamData},
CommandType.StoredProcedure.ToList();

执行时遇到什么错误?您的代码看起来符合条件,它应该执行存储过程查询。您可以创建
数据表
,但不使用it@TetsuyaYamamoto我添加了我尝试使用DataTable使用TVP的其他方法。我在代码中没有看到
checkbrokernpexist
procedure/function。你能加上它作为参考吗?问题来自于
checkbrokernpexist
中的附加参数,该参数比声明的参数长。执行时遇到了什么错误?您的代码看起来符合条件,它应该执行存储过程查询。您可以创建
数据表
,但不使用it@TetsuyaYamamoto我添加了我尝试使用DataTable使用TVP的其他方法。我在代码中没有看到
checkbrokernpexist
procedure/function。你能加上它作为参考吗?问题来自于
checkbrokernpexist
中的附加参数,这些参数比声明的参数长。