"Microsoft.ACE.OLEDB.12.0"でT-SQL OpenRowset()コマンドを使用してExcel 2007(.xlsx)ファイルからSQL Server 2008にデータをインポートしようとしていますOLE DBプロバイダー、そして「インストール可能なISAMが見つかりませんでした」というエラーが繰り返し表示されるすべてのハードウェアは32ビットです。
[異常にさらに焦点を絞るように1/10/12を改訂]
次のT-SQLステートメントはエラーを生成します。
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"',
'SELECT * FROM [Sheet1$]'
)
Excelファイルを「Excel 97-2003」形式(.xls)で保存し、古いMicrosoft.Jet.OLEDB.4.0プロバイダーを使用してデータをインポートすると、問題なく動作します。これは、セキュリティやその他の環境問題ではないと思います。
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES',
'SELECT * FROM [Sheet1$]'
)
ただし、*。xls形式との下位互換性があるはずのMicrosoft.ACE.OLEDB.12.0プロバイダーで* .xlsファイルを試すと、同じエラーで失敗します。
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";',
'SELECT * FROM [Sheet1$]'
)
また、興味深いことに、SSMSの「データのインポート...」ウィザードを使用すると、正常に機能します。データのインポートウィザードの出力をSSISパッケージとして保存し、SSISファイルを調べて、それがどのように機能するかを理解しようとしましたが、IS Microsoft.ACE.OLEDB.12.0プロバイダーを使用して正常に実行されました。これは、SSISパッケージからの接続文字列です。
<DTS:Property DTS:Name="ConnectionString">
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES";
</DTS:Property>
OPENROWSET分散クエリを許可するために、関連するSQL Server構成も行いました。
sp_configure 'show advanced options', 1
reconfigure
GO
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
GO
次の* sp_MSset_oledb_prop *値も設定した場合(どこかにある投稿で見つかりました)...
USE [master]
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
GO
...その後、エラーは「不明なエラー」に変わります。
OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
ただし、これがアップストリームエラーかダウンストリームエラーかはわかりません。 (「インストール可能なISAM」を見つけましたが、その後失敗しますか?)
2つの異なるマシン/ OS(Windows Server 2003、Windows XP SP3)で複数のExcelファイルを使用してこれを試しました。両方のマシンは32ビットです。
AccessDatabaseEngine.exeのOffice 2007バージョンとOffice 2010バージョンの両方を再インストールしてみました( http://www.Microsoft.com/download/en/details.aspx?id=23734 および http://www.Microsoft.com/download/en/details.aspx?id=13255 、それぞれ)、役に立たない。
要約する:
何かご意見は?
これを試してみてください:
要件に従ってpath
とstrFileType
を設定します
string connString = "";
// string strFileType = Path.GetExtension(UpfileName.FileName).ToLower();
// string path = UpfileName.PostedFile.FileName;
if (strFileType.Trim() == ".xls")
{
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
}
else if(strFileType.Trim() == ".xlsx")
{
connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
}
このクエリで解決しました:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=NO;Database=D:\Filename.xlsx;',
[SheetName$])
SQLは「拡張プロパティ」セクションを好きではないようです...
これは私のために働いた
Select *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'text;
HDR=yes;
imex=1;
driver={Microsoft text Driver (*.xls, *.xlsx, *.xlsm, *.xlsb,*.csv)};
extended properties=Excel 12.0 xml;
Database=<path>\',
'SELECT * from [<filename>#csv]')
答えはあなたが投稿したSSISパッケージ情報に隠れていると思います。新しいファイル形式xlsxは、古い形式ではなくXML形式でデータを保存します。もう一度見てください。それは...拡張プロパティ= "Excel 12.0 XML; HDR = YES
標準的なものの後のXMLをお見逃しなく。 (その価値については、xslmファイルに接続するには「Excel 12.0マクロ」が必要であることも読んだ。)
試してみる。奇妙ですがうまくいけばうまくいきます。
最後に、解決策です!
これを確認してください: メッセージ7302、レベル16、状態1、行1リンクサーバー「(null)」のOLE DBプロバイダー「Microsoft.ACE.OLEDB.12.0」のインスタンスを作成できません
基本的には、
コントロールパネル>管理ツール>コンポーネントサービス
次に展開します
コンポーネントサービス>コンピューター>マイコンピューター> DCOM構成
見つける
MSDAINITIALIZE
に行く
プロパティ>セキュリティ>起動とアクティブ化のアクセス許可
クリック
カスタマイズ>編集...
ログイン名または「Everyone」を追加します
新しいユーザー/グループのすべての「許可」ボックスにチェックを入れます
両方のページで[OK]をクリックします
OpenRowSet/OpenDataSourceコマンドが機能するかどうかを確認します
social.technet.Microsoft.comのRamesh Babu Vavilla(vr.babu)に感謝 リンク
海も私が解決したこの状況に直面しています
解決した
string ConeectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtFlp.Text
+ ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"");
OleDbConnection oconn = new OleDbConnection(ConeectionString);</b>
これを試して
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;DataBase=C:\TEMP\test.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES', [Sheet1$])
これは私のために働きました:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$])
接続文字列の拡張プロパティセクションを囲む引用符を確保すると、修正されました。追加のプロパティを追加し、新しいプロパティの後に見積もりを最後に移行しませんでした。