Nodejs node-oracle原生模块对oracle进行查询时为何总显示不出数据
Nodejs node-oracle原生模块对oracle进行查询时为何总显示不出数据
var bindings = require(’./oracle_bindings’); //oracle_bindings是我在vs2012下编译出来的, var async = require(‘async’); //使用了node-oracle源代码,大家有没知道原因的 var oracle = new bindings.OracleClient();
async.waterfall( [
function ConnectDataBase(callback) {
oracle.connect({ "hostname": "localhost", "user": "his", "password": "his" }, function(err, connection) {
console.log("conneted")
callback(err,connection);
});
},
function DeleteData(connection,callback)
{
var self=this;
this.connection=connection;
self.connection.execute("select* FROM person WHERE NAME = (:1)", ['huangwei'],function(err, results) {
self.connection.setAutoCommit(true);
callback(err,results);
});
}
], function(err,results) { if(err) { throw err; } console.log(results);
} );
在使用 Node.js 的 node-oracledb
模块(原名 node-oracle
)连接 Oracle 数据库并执行查询时,如果查询结果显示不出数据,可能有几个常见原因。以下是一些常见的问题及其解决方案,并附带一个示例代码来帮助你理解。
常见问题及解决方案
-
数据库连接错误:
- 确保你的数据库连接信息(如主机名、用户名、密码)是正确的。
-
SQL 查询语法错误:
- 确保 SQL 查询语句正确无误。例如,确保表名和列名拼写正确。
-
自动提交设置:
- 在执行查询后,需要确保事务已经提交或设置为自动提交。
-
错误处理:
- 确保在回调函数中正确处理错误。
-
异步处理:
- 使用
async
库来管理异步操作时,确保所有步骤都按预期执行。
- 使用
示例代码
const oracledb = require('oracledb');
const async = require('async');
async.waterfall([
function connectDatabase(callback) {
oracledb.getConnection({
user: 'his',
password: 'his',
connectString: 'localhost/XE' // 请根据你的环境修改
}, function (err, connection) {
if (err) {
console.error('Error connecting to database:', err);
return callback(err);
}
console.log('Connected to database');
callback(null, connection);
});
},
function fetchData(connection, callback) {
connection.execute(
"SELECT * FROM person WHERE name = :name",
{ name: 'huangwei' },
{ outFormat: oracledb.OBJECT }, // 设置输出格式
function (err, result) {
if (err) {
console.error('Error executing query:', err);
return callback(err);
}
console.log('Query executed successfully');
callback(null, result.rows);
}
);
}
], function (err, results) {
if (err) {
console.error('Final error:', err);
return;
}
console.log('Results:', results);
});
解释
-
数据库连接:
- 使用
oracledb.getConnection
方法连接到数据库,并提供必要的连接信息。
- 使用
-
执行查询:
- 使用
connection.execute
方法执行 SQL 查询。注意参数绑定和输出格式设置。
- 使用
-
错误处理:
- 在每个步骤中添加错误处理逻辑,确保在出现错误时能够及时捕获并处理。
-
结果输出:
- 最终的结果会通过
callback
传递给async.waterfall
的最后一个回调函数,从而打印查询结果。
- 最终的结果会通过
通过以上示例代码,你可以更好地理解如何使用 node-oracledb
模块连接 Oracle 数据库并执行查询。希望这能帮助你解决显示不出数据的问题。
既然没报错信息,排除运行配置不当或程序代码出错的可能,最可能的情况就是没有数据就是正确的结果,即sql查询本身找不到一个符合条件的记录。
可能的话,检查下生成的最终查询sql语句;另外"select* FROM person WHERE NAME = (:1)", ['huangwei']
真的符合oracle_bindings的语法规范吗?(google不到oracle_bindings是什么玩意)
你在node-oracle-master目录下面可以找到一个lib目录,那里面有一个oracle.js内容是var bindings = require("…/build/Release/oracle_bindings"); var oracle = new bindings.OracleClient(); exports.connect = function(settings, callback) { oracle.connect(settings, callback); } exports.OutParam = bindings.OutParam; 实质上是要链接你所生成的库,至于这个库的名字可以是任意的
根据你提供的代码片段,有几个可能的原因导致查询结果没有正确显示。以下是一些可能的解决方案:
-
确保正确处理错误:你需要确保错误对象
err
被正确地处理,以便在出现任何问题时能够及时发现。 -
确保连接成功:确保数据库连接成功,并且连接对象
connection
正确传递到下一个函数中。 -
检查查询语句:确保 SQL 查询语句正确无误,并且查询的结果确实存在。
-
自动提交:确保在执行查询后设置了自动提交。
以下是修正后的代码示例:
var bindings = require('./oracle_bindings');
var async = require('async');
var oracle = new bindings.OracleClient();
async.waterfall(
[
function ConnectDataBase(callback) {
oracle.connect({ "hostname": "localhost", "user": "his", "password": "his" }, function(err, connection) {
if (err) {
callback(err);
} else {
console.log("connected");
callback(null, connection);
}
});
},
function DeleteData(connection, callback) {
connection.execute("SELECT * FROM person WHERE NAME = :name", { name: 'huangwei' }, function(err, results) {
if (err) {
callback(err);
} else {
connection.setAutoCommit(true);
callback(null, results);
}
});
}
],
function(err, results) {
if (err) {
throw err;
}
console.log(results);
}
);
关键点解释:
- 错误处理:在每个回调函数中添加了错误处理逻辑。
- 参数绑定:使用命名参数
{ name: 'huangwei' }
进行 SQL 参数绑定,这样更符合规范。 - 自动提交:确保在执行查询之后设置了自动提交。
通过这些调整,可以更好地调试和解决问题。如果仍然无法正常显示查询结果,请检查数据库中的数据是否存在,或者查看是否有其他错误信息。