18

興味深い問題があります。Sql2005のOpenRowsetを介してサーバー上のExcelファイルから読み取っています。クエリを何回も問題なく実行しました。簡単な会議に出かけたところ、突然「リンクサーバー「(null)」のOLEDBプロバイダー「MSDASQL」のデータソースオブジェクトを初期化できません」というエラーが表示されます。

サーバーでファイルが使用されていないことを確認し、ファイルを削除してサーバーに再コピーしましたが、それでも同じエラーが発生します。

更新:これは、異なるopenrowsetからの2つの選択に参加した場合にのみ発生するようです。クエリを個別に実行しても、正常に機能します。私は以前に問題なく参加しました。アイデア?

4

6 に答える 6

23

この問題は、SQL サーバー サービスが実行されているユーザーの一時フォルダーに、クエリが実行されている資格情報ではアクセスできないために発生します。この一時フォルダのセキュリティを最小限の制限で設定してみてください。openrowset クエリを実行するたびに作成される dsn は、資格情報の競合なしで再作成できます。これは、再起動の必要なく機能しました。

于 2010-07-16T05:48:09.937 に答える
6

最終的にデータベース サーバーを再起動したところ、問題は解決したようです。何らかの理由でファイルがロックされていた可能性があります。確かなことはわかりませんが

于 2009-09-23T11:25:47.747 に答える
3

ここから入手できる「Microsoft Access データベース エンジン 2010 再頒布可能パッケージ」をダウンロードしてインストールする必要がありました。

「この問題の原因は、実際には 64 ビットの Windows Server 2003 に 64 ビットの ODBC テキスト ドライバがインストールされていないことです。64 ビットの MSDASQL は、OLEDB および ADO 上に構築されたアプリケーションを可能にする OLEDB/ODBC の「ブリッジ」を提供するだけです。 (OLEDB を内部で使用します) を使用して、ODBC ドライバーを介してデータ ソースにアクセスします。" ソース

于 2014-05-26T15:18:53.353 に答える
1
/* Linked server between local(Client) SQL server and Remote SQL server 2005*/

USE master
GO
-- To use named parameters: Add linked server in the source (Local machine - eg: MachineName or LocalSeverLoginName)

sp_addlinkedserver 
 @server = N'LnkSrv_RemoteServer_TEST', 
 @srvproduct=N'', -- Leave it blank when its not 'SQL Server'
 @provider=N'SQLNCLI', -- see notes
 @datasrc=N'RemoteServerName', 
 @provstr=N'UID=sa;PWD=sa;'
 --,@catalog = N'MYDATABASE' eg: pubs
GO

/*
 Note: 
  To check provider name use the folling query in the destination server
   Select Provider From sys.servers
*/
----------------------------------------------------------------------------------------------------------
-- Optional
--EXEC sp_addlinkedsrvlogin 'LnkSrv_RemoteServer_TEST', 'true' -- (self is true) -- for LocalSeverLoginName
--GO

-- Remote login
sp_addlinkedsrvlogin
 @rmtsrvname = 'LnkSrv_RemoteServer_TEST',
 @useself = 'False',
 @rmtuser = 'sa',
 @rmtpassword = 'sa'
GO

-- OR
/*
IF the above add linked server login failed then try in the Linked Server (LnkSrv_RemoteServer_TEST) Property 
Select -> Security - > 'For a login not defined in the list above, Connection will:'

Choose - > Be made using this security context
SET Remote login: sa
With password: sa
*/
----------------------------------------------------------------------------------------------------------

-- Test server connection
declare @srvr nvarchar(128), @retval int;
set @srvr = 'LnkSrv_RemoteServer_TEST';
begin try
    exec @retval = sys.sp_testlinkedserver @srvr;
end try
begin catch
    set @retval = sign(@@error);
end catch;
if @retval <> 0
  raiserror('Unable to connect to server. This operation will be tried later!', 16, 2 );

-- OR

BEGIN TRY 
    EXEC sp_testlinkedserver N'LnkSrv_RemoteServer_TEST'; 
END TRY 
BEGIN CATCH 
    PRINT 'Linked Server not available'; 
    RETURN; 
END CATCH 
----------------------------------------------------------------------------------------------------------

-- Get access linked server database
SET xact_abort ON 
GO

BEGIN TRANSACTION
SELECT  *  FROM LnkSrv_RemoteServer_TEST.DBName.dbo.tblName 
COMMIT TRAN
GO

-- OR
SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM DBName.dbo.tblName')
GO

-- OR
SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM sys.databases Order by name')
GO
----------------------------------------------------------------------------------------------------------
于 2010-08-06T08:58:02.083 に答える