【问题标题】:In MySQL, how to pass a set of objects to a stored procedure?在 MySQL 中,如何将一组对象传递给存储过程?
【发布时间】:2014-12-24 16:10:23
【问题描述】:

在我的 C# 代码中,我将填充字典。 我需要以最有效的方式将这些数据放入 MySQL 表中。

是否可以将其传递给 MySQL 存储过程?我想我可以将它传递到某种带有逗号等的字符串中,这样存储过程就可以调用一个函数来解析字符串并填充表格,但这很痛苦。

还有其他想法吗?

谢谢!

基于到目前为止的 cmets,让我尝试展示我正在处理的代码/sudocode。 构建字典的代码如下所示:

        private void DistributeCallsToReschedule()
    {
        CallTimeSpacing = GetNumMinutesInNextCallWindow() / callsToReschedule.Count;

        DateTime currTimeToCall = new DateTime(); 
        foreach (int id in callsToReschedule)   
        {
            CallIdTimeToCallMap.Add(id, currTimeToCall);
            currTimeToCall.AddMinutes(CallTimeSpacing);
        }
    }

所以,字典可以包含我的条目。

我希望我能做的是将字典传递给存储过程,如下所示。 如果这不可能,那么执行存储过程指示的最有效方法是什么? IE, 存储过程希望有一个要加入的表,该表将字典中的数据填充到 C# 代码中。换句话说,将字典的数据放入 MySQL 中的表中最有效的方法是什么?如果这不可能,而且我必须循环,那么最有效的方法是什么:迭代调用存储过程?构建一个包含所有值的准备好的语句(我想是通过 StringBuilder 构建的)?

通过 C# 代码传递给存储过程的参数:
@CallIdTimeToCallMap

将@CallIdTimeToCallMap 放入CallIdTimeToCallMapTable;

更新 cr 设置 cr.TimeToCall = map.TimeToCall 来自 callRequest cr 内部加入 CallIdTimeToCallMapTable 映射 cr.id = map.id

【问题讨论】:

  • 为什么要使用存储过程而不是简单的插入语句?
  • 您可以创建一个接收 List 对象的函数,并且在该函数内部有一个执行插入的 foreach 循环,为什么不只创建一个简单的插入存储过程.. 显示你的到目前为止已经尝试过或您正在尝试通过代码执行的操作...

标签: c# mysql stored-procedures


【解决方案1】:

您必须先将对象映射到表和列,然后任何关系数据库才能对它们进行任何操作。对象不是关系。

你没有说存储过程期望的参数是什么。

如果它是需要大量对象的 INSERT 或 UPDATE,我想知道存储过程是否是正确的答案。您必须重复调用它,一次为集合中的每个对象写入行。我会考虑一个准备好的语句、绑定变量和批处理,这样你就可以在一次往返中完成。

集合是一个单一的工作单元吗?您是否考虑过事务行为?

【讨论】:

  • 谢谢,达菲莫。该参数本质上是一个对象列表,其中对象有两个字段。这个想法是将它们插入到 MySQL 中具有这两列的表中。我绝对想对数据库进行一次调用,因此准备好的语句会比多次调用存储过程更有效(我认为是的,但希望您提出意见)。 “批处理”是什么意思?是的,我会在一笔交易中完成。
  • HTTP 不知道也不关心对象列表。每个实例都是表中的一行。您必须将对象数据转换为表和列,并为每个对象调用一次以插入每一行。
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2012-10-13
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多