我正在尝试编写一个函数,使我可以将一个值插入火鸟数据库中。查询效果很好,只有我没有回调告诉我插入效果很好。
这是我第一次使用火鸟连接器。过去,当使用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/
任何建议都非常友善。
有两个建议。
-
从不将您的 data 值剪接到SQL 命令文本中。它使您的程序非常脆弱。它将给您所有类型的数据转换错误,并为您的数据库损坏打开高速公路,该数据库损坏由意外的或恶意或恶意 - 用户输入打开。请参阅http://bobby-tables.com/和http://en.wikipedia.org/wiki/sql_injection
-
"使用源卢克"。您提到的库是开源的。因此,您必须检查该库中的示例。亨利(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();
});