Node.js Firebird SQL 连接器 - 从 INSERT 获取结果 ... RETURNING

Node.js Firebird SQL connector - getting result from INSERT ... RETURNING

我正在尝试编写一个函数,让我可以将一个值插入到 firebird 数据库中。查询运行良好,只是我没有收到任何回调告诉我插入运行良好。

我是第一次使用火鸟连接器。过去,当使用 mySql 连接器时,我记得在插入新值时有某种回调。现在我正在使用 Henri Gourvest 的 node-firebird 库来完成这个: https://github.com/hgourvest/node-firebird/

我尝试在末尾添加 'RETURNING FEATURE_ID',但出现错误 "Cursor is not open"。功能 ID 由触发器生成。

如有任何建议,我们将不胜感激。

pool.get(function(error, db) {
    if (error) {
        console.log(error)
        res.status(403)
        res.send()

    }
    else {
        var date = moment(req.body.date, "DD/MM/YYYY")
        var values = " VALUES ('" + date.format("MM/DD/YYYY") + "','Requested','" + req.body.type + "','" + req.body.description + "','" + req.body.memo +"')"
        var query = 'INSERT INTO "Features" (FEATURE_REQUESTDATE, FEATURE_STATUS, FEATURE_TYPE, FEATURE_DESCRIPTION, FEATURE_MEMO)' + values


        db.query( query , function(err, result) {
            if (result) { //why is there no result here?
                res.status(200)
                res.send('ok')
            }
            if (err) {
                console.log(err)
                res.status(403)
                res.send('error')
            }
        })


            db.detach();
        }
})

I tried adding 'RETURNING FEATURE_ID' at the end, but an error "Cursor is not open" was thrown.

当然可以没有光标。游标(又名行集)仅由 queries - SELECT-type SQL statements.

创建

如 Firebird 文档中所述,带有 RETURNING 子句的语句不是 query 类型,它们属于 过程调用 类型。您应该像处理常规 DELETE 类型的语句一样执行它们,然后阅读所执行语句的参数。

Right now I am using the node-firebird library by Henri Gourvest to accomplish this: https://github.com/hgourvest/node-firebird/
Any advice would be very kind.

有两个建议。

  1. 从不 将您的 data 值拼接到 SQL command 文本。它使您的程序非常脆弱。它会给您带来各种数据转换错误,并且还会为您因意外(错误或恶意)用户输入造成的数据库损坏开辟道路。参见 http://bobby-tables.com/ and http://en.wikipedia.org/wiki/SQL_injection

  2. "Use the source Luke"。您提到的库是开源的。所以你必须检查那个库中的例子。众所周知,Henri 对文档非常简洁。然而,他为他的不同库提供了大量示例 and/or 测试。两者都适合您,因为它们 确实使用了该库 ,因此您只需阅读其创建者打算如何使用该库即可。这个特定的库有测试。测试始终是预期用途的示例。

所以你进入 test 文件夹,你会看到 run.js 文件。打开它。

现在按 Ctrl+F 并搜索 "RETURNING" 单词。并非总是第一次,但其中一次出现应该是对您需要的 SQL 功能的准确测试。

这是它在您机器上已有的库文本中的第一次出现。诚然,第一次出现会增加使用您不需要的 BLOB 的复杂性。所以我会引用您下载的库中的第三个示例。但即使是第一个示例也向您展示了如何使用值和 RETURNING 子句正确执行查询。

function test_insert(next) {

....skip.......

   // Insert record without blob 
         database.query('INSERT INTO test (ID, NAME, CREATED, PARENT) VALUES(?, ?, ?, ?) RETURNING ID', [3, 'Firebird 3', now, 862304020112911], function(err, r) { 
             assert.ok(!err, name + ': insert without blob (buffer) (1) ' + err); 
             assert.ok(r['id'] === 3, name + ': without blob (buffer) returning value'); 
             next(); 
         }); 

     // Insert record without blob (without returning value) 
         database.query('INSERT INTO test (ID, NAME, CREATED) VALUES(?, ?, ?)', [4, 'Firebird 4', '2014-12-12 13:59'], function(err, r) { 
             assert.ok(!err, name + ': insert without blob (buffer) (2) ' + err); 
             assert.ok(err === undefined, name + ': insert without blob + without returning value'); 
             next(); 
         });