使用Windows窗体closures子线程更新excel文件; 返回受影响的行,但文件不更新

我正在编写一个窗体窗体应用程序(也有一个控制台附加到它的debugging线程),使我可以select一个Excel文件,并对所述文件执行操作。 该文件包含交易信息,如[date],[存储],[部门]等。

这个项目的整个目标是把每个工作分解成线程。 有四个主要工作。

1 :)拉下一个未受影响的Excel文件行并更新它。

2 :)查看数据库中的excel事务,并将生成的对象添加到内存中的列表中。

3 :)处理从数据库中提取的事务。

4 :)处理后用笔记更新excel文件。

这四个工作中的每一个都将有一个线程,除了3.这将完成主线程。 在结束会话之前,我等待线程join备份。 所以如果_Processing = false,它仍然会等待所有更新完成保存,然后再继续。

我的主要方法首先运行一个清理工作来设置任何被拉入内存但未处理的事务。 这是一个简单的方法,没有线程,只运行一个命令。 ('UPDATE [MissingTransactions $] SET Notes =''WHERE Notes ='Pulled')。 这是因为当我拉事务时,我设置Notes ='Pulled',如果作业失败,我希望这些设置为空string。

当我尝试更新文件以从主线程的子线程设置Notes ='Pulled'时,问题就会起作用。 这是我的更新方法。

这是我如何build立我的命令; 我在这一个方法中运行两个命令,一个拉和一个更新我拉的事务。

private void GetNextExcelTransaction(ref List<ITransaction> iExcelList) { Console.WriteLine("Pulling Excel Transaction"); OleDbCommand lCommand = new OleDbCommand(Commands.Commands.SelectNextAvailableTransaction); DataTable lNextTransaction = _DataAccess.ExecuteQueryCommand(lCommand, Commands.Commands.SelectNextAvailableTransaction, 0); ITransaction aNextTransaction = AssignRowToTransaction(lNextTransaction); iExcelList.Add(aNextTransaction); Console.WriteLine("Excel transacion added to list"); OleDbCommand lUpdateCommand = new OleDbCommand(String.Format("UPDATE [MissingTransactions$] SET Notes = 'Pulled' WHERE DSDRTNormalized = '{0}';", aNextTransaction.DSDRT)); _DataAccess.ExecuteNonQueryCommand(lUpdateCommand); Console.WriteLine("Set transaction to pulled"); } public void ExecuteNonQueryCommand(OleDbCommand iCommand) { if (iCommand == new OleDbCommand() || iCommand == null) { throw new InvalidDataException("iCommand passed was null"); } int lRowsAffected = 0; try { Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("Updating Excel File using command {0}", iCommand.CommandText); Console.ForegroundColor = ConsoleColor.White; using (OleDbConnection lConnection = new OleDbConnection(Commands.Commands._ConnectionString)) { iCommand.Connection = lConnection; lConnection.Open(); using (iCommand) { lRowsAffected = iCommand.ExecuteNonQuery(); } lConnection.Close(); lConnection.Dispose(); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Excel File Update Complete, {0} Row affected using command {1}", lRowsAffected, iCommand.CommandText); Console.ForegroundColor = ConsoleColor.White; } } catch (Exception lException) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Update Failed"); Console.ForegroundColor = ConsoleColor.White; } } 

我有一个检查行受到影响,但它被绕过,因为我的ExecuteNonQueryCommand实际上返回1行受影响,但Excel文件没有改变。

这是我的连接string;

  _ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + iFilePath + ";Extended Properties='Excel 8.0;HDR=Yes;'"; 

如果我将IMEX 1或2添加到连接string的扩展属性中,执行命令时会出现exception。 “操作必须使用可更新的查询。” 但是我对文件和文件夹有必要的权限来修改它。

如果您需要编辑更多代码或更好的解释,请让我知道。