2010-12-14 80 views
0

我試圖避免使用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

回答

2

如果您沒有該文件的權限,而不是僅當它完全打開時,這也會出現。無論如何,我總是發現這個問題的最佳解決方法是將文件的副本自動化爲新的臨時文件。副本幾乎是即時的,即使是大型文件也是如此,所以它們不應該讓你的速度變慢,而且由於你的應用程序只能讀取,所以你不必擔心之後丟棄臨時文件。

此外,這將清除任何可以清除的權限問題。如果您擁有讀取權限,則該副本將工作,如果沒有,則無論如何都沒有解決方法。如果將臨時副本的目標路徑設置爲與工作簿相同的路徑,則對複製的文件將擁有完全權限。 (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

0

那麼,你說你試過改變模式只讀,你到底是怎麼做到的?

根據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