web-dev-qa-db-ja.com

OLEリンクサーバー "(null)"のDBプロバイダー "Microsoft.ACE.OLEDB.12.0"がメッセージ "ブックマークが無効です"を返しました。

ExcelからMSSQL SERVER 2008からデータをエクスポートしたいのですが、エラーが発生します

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" 
returned message "Bookmark is invalid.".

Msg 7343, Level 16, State 2, Line 1

The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" 
could not INSERT INTO table "[Microsoft.ACE.OLEDB.12.0]". 

エクスポート時のExcelファイル(97-2003形式のファイル保存) Excel file version 97-2003 on server

私のクエリ SQL QUERY

エラーが発生する理由を教えてください?何をする必要がありますか?

4
user1893904

これを試して

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                       'Excel 8.0;Database=C:\Export.xls;', 
                       'SELECT id_sale FROM [ExportSheet$]')
SELECT id_sale
FROM dbo.Sale

OR

INSERT INTO OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\Export.xls;Extended Properties=Excel 8.0')...[ExportSheet$]
SELECT id_sale
FROM dbo.Sale
5

この問題に何度も苦労した後、私は次の解決策を見つけました:

  1. 64ビットサーバーおよびボックスでは、最初にすべての32ビットMicrosoft Officeアプリケーションおよびインスタンス(Access 2007インストール、Office 10 32ビットなど)をアンインストールする必要があります。そうしないと、新しい64ビットのMicrosoft Access Database Engine2010再頒布可能コンポーネントをインストールできません。はい、それは頭痛の種ですが、64ビットマシンで実行する必要があるJETエンジンコンポーネントの新しい代替品をインストールするために私が見つけた唯一の方法です。
  2. Microsoftから新しいコンポーネントをダウンロードしてインストールします: http://www.Microsoft.com/downloads/en/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d&displaylang=en
    • これにより、リンクサーバー、OPENROWSETExcelファイルなどをセットアップするために必要なアクセスエンジンとその他のエンジンがインストールされます。
  3. SQL Serverを開き、次を実行します。

    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'Ad Hoc Distributed Queries', 1;
    GO
    RECONFIGURE;
    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
    
    • これにより、コンポーネントに関連するクエリにアクセスして実行するために必要なパラメータが設定されます。アドレス「null
  4. ここで、OPENROWSET呼び出しを実行している場合は、古いJETパラメーターを使用して行われた呼び出しを破棄し、次のように新しい呼び出しを使用する必要があります。

    (*Example, importing an Excel file directly into SQL):
    DONT DO THIS….
    SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;HDR=YES;Database=c:\PATH_TO_YOUR_Excel_FILE.xls','select * from [sheet1$]')
    
    USE THIS INSTEAD…
    SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=c:\PATH_TO_YOUR_Excel_FILE.xls','select * from [sheet1$]')
    
    *At this point resolved two SQL issues and ran perfectly
    
  5. さて、楽しい部分として…..すべてのOfficeディスクを見つけて、必要なOfficeやアプリケーションをマシンに再インストールします。 64ビットバージョンのOffice10は、ディスクに移動して64ビットフォルダーに移動して実行することでインストールできますが、一部のサードパーティアプリがそのバージョンのOfficeとまだインターフェイスしない場合があるため注意してください。
9
RAGKV

以下のレジストリキーを確認/設定します手動(正確なパスはSQLサーバーのバージョンに固有です):

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\Microsoft.ACE.OLEDB.12.0]
"AllowInProcess"=dword:00000001
"DynamicParameters"=dword:00000001

Jet4.0とACE.OLEDB.12を同時に使用するのは問題のようです。

0
vitaly

Office 32ビットバージョンがインストールされており、SQL Server 2008 r2(64ビット)がインストールされています。 AccessDatabaseEngine再配布可能ファイルの64ビットバージョンをインストールしようとしましたが、インストールできませんでした。次に、32ビットバージョンをインストールしようとしましたが、SQLサーバーが文句を言っていました。

OLE DB provider 'Microsoft.ACE.OLEDB.12.0' cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

それで私は64ビットのインストールオフィスに辞任しました。次に、「Microsoft Sql server 2008r2」スタートメニューの「データのインポートとエクスポート(32ビットオプション)」に気づきました。だから私はそれを試しました、そしてそれは私のために働きました。

「データベース->タスク-データのインポート..」を右クリックしてデータをインポートしようとしていましたが、これは明らかに64ビットバージョンを開いていて、苦痛を引き起こしていました。

0
user1619480

1- 32ビットバージョンのWindowsを使用している場合は、AccessDatabaseEngine_x64.exeまたはAccessDatabaseEngine.exeをインストールします(再起動が必要です)。

2- SQL Management Studioを使用している場合は、管理者としてManagementStudioを実行します。管理者アカウントとして実行しない場合、このエラーが発生します(リンクサーバーのOLE DBプロバイダー "Microsoft.ACE.OLEDB.12.0"のデータソースオブジェクトを初期化できません "(ヌル)"。

3-このコマンドを実行してデータベースを構成します

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE with override;
GO

EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE with override;
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

4-OPENROWSET関数で「select * fromsheet1 $」を使用しないでください。このコードを試してください。

select * from OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=YES;DATABASE=D:\test.xlsx', sheet1$)

それでも(32ビット)エラーが発生する場合は、SQLサービスを再起動し、C:\ Windows\Tempを確認して、このディレクトリにアクセスできるかどうかを確認してください。

0
Mohammad Karimi