【问题标题】:Execute Stored Procedure multiple times using Dapper?使用 Dapper 多次执行存储过程?
【发布时间】:2021-06-22 12:29:18
【问题描述】:

我希望 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] 添加 20 作为参数 2021-06-22 13:52:58.287 +02:00 [INF] 添加 Michiel 作为参数 2021-06-22 13:52:58.291 +02:00 [INF] 添加了 De Ruyter 作为参数 2021-06-22 13:52:58.293 +02:00 [INF] 添加 21 作为参数 2021-06-22 13:52:58.296 +02:00 [INF] 添加 Jacob 作为参数 2021-06-22 13:52:58.299 +02:00 [INF] 添加 Jakobsson 作为参数 2021-06-22 13:52:58.817 +02:00 [INF] 执行存储数据的过程。行 受影响: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(调用中的参数数量或类型错误...)

【问题讨论】:

  • 你不能有多个同名的参数。在每次运行时执行该过程,或将其更改为接受列表/表格

标签: c# .net dapper


【解决方案1】:

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

尝试,然后:

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 }),

【讨论】:

  • 感谢您的建议。 Person 类实际上只包含这 3 个提到的属性。而且我已经尝试过按人投影,但它仍然抱怨错误的参数数量或类型。
  • @KWC 好的;存储过程声明了哪些参数?我们能看到吗?
  • 你试过去掉参数名前面的@吗?他们不需要在那里,据我所知,Oracle 无论如何都使用 :'s 。
  • @MarcGravell,程序的签名如下:kwc_test_person_procedure(id in number, first_name in varchar2, last_name in varchar2)
  • @KWC 那么你需要persons.Select(x =&gt; new { id = x.Id, first_name = x.FirstName, last_name = x.LastName }),就像我在答案的最后一行暗示的那样(但显然是实际参数名称)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2014-03-03
相关资源
最近更新 更多