0

我正在重构一个 Windows 窗体应用程序,它可以调整 .mdb 文件中的时间。该程序根据与午餐时间、休息时间、工作日结束时间等因素的接近程度对打卡次数进行向上/向下取整,并根据加班要求计算工资。它还用作一个 GUI 来查找特定的时间条目并手动纠正错误的打孔(错误的客户 ID、任务编号等)。没什么太复杂的。该应用程序最初是在 2004 年使用 ADO.Net 编写的。它在办公室的 XP 计算机上运行良好,但在任何运行 Windows 7 的计算机上都会立即崩溃,这就是我开始重构它的原因。我使用 .Net Reflector 对其进行了反编译,并制作了我一直在 Visual Studio Express 2012 中处理的 ac# 项目。在重新编译之前,我必须修复几个语法错误,但是在我这样做之后,我有一个完全可以在 Windows 7 上运行的应用程序(我对原始应用程序进行了相当多的测试,我相信重新编译的版本可以正确执行调整)。我无法告诉你为什么它的改动如此之少,但你已经知道了(我也不介意发现这一点,但这不是我的主要问题)。我遇到的问题是,在运行 XP 的恐龙上需要约 1 分钟的计算,在运行 Windows 7 的全新开箱即用桌面上需要约 20 分钟。这个特定的计算涉及自动处理未处理的记录(其中在应用程序启动时由表中的布尔字段标记)。记录来自的表有约 235000 条记录,其中约 250 条被标记为未处理。将未处理的记录数量减少到 5 条需要大约 10 分钟的时间,而将总记录数量减少到几千条则使程序几乎可以立即运行;但是,此时这并不是一个真正的选择。在调试模式下运行应用程序让我可以将问题追溯到此方法:

[HelpKeyword("vs.data.TableAdapter"), DebuggerNonUserCode, DataObjectMethod(DataObjectMethodType.Select, false)]
    public virtual dsHours.workDataTable GetDataByWeek(string EmployeeID, DateTime? Date_Entered, DateTime? Date_Entered1)
    {
        this.Adapter.SelectCommand = this.CommandCollection[1];
        if (EmployeeID == null)
        {
            this.Adapter.SelectCommand.Parameters[0].Value = DBNull.Value;
        }
        else
        {
            this.Adapter.SelectCommand.Parameters[0].Value = EmployeeID;
        }
        if (Date_Entered.HasValue)
        {
            this.Adapter.SelectCommand.Parameters[1].Value = Date_Entered.Value;
        }
        else
        {
            this.Adapter.SelectCommand.Parameters[1].Value = DBNull.Value;
        }
        if (Date_Entered1.HasValue)
        {
            this.Adapter.SelectCommand.Parameters[2].Value = Date_Entered1.Value;
        }
        else
        {
            this.Adapter.SelectCommand.Parameters[2].Value = DBNull.Value;
        }
        dsHours.workDataTable dataTable = new dsHours.workDataTable();
        this.Adapter.Fill(dataTable);
        return dataTable;
    }

WorkDataTable 类只是扩展 System.Data.DataTable 并实现 System.Collections.IEnumerable 的类,并在 .mdb 后端为工作表添加特定格式。如果有人能指出我正确的方向来弄清楚为什么这段代码运行如此缓慢,我将非常感激。当然,如果您需要更多代码/信息,我愿意提供。

4

1 回答 1

0

这种方法没有根本问题。问题可能是在处理过程中调用了多少次。尝试重构您的 sql 以一次性提取所有数据,然后在所有数据都在内存中时进行处理。使用 LINQ,进行这些更改应该很简单。从 MS Access 更改为 SQL Server Express 之类的东西也不会受到伤害。

于 2013-07-17T01:13:52.653 回答