通过ADO.NET调用存储过程</int>填充List <int>的最有效方法

时间:2015-01-07 04:30:07

标签: c# mysql stored-procedures ado.net

我正在通过ADO.NET调用存储过程,如下所示(简化形式)。该数据库是一个MySQL数据库。 存储过程返回一个ID值列表,这些ID值对应于需要重新调度其调用时间的调用。 C#代码将它们存储在列表中。

我的问题是:是否有更有效的方法将值输入C#列表,而不是像我一样使用DataReader? 我还不知道我这样做的方式是否对我们的应用来说效率太低(将在测试期间确定),我只是在寻找更快的策略,如果存在的话。

我看过使用DataSet,但是从我读过的内容来看,如果ID-s列表很大(可能是这样),那可能会慢一些。 另外,从我读过的内容来看,LINQ也可能更慢。

我只需要将列表存储到callsToRescheduleList中;即,我不需要对ID-s进行任何随机访问,因此不需要DataSet的那些功能。 我只是想找到将数据放入列表的最快方法。

有什么建议吗?

C#代码:

private void GetCallsToRescheduleList()
{
    MySqlCommand cmd = new MySqlCommand
   ( 
       "`phytel`.`spPhy_GetCallsToRescheduleListPreviousDays`", 
       (MySqlConnection) DatabaseConnection,  workerTransaction
   );
   cmd.CommandType = CommandType.StoredProcedure;
   MySqlDataReader reader = cmd.ExecuteReader();
   if (reader.HasRows)
   {
        while( reader.Read())
        {
            callsToRescheduleList.Add(reader.GetInt32(0));
        }
   }
}

MySQL存储过程:

CREATE PROCEDURE `spPhy_GetCallsToRescheduleListPreviousDays` ()
BEGIN
       SELECT
             id
       FROM callrequest
       WHERE
             dialerCampaignId = 'CATH001’
             AND
             status = 'SCHEDULED’
    ;
END

1 个答案:

答案 0 :(得分:0)

AFAIK的效果与它一样好 - 选择范围很窄,在紧密循环中使用读取器序数过载是好的。

一些检查:

  • 确保MySql中(dialerCampaignId, status)上有索引(键) - 我假设此处dialerCampaignId有更好的选择性。
  • 如果您的List<Int>消费者每次都不会迭代完整列表,作为将数据滚动到列表中的替代方法,请考虑使用可枚举和收益率返回:

public IEnumerable<int> GetCallsToRescheduleListPreviousDays()
{
    using (var cmd = new MySqlCommand
    ( 
       "`phytel`.`spPhy_GetCallsToRescheduleListPreviousDays`", 
       (MySqlConnection) DatabaseConnection,  workerTransaction
    )
    {
      cmd.CommandType = CommandType.StoredProcedure;
      using (var reader = cmd.ExecuteReader())
      {
        if (reader.HasRows)
        {
           while( reader.Read())
           {
               yield return reader.GetInt32(0);
           }
        }
      }
    }
}

另请注意处理IDisposable资源,例如CommandsReaders