簡體   English   中英

無法為鏈接服務器“(null)”初始化 OLE DB 提供程序“MSDASQL”的數據源對象

[英]Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "(null)"

有一個有趣的問題。 我正在通過 Sql2005 中的 OpenRowset 從服務器上的 excel 文件中讀取數據。 我已經多次運行查詢,沒有任何問題。 我剛出去參加一個快速會議,突然收到錯誤消息“無法為鏈接服務器“(null)”初始化 OLE DB 提供程序“MSDASQL”的數據源對象”

我確保這些文件沒有在服務器上使用,甚至刪除它們並將它們重新復制到服務器上,但我仍然遇到同樣的錯誤。

更新:這似乎只有在我加入來自不同 openrowset 的兩個選擇時才會發生。 如果我單獨運行查詢,它們仍然可以正常工作。 我之前已經完成了加入,沒有任何問題。 想法?

出現問題是因為在運行查詢的憑據下無法訪問運行 SQL 服務器服務的用戶的 Temp 文件夾。 嘗試以最小的限制設置此臨時文件夾的安全性。 每次運行 openrowset 查詢時創建的 dsn 可以重新創建而不會發生任何憑據沖突。 這對我有用,沒有任何重啟要求。

我們最終重新啟動了數據庫服務器,這似乎解決了問題。 也許文件以某種方式被鎖定。 我們永遠不會確定

我必須在 此處下載並安裝“Microsoft Access Database Engine 2010 Redistributable”。

“這個問題的原因是你的 64 位 Windows server 2003 上實際上沒有安裝 64 位 ODBC 文本驅動程序。64 位 MSDASQL 只是提供了一個 OLEDB/ODBC '橋',允許在 OLEDB 和 ADO 上構建應用程序(內部使用 OLEDB)通過 ODBC 驅動程序訪問數據源。” 資源

/* 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
----------------------------------------------------------------------------------------------------------

這個問題也發生在我身上。 為 OraOLEDB.Oracle 提供(SSMS > 服務器對象 > 鏈接服務器 > 提供 > OraOLEDB.Oracle)啟用“允許進程內”提供程序選項的組合,重新啟動 SQL Server Windows 服務並最后調整 TNSNAMES.ora 文件的權限直接地。

我認為您使用 32 位驅動程序制作了 ODBC,但 SQL Server Management Studio 需要 64 位。 因為當您想在 SQL Server 上為 MYSQL 創建鏈接服務器時,就會發生這種情況。 因此,您應該讓 DSN 系統用於 64 位驅動程序

另一種選擇是添加使用 SQL Server 身份驗證的 SQL Server 登錄並使用該帳戶登錄。 您需要轉到服務器實例屬性中的安全性並選擇 SQL Server 和 Windows 身份驗證模式,並且可能需要確保為該用戶分配了必要的角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM