在我的项目中,我们使用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
。
答案 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();