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.
有两个建议。
从不 将您的 data 值拼接到 SQL command 文本。它使您的程序非常脆弱。它会给您带来各种数据转换错误,并且还会为您因意外(错误或恶意)用户输入造成的数据库损坏开辟道路。参见 http://bobby-tables.com/ and http://en.wikipedia.org/wiki/SQL_injection
"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();
});
我正在尝试编写一个函数,让我可以将一个值插入到 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.
有两个建议。
从不 将您的 data 值拼接到 SQL command 文本。它使您的程序非常脆弱。它会给您带来各种数据转换错误,并且还会为您因意外(错误或恶意)用户输入造成的数据库损坏开辟道路。参见 http://bobby-tables.com/ and http://en.wikipedia.org/wiki/SQL_injection
"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();
});