C# 更新excel工作表时,操作必须使用可更新的查询
尝试更新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
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时,我得到一个运行时异常“无法强制转换类型的对象”,因为它会根据最常用的值类型自动选择类型,然后无法强制转换未选择的类型。