2010-12-14 11 views
0

の読み取り専用をADO.NET接続文字列は、私は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

を使用すると、Microsoft Jetデータベースエンジン以外のプロバイダを使用してみましたか? – Alain

+0

他に何がありますか? – zsalzbank

+0

そこにはトンがあります:http://www.connectionstrings.com/しかし、ファイルで働くものはそれほど多くありません。ジェットプロバイダーがファイルを開くのを手に入れることができない場合は、旧式の方法でそれを開いてみてください。 「オープン」と? – Alain

答えて

2

これは、ファイルが独占的に開いているときだけでなく、そのファイルのアクセス権を持っていない場合にも表示されます。いずれにせよ、私はいつも、この問題の最善の回避策は、ファイルのコピーを新しい一時ファイルに自動化することだということを発見しました。コピーは大容量のファイルであってもほとんど瞬時に処理されるため、処理速度を大幅に低下させることはありません。また、アプリケーションは読み取り専用なので、後で一時ファイルを破棄する心配もありません。

さらに、これでクリアできるアクセス許可の問題がクリアされます。読み取り権限がある場合はコピーが機能し、そうでない場合は回避策はありません。一時コピーのコピー先のパスをブックと同じパスにすると、コピーしたファイルに対して完全なアクセス許可が与えられます。 (Application.Path

これにはFileCopy srcFile, destNameコマンドを使用します。

+0

私はファイルへのフルアクセスを持っています。私は手動でファイルをExcelで開いて(読み込み専用モードで開くように指示して)、ADO.NETでアクセスしようとすると、接続できます。私は読んだだけでそれを開くしたいです - 方法が必要です。 – zsalzbank

+0

私はこれを打ち破って試しましたが、元のファイルはネットワーク上にあり、マップされたドライブにはありません。 FileCopyはマップされていないドライブでは機能しません。まだファイルをコピーする方法はありますか? – zsalzbank

+0

これは面白いです、私はドライブがマッピングされていない問題がある元のJetプロバイダと何かを持っているのだろうかと思います。手動でファイルをマップされたドライブにコピーして、同じ問題がすべて発生するかどうか確認できますか?これはあまり知られていない制限の1つかもしれません。 – Alain

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

+0

ええ、接続を使用していくつかのクエリを実行する 'Set recordset = connection.Execute(CommandText、RecordsAffected、Options)'を使用することができますし、 'OleDbDataAdapter.Fill(DataSet、RecordSet、 "TableName") 'コマンドまたは' OleDbDataAdapter.Fill(DataSet.Table、RecordSet) 'コマンド – Alain

+0

ここのサンプルコード:http://bytes.com/topic/c-sharp/answers/440071-filling-dataset-ado-レコードセットレコード – Alain