gpt4 book ai didi

c# - C#如何在长时间运行的查询期间防止由于崩溃而导致数据丢失?

转载 作者:行者123 更新时间:2023-12-03 16:21:35 26 4
gpt4 key购买 nike

我有以下代码需要大约一个小时才能运行数十万行:

public void Recording(int rowindex)
{
using (OleDbCommand cmd = new OleDbCommand())
{
try
{
using (OleDbConnection connection = new OleDbConnection(Con))
{
cmd.Connection = connection;
connection.Open();
using (OleDbTransaction Scope = connection.BeginTransaction(SD.IsolationLevel.ReadCommitted))
{
try
{
string Query = @"UPDATE [" + SetupAction.currentTable + "] set Description=@Description, Description_Department=@Description_Department, Accounts=@Accounts where ID=@ID";
cmd.Parameters.AddWithValue("@Description", VirtualTable.Rows[rowindex][4].ToString());
cmd.Parameters.AddWithValue("@Description_Department", VirtualTable.Rows[rowindex][18].ToString());
cmd.Parameters.AddWithValue("@Accounts", VirtualTable.Rows[rowindex][22].ToString());
cmd.Parameters.AddWithValue("@ID", VirtualTable.Rows[rowindex][0].ToString());
cmd.CommandText = Query;
cmd.Transaction = Scope;
cmd.ExecuteNonQuery();
Scope.Commit();
}
catch (OleDbException odex)
{
MessageBox.Show(odex.Message);
Scope.Rollback();
}
}
}
}
catch (OleDbException ex)
{
MessageBox.Show("SQL: " + ex);
}
}
}

它可以按我预期的方式工作,但是今天我的程序在运行查询时崩溃了(在for循环中,rowindex是数据表的索引),计算机崩溃了,当我重新启动程序时,它说:

Multi-step OleDB operation generated errors: followed by my connection string.



发生的事情是数据库完全无法交互,即使Microsoft Access的恢复方法在这里似乎也无济于事。

我已经读到,这可能是由于数据库的数据结构从预期的变化而引起的。我的问题是,如何防止这种情况发生,因为我无法真正检测到程序是否突然停止运行。

我可能会以某种方式重组它,也许有一个我不知道的功能。崩溃发生时,它可能正在发送空查询,但是我不知道如何停止它。

最佳答案

Jet / ACE数据库引擎已经尝试避免损坏并从灾难性事件(连接丢失,计算机崩溃)中自动恢复。通过完全提交(或丢弃)多个操作,可以进一步保护事务免受不一致的数据的侵害。但是最终可能会出现一些偶然的系统故障,这些故障可能会在某个关键的写入位置终止操作,从而在数据库文件中造成严重的不一致。定期进行定期备份是整体解决方案的一部分。对于非常长的操作,可能需要在操作之前自动复制整个数据库文件。

否则,一个极端的选择是

  • 创建第二个中间数据库,首先将所有数据插入其中。 (只需执行一次。)
  • 在此中间数据​​库中,创建指向永久工作数据库中相关表的链接表。
  • 也在中间数据库中,创建一个索引本地表,该表镜像将要在其中插入数据的链接表结构。或者,如果中间数据库和表已经存在,请清除本地表(即删除所有行)。
  • 将您当前的软件插入本地中间表。
  • 运行一个查询,然后从临时表更新链接表。将更新打包在事务中。
  • 这是链接表的优点,它可以像任何本地表一样在SQL查询中进行引用。您只需要显式打开中间数据。换句话说,只需执行一个简单的查询,例如UPDATE LocalTable INNER JOIN LinkedTable ON LocalTable.UpdateID = LinkedTable.ID SET LinkedTable.Data = LocalTable.Data

  • 此过程的好处在于,从一个查询中更新一个Access表的单个查询可以非常快,可能比代码中的多个更新操作快得多。这样可以减少更新代码中的错误会对数据库造成负面影响的可能性。当然,这并不能完全消除可能影响数据库的随机计算机崩溃,但是减少执行多个连接和更新查询的时间可能会减少这种可能性。

    关于c# - C#如何在长时间运行的查询期间防止由于崩溃而导致数据丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45454552/

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