通过调用存储过程填充 ListADO.NET 的最有效方法
本文关键字:NET ADO 方法 有效 int 调用 存储过程 填充 List | 更新日期: 2023-09-27 18:36:27
我正在通过 ADO.NET 调用存储过程,如下所示(以简化形式)。 该数据库是一个 MySQL 数据库。存储过程返回与需要重新安排其调用时间的调用对应的 ID 值列表。C# 代码将它们存储在列表中。
我的问题是:有没有更有效的方法将值放入 C# 列表中,而不是像我一样使用 DataReader?我还不知道我这样做的方式对于我们的应用程序来说是否效率太低(这将在测试期间确定),我只是在寻找一个更快的策略,如果有的话。
我查看了使用数据集,但是,从我所读到的内容来看,如果 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
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
资源,如Commands
和Readers