gpt4 book ai didi

c# - 将 MYSQL 中的参数化命令一起批处理

转载 作者:行者123 更新时间:2023-11-29 03:13:39 25 4
gpt4 key购买 nike

在 C# 中使用 MYSQL:

我有一组要执行的参数化 IDbCommand。它们是更新、插入和删除的混合,现在我正在做:


using (IDbConnection connection = Connecter.CreateConnection())
{
foreach(IDBCommand command in m_commands)
{
command.Connection = connection;
command.ExecuteNonQuery();
}
}

这些命令大量使用参数,因此我不能将每个命令的命令文本组合在一起。性能非常糟糕,我知道必须有更好的方法。

使用 MYSql Bulk update take 是可以接受的,但我不清楚如何在不冒 SQL 注入(inject)攻击风险的情况下将参数值转换到文件中。

有人有什么建议吗?

(我已经将所有命令都放在一个事务中,这有一些帮助但还不够)

最佳答案

如果要对同一个表应用多个插入/更新/删除,请考虑使用 MySqlDataAdapter/DataTable 组合将类似语句批处理在一起。设置 MySqlDataAdapter 的 UpdateBatchSize 属性将启用/禁用批处理支持。因此,同一个表上的插入/更新/删除可以在一次行程中发送到数据库。

我已经完成了 OracleDataAdapter 和 SqlDataAdapter 的这项工作,并获得了显着的性能提升。 MySqlDataAdapter 似乎也实现了基本的批处理(虽然还没有实际测试过)。

一个建议是创建您自己的包装类,以某种形式的 DbCommandBatch 类隐藏底层 DbDataAdapter/DataTable 类。然后,此类可以从 IDbCommand 模板构建所需的 DataTable 支持,并在需要时最终像命令一样组合在一起。

public interface IDbBatchCommandFactory
{
IDbCommandBatch Create(IDbCommand templateCommand);
}

因此,如果需要,Create 方法实际上可以通过遍历现有参数集合从模板命令构建所需的 DataTable(可能使生活更轻松,具体取决于您已有的代码)。然后这可以创建一个类来实现如下接口(interface):

public interface IDbBatchCommand : IDisposable
{
void AddToBatch(ParameterCollection parameters);
void ExecuteBatch(IDbTransaction transaction);
}

如果这符合您的需要,我可以提供示例代码。如果每个命令彼此不同(即总是不同的表等),那么这将没有任何值(value)。

注意:在一个完美的世界中,像 SqlCommandSet 等类将是公开可用的,以避免必须做这种奇怪的事情。

关于c# - 将 MYSQL 中的参数化命令一起批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4218758/

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