デスクトップ上の同じディレクトリにあるAccessデータベースからデータを取得するために、ExcelブックにVBAコードを記述しました。私のマシンおよびWindows XPを実行している他のいくつかのマシンでは正常に動作しますが、Vistaマシンでこれをテストすると、次のエラーが発生しました。
インストール可能なISAMが見つかりませんでした
私はたくさんのオンライン検索をしましたが、具体的な答えを見つけることができないようです。接続文字列は問題ないようで、先ほど述べたように、いくつかのマシンで機能します。
誰がこれを引き起こしているのか考えていますか?私の接続文字列は次のとおりです。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\ptdb\Program Tracking Database.mdb;
ありがとう
Extended Properties
を単一引用符で囲みます:
OleDbConnection oconn =
new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';");
それを試して、それは本当に動作します。
データソースを単一引用符で囲んでみてください。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\ptdb\Program Tracking Database.mdb';
問題は、パーサーにとって意味のある空白である傾向があります。
他の属性(拡張プロパティなど)がある場合、それらの値も一重引用符で囲む必要があります。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\ptdb\Program Tracking Database.mdb'; Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';
同様に二重引用符を使用することもできます。ただし、おそらくそれらをエスケープする必要があり、シングルを使用するよりもPain In The Algorithmの方が多いことがわかります。
これを確認しましたか http://support.Microsoft.com/kb/209805 ?特に、Msrd3x40.dllがあるかどうか。
Jetの最新バージョンを使用していることを確認することもできます。 http://support.Microsoft.com/kb/239114
接続文字列でJet OLEDB:を使用するだけです。それは私のために解決しました。
以下に例を示します。
"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=E:\Database.mdb;Jet OLEDB:Database Password=b10w"
よく似た問題が発生しました。
あなたと同じように、私の接続文字列は正しいように見えました。実際、他のシナリオでもまったく同じ接続文字列が機能していました。
問題はリソースの不足であることが判明しました。 20回のうち19回「インストール可能なISAMが見つかりませんでした」と表示されますが、1回または2回(コードをまったく変更せずに)、代わりに「メモリ不足」が発生します。
マシンを再起動すると問題が「解決」しました(今のところ...?)。これは、Windows XPでJetバージョン4.0.9505.0を使用して発生しました。
これを使用してExcel 12 xlsxファイルを更新しました
System.Data.OleDb.OleDbConnection MyConnection;
System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand();
MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='D:\\Programming\\Spreadsheet-Current.xlsx';Extended Properties='Excel 12.0;HDR=YES;';");
MyConnection.Open();
myCommand.Connection = MyConnection;
string sql = "Update [ArticlesV2$] set [ID]='Test' where [ActualPageId]=114";//
myCommand.CommandText = sql;
myCommand.ExecuteNonQuery();
MyConnection.Close();