尝试更新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\"";
}
答案 0 :(得分:24)
从连接字符串中删除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
答案 1 :(得分:0)
我使用了上面提供的解决方案,从连接字符串中删除了IMEX = 2或IMEX = 1 字符串。但这还不够。就我而言,解决方案需要额外的解决方案。
但是在我的数据库中我实际上需要IMEX - 因为我的列具有混合数据类型,一些双重值是一些字符串值。当我删除IMEX = 1时,我得到一个运行时异常“无法转换类型为的对象,因为它会根据列中最常用的值自动选择列数据类型,然后无法转换不属于所选类型的值。
我通过将double和int值更改为字符串值来解决此问题(在excel中手动添加了一个'在单元格值的开头)并从连接字符串中删除了IMEX。然后这解决了这个问题。
答案 2 :(得分:0)
就我而言,我改变了ReadOnly=False;HDR=Yes;
,然后解决了这个问题
我在connectionString
string _connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;\";", pathToExcelFile);
个参数
__tests__