在更新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'"";
}
从连接字符串中删除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文件锁定为只读模式。需要终止连接