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

时间:2017-09-18 12:51:03

标签: node.js firebird

我正在尝试编写一个允许我在firebird数据库中插入值的函数。查询效果很好,只有我没有回调告诉我插入进展顺利。

这是我第一次使用firebird连接器。在过去,当使用mySql连接器时,我可以回忆在插入新值时有某种回调。现在我正在使用Henri Gourvest的node-firebird库来实现这个目标: https://github.com/hgourvest/node-firebird/

我尝试在最后添加'RETURNING FEATURE_ID',但抛出了错误“光标未打开”。功能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();
        }
})

1 个答案:

答案 0 :(得分:2)

  

我尝试添加' RETURNING FEATURE_ID'最后,但错误"光标未打开"被扔了。

当然,没有光标。游标(AKA行集)仅由查询 - SELECT 类型的SQL语句创建。

如Firebird文档中所述,RETURNING子句的语句不是查询类型,它们是过程调用类型。您应该像处理常规DELETE - 类型语句一样执行它们,然后读取执行语句的PARAMETERS。

  

现在我正在使用Henri Gourvest的node-firebird库来实现这一目标:https://github.com/hgourvest/node-firebird/
  任何建议都会非常友好。

有两个建议。

  1. 从不数据值拼接成SQL 命令文本。它使你的程序非常脆弱。它会为您提供所有类型的数据转换错误,并且还会为意外 - 错误或恶意 - 用户输入造成的数据库损坏打开高速公路。请参阅http://bobby-tables.com/http://en.wikipedia.org/wiki/SQL_injection

  2. "使用来源Luke"。你提到的图书馆是开源的。所以你必须检查该库中的示例。众所周知,亨利对文献非常简陋。然而,他为他的不同图书馆提供了大量的例子和/或测试。两者都适合你,因为他们使用库,所以你可以阅读它的创建者如何使用该库。这个特殊的库有测试。测试始终是预期用途的示例。

  3. 所以你进入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(); 
             });