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);

} );


4 回复

在使用 Node.js 的 node-oracledb 模块(原名 node-oracle)连接 Oracle 数据库并执行查询时,如果查询结果显示不出数据,可能有几个常见原因。以下是一些常见的问题及其解决方案,并附带一个示例代码来帮助你理解。

常见问题及解决方案

  1. 数据库连接错误

    • 确保你的数据库连接信息(如主机名、用户名、密码)是正确的。
  2. SQL 查询语法错误

    • 确保 SQL 查询语句正确无误。例如,确保表名和列名拼写正确。
  3. 自动提交设置

    • 在执行查询后,需要确保事务已经提交或设置为自动提交。
  4. 错误处理

    • 确保在回调函数中正确处理错误。
  5. 异步处理

    • 使用 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);
});

解释

  1. 数据库连接

    • 使用 oracledb.getConnection 方法连接到数据库,并提供必要的连接信息。
  2. 执行查询

    • 使用 connection.execute 方法执行 SQL 查询。注意参数绑定和输出格式设置。
  3. 错误处理

    • 在每个步骤中添加错误处理逻辑,确保在出现错误时能够及时捕获并处理。
  4. 结果输出

    • 最终的结果会通过 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; 实质上是要链接你所生成的库,至于这个库的名字可以是任意的

根据你提供的代码片段,有几个可能的原因导致查询结果没有正确显示。以下是一些可能的解决方案:

  1. 确保正确处理错误:你需要确保错误对象 err 被正确地处理,以便在出现任何问题时能够及时发现。

  2. 确保连接成功:确保数据库连接成功,并且连接对象 connection 正确传递到下一个函数中。

  3. 检查查询语句:确保 SQL 查询语句正确无误,并且查询的结果确实存在。

  4. 自动提交:确保在执行查询后设置了自动提交。

以下是修正后的代码示例:

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);
}
);

关键点解释:

  1. 错误处理:在每个回调函数中添加了错误处理逻辑。
  2. 参数绑定:使用命名参数 { name: 'huangwei' } 进行 SQL 参数绑定,这样更符合规范。
  3. 自动提交:确保在执行查询之后设置了自动提交。

通过这些调整,可以更好地调试和解决问题。如果仍然无法正常显示查询结果,请检查数据库中的数据是否存在,或者查看是否有其他错误信息。

回到顶部