我正在尝试使用客户端 Javascript 中的 OPENROWSET 通过 SQL Server 访问大型 Oracle 数据库,但运气不佳。以下是详细信息:
- 使用 OPENROWSET 访问 Oracle 数据库的 SQL Server 视图运行良好,所以我知道我有有效的连接字符串参数。但是,新的要求是依赖于客户端选择的极其动态的 Oracle 查询,我无法让动态(甚至参数化的)Oracle 查询从 SQL Server 视图或存储过程中工作。
- 对 SQL Server 数据库的客户端访问与动态和参数化查询完美配合。
- 我不能指望拥有任何 Oracle 客户端软件的客户。因此,必须通过 SQL Server 数据库、使用视图、存储过程或使用 OPENROWSET 的动态查询来访问 Oracle 数据库。
- 因为 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.
毫无意义。Microsoft 对此错误的解释与注册表设置 ( DisallowAdhocAccess
) 有关。这在我的 PC 上设置正确,但这肯定与数据库服务器有关,而不是客户端 PC,我希望那里的设置是正确的,因为上面提到的视图有效。
我尝试过的一种替代方法是消除 Open 语句中的封闭 EXEC:
rs.Open(e,db);
但这会产生相同的错误。
我还尝试将 OPENROWSET 放入存储过程中。这在 SQL Server Management Studio 中执行时完美运行,但在从 Javascript 调用存储过程时失败并显示相同的错误消息。
我正在尝试做的事情可能吗?如果是这样,你能推荐如何修复我的代码吗?或者是否需要完全不同的方法?
欢迎任何提示或相关信息。提前致谢。