操作必须使用可更新的查询 – 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; } }