Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新excel工作表时,操作必须使用可更新的查询_C#_Asp.net_Excel - Fatal编程技术网

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

C# 更新excel工作表时,操作必须使用可更新的查询,c#,asp.net,excel,C#,Asp.net,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(qu

尝试更新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\"";
            }
从连接字符串中删除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,我使用了上面提供的解决方案,并从连接字符串中删除了IMEX=2或IMEX=1。但这还不够。在我的例子中,解决方案需要额外的解决方法

但是在我的数据库中,我实际上需要IMEX,因为我的列有混合的数据类型,一些是双值,一些是字符串值。当我删除IMEX=1时,会出现运行时异常“无法转换类型的对象”,因为它会根据列中最常用的值自动选择列数据类型,然后无法转换非所选类型的值


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

在我的例子中,我更改了
连接字符串
,然后这就解决了问题。
我删除了
ReadOnly=False;HDR=是连接字符串中的参数

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

您使用了什么连接字符串来创建
conn
对象?我使用一个用于xls,一个用于xlsxif(strFileType.Trim()=“.xls”){connString=“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“+strNewPath+”;Extended Properties=\”Excel 8.0;HDR=Yes;IMEX=2\”;}否则如果(strFileType.Trim()==“.xlsx”){connString=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=“+strNewPath+”;扩展属性=\”Excel 12.0;HDR=Yes;IMEX=2\”;}打开
conn
对象后,值得检查其
Mode
属性。将该值与处的列表进行比较,以确保连接处于正确的模式。它与.xlsx一起工作,而不是与.xls一起工作。我认为还有另一种解决方案,但感谢它是一个内部系统,因此我们都使用新的.xlsx版本锡安:)多好的解决方案啊!在过去的两天里,因为这个问题我都快发疯了…非常感谢!!!我有一个循环,它运行50次,并根据diff StudentId更新FirstName。处理需要4-5分钟,并发出成功消息。但当我试图打开.xls文件时,它会说“此文件可能已损坏,位于没有响应或只读的服务器上”我可以在20-30分钟后访问文件,甚至修改日期的时间在20-30分钟后也会更改。这个解决方案不起作用,因为我的数据库实际上需要IMEX,因为我的列有混合数据类型,一些双值,一些字符串值。当我删除IMEX=1时,我得到一个运行时异常“无法强制转换类型的对象”,因为它会根据最常用的值类型自动选择类型,然后无法强制转换未选择的类型。