c# - 使用 Dapper 多次执行存储过程?

标签 c# .net dapper

我希望 Dapper 对每个项目的参数执行一次存储过程。

我正在循环集合来构建参数。而且我不想将执行方法放在循环内。

我怎样才能实现这个目标?提前致谢。

public static int SaveData3() 
        {
            var list = new List<Person>();
            var p1 = new Person() { Id = 20, FirstName = "Michiel", LastName = "De Ruyter" };
            var p2 = new Person() { Id = 21, FirstName = "Jacob", LastName = "Jakobsson" };
            list.Add(p1);
            list.Add(p2);

            var queryParameters = new DynamicParameters();
            foreach (var item in list)
            {
                queryParameters.Add("@id", item.Id);
                Log.Information("added {0} as parameter", item.Id);
                queryParameters.Add("@first_name", item.FirstName);
                Log.Information("added {0} as parameter", item.FirstName);
                queryParameters.Add("@last_name", item.LastName);
                Log.Information("added {0} as parameter", item.LastName);
            }

            using (IDbConnection connection = new OracleConnection(GetConnectionString()))
            {
                try
                {
                    var affectedRows = connection.Execute("kwc_test_person_procedure",
                    queryParameters,
                    commandType: CommandType.StoredProcedure
                    );
                    Log.Information("Executed procedure to store data. Rows affected: {0}", affectedRows);
                    return affectedRows;
                }
                catch (Exception ex)
                {
                    Log.Error(ex.Message);
                    Log.Error(ex.StackTrace);
                    throw;
                }

            }
        } 

当我运行这个时,只有最后一个对象(Jacob)存储在数据库中。

2021-06-22 13:52:58.225 +02:00 [INF] added 20 as parameter 2021-06-22 13:52:58.287 +02:00 [INF] added Michiel as parameter 2021-06-22 13:52:58.291 +02:00 [INF] added De Ruyter as parameter 2021-06-22 13:52:58.293 +02:00 [INF] added 21 as parameter 2021-06-22 13:52:58.296 +02:00 [INF] added Jacob as parameter 2021-06-22 13:52:58.299 +02:00 [INF] added Jakobsson as parameter 2021-06-22 13:52:58.817 +02:00 [INF] Executed procedure to store data. Rows affected: 1

我还尝试遵循以下“许多”示例: https://dapper-tutorial.net/execute#example---execute-stored-procedure

try
                {
                    var persons = new Person[] {
                    new Person {Id= 41, FirstName = "homeless", LastName="dude"},
                    new Person {Id= 42, FirstName = "hungry", LastName="person"}
                };

                    int rowsAffected = connection.Execute("kwc_test_person_procedure", persons, commandType: CommandType.StoredProcedure);
                    Log.Information("Executed procedure to store data. Rows affected: {0}", rowsAffected);
                    return rowsAffected;
                }

但后来我得到:

ORA-06550 PLS-00306 (wrong number or types of arguments in call ...)

最佳答案

使用存储过程时,Dapper 看不到签名,因此它假定应添加所有可访问的成员。我猜测 Person 具有其他属性,这导致了此失败。

尝试一下:

int rowsAffected = connection.Execute("kwc_test_person_procedure",
    persons.Select(x => new { x.Id, x.FirstName, x.LastName }),
    commandType: CommandType.StoredProcedure);

这将创建 IdFirstNameLastName 的每人投影(看起来) 应与存储过程参数匹配。如果需要,您还可以使用此方法为它们指定不同的名称,例如:

    persons.Select(x => new { id = x.Id, fName = x.FirstName, lName = x.LastName }),

关于c# - 使用 Dapper 多次执行存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68083565/

相关文章:

c# - 图论算法

c# - 如何阻止 EntityFramework 获取所有行

c# - List<model> 中的简单下拉列表

c# - "button_click"没有重载匹配委托(delegate) 'System.EventHandler'

.net - "Help System"用于基于 .NET 2010、C# 和 WPF 的桌面应用程序

.net - ObjectDataSource Paging -> GridView 无数据显示

c# - 如何检查文件头结构以识别 MSI 文件

c# - Dapper 和字符串到自定义类型的隐式转换

Dapper... 必须声明标量变量

asp.net-web-api - 使用 Dapper micro-orm 进行基于 token 的身份验证