更新Excel工作表时,操作必须使用可更新的查询

尝试更新Excel表时出现此错误:

Server Error in '/ReadExcelData_Csharp' Application. Operation must use an updateable query. 

这里是我使用的代码:

  querys = "UPDATE [Sheet1$] "+"SET [Number]=" +s.Trim()+ " WHERE [Number]=" + s2.Trim() ; objcmc = new OleDbCommand(querys, conn); objcmc.ExecuteNonQuery(); 

任何帮助将不胜感激 。

这里是我使用的连接:

 if (strFileType.Trim() == ".xls") { connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strNewPath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\""; } else if (strFileType.Trim() == ".xlsx") { connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strNewPath + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\""; } 

从连接string中删除IMEX = 2(或IMEX = 1),它将工作。 我已经testing了这个疯狂的解决scheme几次,并删除IMEX的一些奇怪的原因似乎做的伎俩(至less对于XLSX文件)。

以下代码工作:

  static void Main(string[] args) { string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + "d:\\temp\\customers.xlsx" + ";Extended Properties=\"Excel 12.0;ReadOnly=False;HDR=Yes;\""; string selectString = "INSERT INTO [Customers$](Id,Company) VALUES('12345', 'Acme Inc')"; OleDbConnection con = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(selectString, con); try { con.Open(); cmd.ExecuteNonQuery(); Console.WriteLine("Success"); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { con.Dispose(); } Console.ReadLine(); } } 

感谢来自social.msdn.microsoft.com的 RobertNet

我使用了上面提供的解决scheme,并从连接string中删除了IMEX = 2或IMEX = 1string。 但这还不够。 就我而言,解决scheme需要额外的工作。

但是在我的数据库中, 我实际上需要IMEX – 因为我的列有混合的数据types ,有些double值是一些string值。 当我删除I​​MEX = 1时,我得到一个运行时exception“无法转换types的对象”,因为它自动select基于列中最常见的值的列数据types,然后不能转换不属于select的types。

我通过将我的double和int值更改为string值 (在Excel中手动添加单元格的值开头)来解决此问题,并从连接string中删除了IMEX。 然后这解决了这个问题。

在我的情况下,我改变了ConnectionString ,然后解决了这个问题。
我删除了ReadOnly=False;HDR=Yes; 参数在connectionString

 string _connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;\";", pathToExcelFile);