在更新excel表时,操作必须使用可更新查询

本文关键字:可更新 查询 操作 更新 excel 表时 | 更新日期: 2023-09-27 18:10:17

当尝试更新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'"";
            }

在更新excel表时,操作必须使用可更新查询

从连接字符串中删除IMEX=2(或IMEX=1),它将工作。我已经对这个疯狂的解决方案进行了多次测试,由于某些奇怪的原因删除IMEX似乎奏效了(至少对于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();
    }
}

感谢RobertNet from social.msdn.microsoft.com

我使用了上面提供的解决方案,从连接字符串中删除了IMEX=2或IMEX=1字符串。但这还不够。在我的例子中,解决方案需要额外的工作。

但是在我的数据库中,我实际上需要IMEX -因为我的列有混合数据类型,一些双精度值和字符串值。当我删除IMEX =1时,我得到一个运行时异常"无法转换类型的对象",因为它根据列中最流行的值自动选择列数据类型,然后无法转换不属于所选类型的值。

我通过将双精度和整型值更改为字符串值(在excel中手动在单元格值的开头添加')并从连接字符串中删除IMEX来解决此问题。这就解决了问题

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

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

我的问题是之前的连接将excel文件锁定为只读模式。需要终止连接