我正在重构一个Windows表单应用程序,用于调整.mdb文件中的时间段。该计划基于诸如他们接近午餐,休息,工作日结束等因素,以及根据加班要求计算工资来对打孔进行一些上下调整。它还用作GUI来查找特定时间条目并手动纠正不良打击(错误的客户ID,任务编号等)。没有什么太复杂的了。该应用程序最初使用ADO.Net于2004年编写。它在办公室的XP计算机上工作正常,但它会立即崩溃任何运行Windows 7的东西,这就是我开始重构它的原因。我使用.Net Reflector反编译它并制作了我在Visual Studio Express 2012中一直在工作的ac#项目。在我重新编译之前,我必须解决几个语法错误,但在我做了之后,我有一个应用程序,完全适用于Windows 7(我针对原始应用程序运行了大量测试,我确信重新编译的版本正在正确执行调整)。我无法告诉你为什么它与这么少的变化完全一致,但你有它(我不介意发现它,但这不是我的主要问题)。我遇到的问题是,运行XP的恐龙需要大约1分钟的计算需要大约20分钟才能在运行Windows 7的新开机桌面上运行。这个特殊的计算涉及自动处理未处理的记录(应用程序启动时,表中的布尔字段标记。记录来自的表有~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后端的工作表添加特定格式。如果有人能指出我正确的方向,弄清楚为什么这个代码运行得如此缓慢,我真的很感激。当然,如果您需要更多代码/信息,我愿意提供它。
答案 0 :(得分:0)
这种方法没有根本问题。问题可能是在处理过程中调用了多少次。尝试重新计算您的sql以预先提取所有数据 - 然后在所有数据都在内存中时进行处理。使用LINQ,进行这些更改应该很简单。从MS Access更改为SQL Server Express之类的内容也不会受到影响。