【问题标题】:Operation must use an updateable query when updating excel sheet更新excel工作表时操作必须使用可更新查询
【发布时间】:2011-10-01 19:38:12
【问题描述】:

我在尝试更新 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\"";
            }

【问题讨论】:

  • 您使用什么连接字符串来创建conn 对象?
  • 我用一个用于 xls,一个用于 xlsx
  • if (strFileType.Trim() == ".xls") { connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strNewPath + ";Extended Properties=\" Excel 8.0;HDR=是;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\""; }
  • conn 对象打开后检查其Mode 属性是值得的。将该值与msdn.microsoft.com/en-us/library/ms675792%28v=VS.85%29.aspx 处的列表进行比较,以确保连接处于正确模式

标签: c# asp.net excel


【解决方案1】:

从连接字符串中删除 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();
    }
}

感谢 social.msdn.microsoft.com 的 RobertNet

【讨论】:

  • 它适用于 .xlsx 但不适用于 .xls 我认为还有另一种解决方案,但感谢它是一个内部系统,所以我们都在使用新的 .xlsx 灭绝版本:)
  • 多么有解决方案的人!过去两天我因为这个问题而发疯......非常感谢!!!
  • 它应该花费很多时间吗..我有运行 50 次的循环并根据 diff StudentId 更新 FirstName。处理需要 4-5 分钟,并给出成功消息。但是当我尝试打开 .xls 文件时,它说“此文件可能已损坏,位于没有响应或只读的服务器上”,我可以在 20-30 分钟后访问该文件,甚至日期修改时间更改20-30 分钟后
  • 这个解决方案不起作用,因为我的数据库实际上需要 IMEX - 因为我的列有混合数据类型,一些双精度值和一些字符串值。当我删除 IMEX =1 时,我得到一个运行时异常“无法转换类型的对象”,因为它会根据最流行的值类型自动选择类型,然后无法转换未选择的类型。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    就我而言,我更改了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);
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 2019-11-29
      • 2023-03-20
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多