在尝试使用 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;
}
注意:对于linesx 的相同值,这有时有效,有时无效
我还监视连接的状态,以确保在打开连接之前关闭连接,并在执行命令之前打开连接。我尝试了多种方法来解决它,包括:为读取(con1)和更新命令(MyConnection)设置单独的连接,(当然,我确保在打开 MyConnection 之前关闭 con1)
我已经对这个问题进行了大量研究,我能得到最多的答案是该文件没有写权限。但是,该程序确实具有写入权限(因为更新命令有时会起作用,有时不会起作用)
有时更新命令在失败一次后会起作用(即我尝试更新两次或三次),有时它不会。
为什么会这样??我该如何解决??
更新 1:我尝试使用JET 安装的Microsoft.ACE.OLEDB.12.0 - 错误没有出现,但它也没有更新表格!!!
更新 2:我使用多个连接到同一个文件,这可能导致了问题。连接是一个全局变量。我改变了整个应用程序架构,只在需要时才初始化连接,就像Damith所说的那样,它的工作原理很吸引人(它在 99% 的情况下都有效(我花时间在整个应用程序中实现这个改变是非常值得的。
非常感谢达米特
我希望这对面临同样问题的其他 2^n 人有所帮助:D
更新 3:我想我知道要修复另外 1% - 有创建多个线程的函数,每个线程打开自己的连接 - 也许这就是问题的根源。解决方案是确保与 excel 数据库只有一个连接。(不一定是ConnectionState.Close,但con变量应该超出范围并且为null)