2015年12月28日node
直接傳入執行事務的全部SQL語句不可行。git
上午不知道爲何,使用navicat直接執行sql語句的時候,運行事務都不會成功。下午運行成功了,遂放心開始使用node.js開始編程。github
後臺處理函數:sql
//新增內容 function addTableInfo(res, data) { var data = JSON.parse(data); var sql = ''; var returnMsg = ''; rowSql = 'INSERT INTO ' + data.tableName + ' ' + data.tableRows + ' VALUES '; db.serialize(function() { db.run('BEGIN TRANSACTION;'); for(var i = 0; i < data.vals.length; i++) { sql = rowSql + data.vals[i] + '; '; console.log(sql); var k = 0; db.run(sql, function(err, rows) { if(!err) { k++; //當全部的回調都執行完成時,返回錯誤 if(k == (data.vals.length)) { console.log('returnMsg返回錯誤' + returnMsg); if(returnMsg) { res.end(returnMsg); } else { res.end('新增成功!'); }; }; } else { returnMsg = returnMsg + '【數據:' + data.vals[k] + '新增失敗,' + err + '】'; k++; if(k == (data.vals.length)) { if(returnMsg) { console.log('returnMsg返回錯誤:' + returnMsg); res.end(returnMsg); } else { res.end('新增成功!'); }; }; }; }); }; db.run('COMMIT TRANSACTION;'); }); };
若是data的內容是:數據庫
{"tableName":"eqpt_info","tableRows":"(eqpt_code, eqpt_name, eqpt_ty
pe, eqpt_address, create_time)","vals":["(1,2,2,2,2)","(1,3,2,2,2,)","(1,4,2,2,2
)","(1,5,2,2,2,4)"]}編程
那麼返回的returnMsg數據是:函數
returnMsg返回錯誤【數據:(1,3,2,2,2,)新增失敗,Error: SQLITE_ERROR: near ")": sy
ntax error】【數據:(1,5,2,2,2,4)新增失敗,Error: SQLITE_ERROR: 6 values for 5 c
olumns】spa
須要使用node-sqlite3的流程控制函數 code
也從別人寫的IOS的sqlite3事務執行方法中獲得了靈感。sqlite
sqlite3的事務執行方法和其它的數據庫不太相同。
使用sqlite3的事務的時候,直接傳入:
BEGIN TRANSACTION; INSERT INTO eqpt_info (eqpt_code, eqpt_name, eqpt_type, eqpt_address, create_time) VALUES (1,2,2,2,2); INSERT INTO eqpt_info (eqpt_code, eqpt_name, eqpt_type, eqpt_address, create_time) VALUES (1,2,2,2,2); INSERT INTO eqpt_info (eqpt_code, eqpt_name, eqpt_type, eqpt_address, create_time) VALUES (1,2,2,2,2); INSERT INTO eqpt_info (eqpt_code, eqpt_name, eqpt_type, eqpt_address, create_time) VALUES (1,2,2,2,2); COMMIT TRANSACTION;
這樣的SQL語句,不會執行成功。