gpt4 book ai didi

c# - 通过 ADO.NET 调用存储过程来填充 List 的最有效方法

转载 作者:行者123 更新时间:2023-11-29 23:15:55 25 4
gpt4 key购买 nike

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

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

我考虑过使用 DataSet,但是根据我所读到的内容,如果 ID 列表很大(也可能是这样),速度可能会更慢。另外,据我所知,LINQ 也可能更慢。

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

有什么建议吗?

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

最佳答案

据我所知,这已经是最好的了 - 选择范围很窄,并且在紧密循环中使用读取器序号重载是很好的。

一些检查:

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

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

关于c# - 通过 ADO.NET 调用存储过程来填充 List<int> 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27812419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com