node.js firebird sql连接器 - 从插入..返回



我正在尝试编写一个函数,使我可以将一个值插入火鸟数据库中。查询效果很好,只有我没有回调告诉我插入效果很好。

这是我第一次使用火鸟连接器。过去,当使用MySQL连接器时,我可以记得在插入新值时会有某种回调。现在,我正在使用Henri Gourvest的Node-Firebird Library来实现这一目标:https://github.com/hgourvest/node-firebird/

我尝试在末尾添加"返回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();
        }
})

我尝试在末尾添加'返回feature_id',但错误"光标未打开"。

当然可以没有光标。光标(又名rowsets)仅由 queries - 选择 -Type SQL语句。

如Firebird文档中所述,带有RETURNING子句的语句不是 Query 类型,它们是 procepture call 类型。您应该像使用常规DELETE -Type语句一样执行它们,然后读取执行的语句参数。

现在,我正在使用Henri Gourvest的Node-firebird库来完成此操作:https://github.com/hgourvest/node-firebird/
任何建议都非常友善。

有两个建议。

  1. 从不将您的 data 值剪接到SQL 命令文本中。它使您的程序非常脆弱。它将给您所有类型的数据转换错误,并为您的数据库损坏打开高速公路,该数据库损坏由意外的或恶意或恶意 - 用户输入打开。请参阅http://bobby-tables.com/和http://en.wikipedia.org/wiki/sql_injection

  2. "使用源卢克"。您提到的库是开源的。因此,您必须检查该库中的示例。亨利(Henri)对文献非常熟悉。但是,他为不同的图书馆提供了大量示例和/或测试。两者都适合您,就像它们使用库一样,因此您可以阅读其创建者打算如何使用库。这个特定的库有测试。测试始终是预期用途的示例。

因此,您进入test文件夹,然后看到run.js文件。打开它。

  • https://github.com/hgourvest/node-firebird/blob/master/test/run.js

现在按CTRL F并搜索"返回"字。并非总是第一次,但是它的发生之一应该是您需要的SQL功能的准确测试。

在这里,您已经在计算机上已经拥有的库文本中的第一个出现。当然,第一次出现增加了与您不需要立即使用的斑点的复杂性。因此,我将在您下载的库中引用第三个示例。但是,即使是第一个示例,您也向您展示了如何使用值和返回子句正确执行查询。

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

最新更新