只读ADO.NET连接字符串为Excel

问题描述:

我试图避免使用ADO.NET读取Excel文件时,上来了以下内容:只读ADO.NET连接字符串为Excel

Microsoft Jet数据库引擎无法打开文件“ ”。它已经由另一个用户专门打开,或者您需要查看其数据的权限。

我知道这是因为另一个用户打开了文件,但我无法摆脱它。我已经尝试将Read Only=True;添加到我的连接字符串中,但这不起作用。我也尝试将连接的Mode设置为只读,但我无法弄清楚如何在C#中。

这里是我的连接字符串:

Provider=Microsoft.Jet.OLEDB.4.0; data source=test.xls; Extended Properties="Excel 8.0;HDR=No;IMEX=1" 

感谢您的帮助!

+0

你尝试使用除微软Jet数据库引擎以外的供应商? – Alain 2010-12-15 16:46:02

+0

其他人在那里? – zsalzbank 2010-12-15 16:59:23

+0

有吨:http://www.connectionstrings.com/,但没有那么多的文件工作。如果你无法让喷气机供应商打开文件,为什么不尝试以旧式的方式打开它?与“打开”? – Alain 2010-12-15 18:06:33

如果您没有该文件的权限,而不是仅当它完全打开时,这也会出现。无论如何,我总是发现这个问题的最佳解决方法是将文件的副本自动化为新的临时文件。副本几乎是即时的,即使是大型文件也是如此,所以它们不应该让你的速度变慢,而且由于你的应用程序只能读取,所以你不必担心之后丢弃临时文件。

此外,这将清除任何可以清除的权限问题。如果您拥有读取权限,则该副本将工作,如果没有,则无论如何都没有解决方法。如果将临时副本的目标路径设置为与工作簿相同的路径,则对复制的文件将拥有完全权限。 (Application.Path

使用FileCopy srcFile, destName命令为此。

+0

我对文件拥有完全访问权限。我发现,如果我手动在Excel中打开文件(并告诉它以只读模式打开),然后尝试通过ado.net访问它,我可以连接。我想打开它只读 - 但必须有一种方法。 – zsalzbank 2010-12-14 19:48:11

+0

所以我放弃了并尝试了这一点,但我的原始文件在网络上,而不是映射驱动器。 FileCopy在非映射驱动器上不起作用。有没有办法复制文件? – zsalzbank 2010-12-16 13:06:58

+0

这变得越来越有趣,我想知道未映射的驱动器是否与原始Jet提供程序有问题有关。你可以手动将文件复制到映射的驱动器,看看是否所有相同的问题发生?这可能是这些鲜为人知的限制之一。 – Alain 2010-12-16 14:26:01

那么,你说你试过改变模式只读,你到底是怎么做到的?

根据MSDN,默认情况下,Microsoft Jet的OLE DB提供程序以读/写模式打开Microsoft Jet数据库。要以只读模式打开数据库,请将ADO Connection object上的Mode属性设置为adModeRead。

所以在C#它应该看起来像:

ADODB.Connection myConn = new new ADODB.Connection(); 
myConn.Mode = adModeRead; //1 
myConn.Open(strConectionString, null, null, -1); 
+0

如果我这样做,有没有办法使用连接中的数据填充DataSet?谢谢 – zsalzbank 2010-12-15 15:36:58

+0

是的,你可以使用'Set recordset = connection.Execute(CommandText,RecordsAffected,Options)'来执行一些使用连接的查询,并且你可以使用'OleDbDataAdapter.Fill(DataSet,RecordSet, “TableName”)'命令或'OleDbDataAdapter.Fill(DataSet.Table,RecordSet)'命令 – Alain 2010-12-15 15:43:12

+0

此处的示例代码:http://bytes.com/topic/c-sharp/answers/440071-filling-dataset-ado-记录集记录 – Alain 2010-12-15 15:44:58