我有一个包含 10 列的 SQL Server 表:
CREATE TABLE [bank].[CommonPostingsFromBankFiles]
(
[Id] [INT] IDENTITY(1,1) NOT NULL,
[BankRegistrationNumber] [INT] NOT NULL,
[BankAccountNumber] [BIGINT] NOT NULL,
[BankName] [NVARCHAR](50) NULL,
[BankAccount] [NVARCHAR](50) NULL,
[PostingAmount] [DECIMAL](18, 2) NOT NULL,
[PostingDate] [DATE] NOT NULL,
[Primo] [CHAR](1) NULL,
[PostingText] [NVARCHAR](100) NULL,
[HideThisRecord] [BIT] NULL,
CONSTRAINT [PK_CommonPostingsFromBankFiles]
PRIMARY KEY CLUSTERED ([BankRegistrationNumber] ASC,
[BankAccountNumber] ASC,
[PostingAmount] ASC,
[PostingDate] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
)
还有一个带有 7 个参数的存储过程:
ALTER PROCEDURE [bank].[spInsertCommonPostings]
(@BankRegistrationNumber INT,
@BankAccountNumber BIGINT,
@BankName NVARCHAR(50),
@PostingAmount DECIMAL(18, 2),
@PostingDate DATE,
@Primo CHAR(1),
@PostingText NVARCHAR(100))
AS
BEGIN
IF NOT EXISTS (SELECT *
FROM bank.CommonPostingsFromBankFiles
WHERE BankRegistrationNumber = @BankRegistrationNumber
AND BankAccountNumber = @BankAccountNumber
AND BankName = @BankName
AND PostingAmount = @PostingAmount
AND PostingDate = @PostingDate)
INSERT INTO bank.CommonPostingsFromBankFiles (BankRegistrationNumber, BankAccountNumber,
BankName, PostingAmount,
PostingDate, Primo, PostingText)
VALUES (@BankRegistrationNumber, @BankAccountNumber,
@BankName, @PostingAmount,
@PostingDate, @Primo, @PostingText);
END;
我想要的是使用 Dapper 使用存储过程将
List<Postings>
写入表中。
我搜索了又搜索,但没有找到对我有帮助的例子。
如果我做一个
connection.Execute(sql: "spMyStoredProc", MyList, commandType: CommandType.StoredProcedure);
我收到错误
过程或函数 spMyStoredProc 指定了太多参数
如果我用存储过程中的 SQL 替换存储过程的名称并将
CommandType
设置为 Text,它将按预期工作。
任何人都可以给我发一个示例,展示如何使用我的存储过程插入我的列表。
简单地说,假设 C# 对象中的属性名称与存储过程中的参数名称相同,您可以:
MyList.ForEach(x => connection.Execute(sql: "spMyStoredProc", x, commandType: CommandType.StoredProcedure));
如果 param/props 未对齐,最简单的方法可能是提供一个匿名类型,其中填充了覆盖它们的 x 的值
MyList.ForEach(x => connection.Execute(
sql: "spMyStoredProc",
new { BankRegistrationNumber = x.BankRN, ... },
commandType: CommandType.StoredProcedure
));
对于 10 个对象的列表,它将调用 proc 10 次;这不是最快的方法,但我认为您没有陈述任何关于性能等的特定目标。