如何使用 Dapper 插入列表<myobject>作为存储过程的参数

问题描述 投票:0回答:1

我有一个包含 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# sql-server list dapper
1个回答
2
投票

简单地说,假设 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 次;这不是最快的方法,但我认为您没有陈述任何关于性能等的特定目标。

© www.soinside.com 2019 - 2024. All rights reserved.