我想通過使用客戶端Javascript中的OPENROWSET的SQL Server訪問大的Oracle數據庫,並沒有太多的運氣。以下是詳細信息:使用OPENROWSET通過SQL Server訪問Oracle數據庫
- 使用OPENROWSET訪問Oracle數據庫的SQL Server視圖完美工作,所以我知道我有有效的連接字符串參數。但是,新的要求是針對依賴於客戶端選擇的非常動態的Oracle查詢,並且我無法通過SQL Server視圖或存儲過程獲得動態(甚至參數化)的Oracle查詢。
- 對SQL Server數據庫的客戶端訪問完全適用於動態和參數化查詢。
- 我不能指望擁有任何Oracle客戶端軟件的客戶端。因此,訪問Oracle數據庫必須通過SQL Server數據庫,使用視圖,存儲過程或使用OPENROWSET的動態查詢。
- 由於SQL Server數據庫位於共享服務器上,因此我不允許使用全局鏈接的數據庫。
我的想法是定義一個將採取我自己的一個參數化的Oracle查詢的版本,使參數替換,在OPENROWSET包裹查詢,在SQL Server中執行它,返回結果記錄功能。下面是示例代碼:
// db is a global variable containing an ADODB.Connection opened to the SQL Server DB
// rs is a global variable containing an ADODB.Recordset
. . .
ss = "SELECT myfield FROM mytable WHERE {param0} ORDER BY myfield;";
OracleQuery(ss,["somefield='" + somevalue + "'"]);
. . .
function OracleQuery(sql,params) {
var s = sql;
var i;
for (i = 0; i < params.length; i++) s = s.replace("{param" + i + "}",params[i]);
var e = "SELECT * FROM OPENROWSET('MSDAORA','(connect-string-values)';"
+ "'user';'pass','" + s.split("'").join("''") + "') q";
try {
rs.Open("EXEC ('" + e.split("'").join("''") + "')",db);
} catch (eobj) {
alert("SQL ERROR: " + eobj.description + "\nSQL: " + e);
}
}
是我得到的SQL錯誤Ad hoc access to OLE DB provider 'MSDAORA' has been denied. You must access this provider through a linked server.
這是沒有意義的我。微軟對此錯誤的解釋涉及註冊表設置(DisallowAdhocAccess
)。這是在我的電腦上正確設置的,但是這肯定涉及到數據庫服務器而不是客戶端PC,並且我期望這個設置是正確的,因爲上面提到的視圖可以工作。我已經試過
一種替代方法是消除打開語句封閉EXEC:
rs.Open(e,db);
但這生成相同的錯誤。
我也嘗試將OPENROWSET放入存儲過程中。這從SQL Server Management Studio中執行時完美工作,但在從Javascript調用存儲過程時失敗並顯示相同的錯誤消息。
是我想要做的可能嗎?如果是這樣,你能推薦如何解決我的代碼?或者是一種完全不同的方法嗎?
任何提示或相關信息將受到歡迎。提前致謝。
我同意。如果我可以讓查詢在服務器端工作,我會這樣做。問題在於,由於OPENROWSET語法的限制,我無法讓查詢在服務器上工作。 – 2009-04-10 14:59:47