C# 将表值参数传递给存储过程
在我的项目中,我们使用Dapper连接数据库进行操作 我在SQL Server数据库中创建了一个存储过程,如下所示: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
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
中的附加参数,这些参数比声明的参数长。