操作必须使用可更新的查询 – Excel 2007文件作为OleDB数据源

在尝试使用OLEDB更新Excel表格中的字段时,经常遇到此错误。

这有时会起作用,但是我经常得到这个错误。 (操作必须使用可更新的查询)

连接代码:

string filepath = "c:\\SampleFile.xls"; OleDbConnection MyConnection; MyConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + filepath + "';Extended Properties=Excel 8.0;"); con3 = MyConnection; MyConnection.Open(); if (MyConnection.State != ConnectionState.Open) { do { Thread.Sleep(50); } while (MyConnection.State != ConnectionState.Open); } 

以下是执行更新的代码:

 linesx = "231,214,412"; //this is variable string sqlx = string.Format("Update [Resolved Results$] set [Audit Result] = 'AUDITED' where [LineNo] IN ({0})", linesx); OleDbCommand myCommand = new OleDbCommand(); myCommand.Connection = MyConnection; myCommand.CommandText = sqlx; try { Console.WriteLine(sqlx); myCommand.ExecuteNonQuery(); } catch (Exception ex) { updRes = "Failed! :("+Environment.NewLine+"ERROR: " + ex.Message + Environment.NewLine; } 

注意:对于行x的SAME值,这有时有效,有时不会

我还监视连接的状态,以确保在打开连接之前连接已closures,并且在执行命令之前连接已打开。 我已经尝试了多种方式来解决它,包括:有一个单独的连接读取(con1)和更新命令(MyConnection),(当然,我确保在打开MyConnection之前closurescon1)

我已经研究了很多关于这个问题,我可以得到最多的答案是没有写入文件的权限。 HOwever,该程序具有写权限(因为更新命令有时有时,有时不工作)

有时更新命令失败后,即(即我尝试更新两次或三次),有时它没有工作。

为什么会发生? 我该如何解决??

更新1:我尝试使用Microsoft.ACE.OLEDB.12.0 insted的JET – 错误不出现,但它不更新表!

更新2:我正在使用多个连接到相同的文件,这可能导致了这个问题。 连接是一个全局variables。 我改变了整个应用程序架构,只在需要的时候才初始化连接,就像Damith说的那样,它像一个魅力一样工作(它的工作时间是99%(这在我的整个应用程序中花费了很多时间来实现这个变化)。

非常感谢Damith

我希望这有助于其他2 ^ n人面临同样的问题:D

更新3:我想我知道修复其他1% – 有创build多个线程的function,每个线程打开自己的连接 – 也许这是造成这个问题。 解决scheme是确保有一个连接到Excel DB。 (不一定是ConnectionState.Close,但convariables应该超出范围,并且为空)

做如下,需要时创build连接。 using块处理连接对象的处理。

 var connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + filepath + "';Extended Properties=Excel 8.0;"; var sqlx = string.Format("Update [Resolved Results$] set [Audit Result] = 'AUDITED' where [LineNo] IN ({0})", linesx); using (var connection = new OleDbConnection(connectionString)) using (var command = new OleDbCommand(sqlx , connection)) { try { connection.Open(); command.ExecuteNonQuery(); } catch (Exception ex) { updRes = "Failed! :("+Environment.NewLine+"ERROR: " + ex.Message + Environment.NewLine; } }