如何使用参数插入多行?

Hit*_*sal 2 javascript sqlite node.js angularjs ionic-framework

我试图使用离子框架在SQLite中插入多行.单排插入工作正常.

即使我跑了

 INSERT INTO categories (category_id, category_name,category_type) VALUES (1,"test",1),(2,"test again", 2); 
Run Code Online (Sandbox Code Playgroud)

这也很好.但是当我尝试创建一个动态字符串时,它给出了错误"无法准备语句(1接近"?":语法错误)".

.success((function (result) {
                 var query = "INSERT INTO categories (category_id, category_name,category_type) VALUES ?";
                 var data = [];
                 result.forEach(function (category) {
                         data.push([category.id, category.category_name, category.category_type]);
                     });
    $cordovaSQLite.execute(db, query,[data]).then(function (res) {
         console.log("inserted");
     }, function (err) {
   console.dir(err);
    });
Run Code Online (Sandbox Code Playgroud)

Goo*_*gie 15

向插入添加多个参数,就像在测试查询中一样(您提到的第一个),然后将所有参数作为一维数组传递:

.success((function (result) {
                 var query = "INSERT INTO categories (category_id, category_name,category_type) VALUES ";
                 var data = [];
                 var rowArgs = [];
                 result.forEach(function (category) {
                         rowArgs.push("(?, ?, ?)");
                         data.push(category.id);
                         data.push(category.category_name);
                         data.push(category.category_type);
                     });
                 query += rowArgs.join(", ");
    $cordovaSQLite.execute(db, query,[data]).then(function (res) {
         console.log("inserted");
     }, function (err) {
   console.dir(err);
    });
Run Code Online (Sandbox Code Playgroud)

此代码将生成如下查询:

INSERT INTO categories (category_id, category_name,category_type) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?), (?, ?, ?);
Run Code Online (Sandbox Code Playgroud)

并且您的数据数组大小为12,其中数组中的每3个条目将是要插入的一行数据.

这些数字只是示例,它们取决于数量result.


Dav*_*ich 5

这似乎是一种方法:

var query = "INSERT INTO categories (category_id,category_name,category_type) VALUES (?,?,?)";
Run Code Online (Sandbox Code Playgroud)

...

.success((function (result) {

$cordovaSQLite.transaction(function(tx){

   result.forEach(function (category) {
      tx.executeSql(query, [category.id, category.category_name, category.category_type]);
   });
}).success(function(){

  .....
});
Run Code Online (Sandbox Code Playgroud)

我也见过这种方法:

$cordovaSQLite.execute("BEGIN IMMEDIATE TRANSACTION");
result.forEach(function (category) {
    $cordovaSQLite.executeSql(query, [category.id, category.category_name, category.category_type]);
       });
$cordovaSQLite.execute("COMMIT TRANSACTION");
Run Code Online (Sandbox Code Playgroud)