web-dev-qa-db-ja.com

「インストール可能なISAMが見つかりませんでした。」の解決方法OLE DBプロバイダー "Microsoft.ACE.OLEDB.12.0"のエラー

"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 、それぞれ)、役に立たない。

要約する:

  • 「Microsoft.Jet.OLEDB.4.0」プロバイダーはT-SQLを使用して機能しますが、「Microsoft.ACE.OLEDB.12.0」は機能しません。
  • 「Microsoft.ACE.OLEDB.12.0」は、「データのインポート...」ウィザードを使用して動作します(保存されたSSISジョブファイルからわかる限り)。
  • 「AllowInProcess」および「DynamicParameters」プロパティを「1」に設定すると、エラーが「不明なエラー」に変わります。 (それは一歩前進ですか?!)

何かご意見は?

18
Martin_W

これを試してみてください:

要件に従ってpathstrFileTypeを設定します

      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\"";
    }
1
Sagar R

このクエリで解決しました:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=NO;Database=D:\Filename.xlsx;', 
    [SheetName$])

SQLは「拡張プロパティ」セクションを好きではないようです...

0
Frenk

これは私のために働いた

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]')
0
anonymous

答えはあなたが投稿したSSISパッケージ情報に隠れていると思います。新しいファイル形式xlsxは、古い形式ではなくXML形式でデータを保存します。もう一度見てください。それは...拡張プロパティ= "Excel 12.0 XML; HDR = YES

標準的なものの後のXMLをお見逃しなく。 (その価値については、xslmファイルに接続するには「Excel 12.0マクロ」が必要であることも読んだ。)

試してみる。奇妙ですがうまくいけばうまくいきます。

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)に感謝 リンク

0
Hamid Sadeghian
海も私が解決したこの状況に直面しています

解決した

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>
0
user4049619

これを試して

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$])
0
Gurm

これは私のために働きました:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
   'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$])
0
Simon Turner

接続文字列の拡張プロパティセクションを囲む引用符を確保すると、修正されました。追加のプロパティを追加し、新しいプロパティの後に見積もりを最後に移行しませんでした。

0
Aaronius