当前位置:  开发笔记 > 编程语言 > 正文

如何使用node-jdbc生成Id?

如何解决《如何使用node-jdbc生成Id?》经验,为你挑选了1个好方法。

我正在使用node-jdbc和oracle驱动程序"ojdbc6_g.jar"连接到Oracle数据库.我想执行一些插入查询.

问题:

使用node-jdbc在oracle中插入行时如何获取生成的Id?

我试图调用,statement.getGeneratedKeys()但它在回调中返回以下错误:

> { [Error: Error running instance method java.sql.SQLException:
> operation not allowed
>         at oracle.jdbc.driver.OracleStatement.getGeneratedKeys(OracleStatement.java:8425)
>         at oracle.jdbc.driver.OracleStatementWrapper.getGeneratedKeys(OracleStatementWrapper.java:1106)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:483) ] cause: {} }

Majid Yaghou.. 5

我测试了一些解决方案,最后我设法获得了新插入行的ROWID.ROWID是oracle用于表的每一行的唯一键,与自动增量ID不同.事实上,oracle将每一行映射到一个唯一的ROWID.

有了ROWID,我们可以选择插入的行并获取它的每一列.

从'table_name'中选择*,其中rowid ='获得的rowid'

要获取生成的密钥,我们应该statement.executeUpdate()使用参数"1"调用,以便我们可以使用statement.getGeneratedKeys().

这是我对jdbc节点模块的修改以获得ROWID:

JDBCConn.prototype.executeInsert = function (sql, callback, getGeneratedKeys) {
    var self = this;

    self._conn.createStatement(function (err, statement) {
        if (err) {
            return callback(err);
        }
        else {
            // calling `statement.executeUpdate()` with parameter 1
            statement.executeUpdate(sql, 1, function (err, rowcount) {
                if (err) {
                    return callback(err);
                }
                else {
                    if (getGeneratedKeys) {
                        statement.getGeneratedKeys(function (err, resultset) {
                            resultset.getMetaData(function (err, rsmd) {
                                if (err) {
                                    return callback(err);
                                } else {
                                    var results = [];
                                    var cc = rsmd.getColumnCountSync();
                                    var columns = [''];
                                    for (var i = 1; i <= cc; i++) {
                                        var colname = rsmd.getColumnNameSync(i);
                                        columns.push(colname);
                                    }
                                    var next = resultset.nextSync();
                                    var processRow = function (next) {
                                        if (next) {
                                            setImmediate(function () {
                                                var row = {};
                                                for (var a = 1; a <= cc; a++) {
                                                    row[columns[a]] = trim1(resultset.getStringSync(a));
                                                }
                                                results.push(row);
                                                next = resultset.nextSync();
                                                processRow(next);
                                            });
                                        } else {
                                            callback(null, rowcount, results);
                                        }
                                    };
                                    processRow(next);
                                }
                            });
                        });
                    }
                    else {
                        callback(null, rowcount);
                    }
                }
            });
        }
    });
};

结果是一组对象,如:

[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ]

希望它有所帮助.



1> Majid Yaghou..:

我测试了一些解决方案,最后我设法获得了新插入行的ROWID.ROWID是oracle用于表的每一行的唯一键,与自动增量ID不同.事实上,oracle将每一行映射到一个唯一的ROWID.

有了ROWID,我们可以选择插入的行并获取它的每一列.

从'table_name'中选择*,其中rowid ='获得的rowid'

要获取生成的密钥,我们应该statement.executeUpdate()使用参数"1"调用,以便我们可以使用statement.getGeneratedKeys().

这是我对jdbc节点模块的修改以获得ROWID:

JDBCConn.prototype.executeInsert = function (sql, callback, getGeneratedKeys) {
    var self = this;

    self._conn.createStatement(function (err, statement) {
        if (err) {
            return callback(err);
        }
        else {
            // calling `statement.executeUpdate()` with parameter 1
            statement.executeUpdate(sql, 1, function (err, rowcount) {
                if (err) {
                    return callback(err);
                }
                else {
                    if (getGeneratedKeys) {
                        statement.getGeneratedKeys(function (err, resultset) {
                            resultset.getMetaData(function (err, rsmd) {
                                if (err) {
                                    return callback(err);
                                } else {
                                    var results = [];
                                    var cc = rsmd.getColumnCountSync();
                                    var columns = [''];
                                    for (var i = 1; i <= cc; i++) {
                                        var colname = rsmd.getColumnNameSync(i);
                                        columns.push(colname);
                                    }
                                    var next = resultset.nextSync();
                                    var processRow = function (next) {
                                        if (next) {
                                            setImmediate(function () {
                                                var row = {};
                                                for (var a = 1; a <= cc; a++) {
                                                    row[columns[a]] = trim1(resultset.getStringSync(a));
                                                }
                                                results.push(row);
                                                next = resultset.nextSync();
                                                processRow(next);
                                            });
                                        } else {
                                            callback(null, rowcount, results);
                                        }
                                    };
                                    processRow(next);
                                }
                            });
                        });
                    }
                    else {
                        callback(null, rowcount);
                    }
                }
            });
        }
    });
};

结果是一组对象,如:

[ { ROWID: 'AAAVTcAAEAAAADzAAK' } ]

希望它有所帮助.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有