簡體   English   中英

如何使用 Dapper 插入列表<myobject>作為存儲過程的參數

[英]How do I use Dapper to insert a list<myobject> as parameter to a stored procedure

我有一個包含 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 次; 這不是最快的方法,但我認為您沒有說明任何關於性能等的特定目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM