1

在尝试使用 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)

4

1 回答 1

2

执行以下操作,在需要时创建连接。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;
    }
}
于 2013-09-04T16:47:18.673 回答