我想通过使用客户端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