>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >sql insert http://forum.mozilla-russia.org/viewtopic.php?id=50096 |
bidlocoder > 06-06-2011 02:18:05 |
делаю приложение которое предполагает работу с данными, в качестве хранилища естественно выбрал sqllite, но столкнулся с проблемой дело в том что мне нужно делать множественные insert & select в базу Выделить код Код:INSERT INTO test VALUES ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81') работает нормально, а вот вставка нескольких строк Выделить код Код:INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'), ('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5') не работает что я делаю не так? |
hydrolizer > 06-06-2011 02:48:00 |
bidlocoder пишет
1. Как не работает? Вызывает краш FF? Вызывает BSOD? Выбрасывает эксепшн? Просто не видно новых данных? |
bidlocoder > 06-06-2011 02:57:20 |
вызывает эксепшн, ругается на синтаксис запроса вот что пишет: [ near ",": syntax error ]
2)если с приложения |
hydrolizer > 06-06-2011 03:00:05 |
bidlocoder пишет
Ну так у вас же bidlocoder пишет
Не знаю, откуда вы взяли такой синтаксис вставки нескольких записей, но он явно не ANSI-шный, и поэтому вовсе не обязан работать в sqlite. ANSI-стандарт предполагает только 2 варианта использования insert: для одиночной записи - insert into table_name [(columns_list)] values(values_list) для нескольких записей - insert into table_name [(columns_list)] select ... И всё. Хотите вставить несколько записей с данными, заданными в виде значений - используйте несколько отдельных statements по одному на каждую запись |
bidlocoder > 06-06-2011 03:04:29 |
я уже пробовал, получается ну ОООООчень медленно((( |
hydrolizer > 06-06-2011 03:40:11 |
bidlocoder Выделить код Код:const { classes: Cc, interfaces: Ci, utils: Cu } = Components; try { var dbFile=Services.dirsvc.get("ProfD", Ci.nsILocalFile); dbFile.append("foo.sqlite"); var ssvc=Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService); var mDBConn = ssvc.openDatabase(dbFile); try{ mDBConn.executeSimpleSQL("drop table foo"); } catch(err){} mDBConn.executeSimpleSQL("create table foo(n integer)"); var insertStatements=[]; var insertSQL="insert into foo values(:n)"; for(var i=0;i<10000;i++) { var statement=mDBConn.createStatement(insertSQL); statement.params.n=i; insertStatements.push(statement); } var startTime=new Date().getTime(); mDBConn.beginTransaction(); mDBConn.executeAsync(insertStatements, insertStatements.length, { handleError: function(aError) { Services.console.logStringMessage(aError.message); }, handleCompletion: function(aReason) { if (aReason!=0) { Services.console.logStringMessage("executeAsync finished with reason: "+aReason); return; } mDBConn.commitTransaction(); Services.console.logStringMessage("insert completed in " +(new Date().getTime()-startTime)+"msec"); mDBConn.asyncClose(function() { Services.console.logStringMessage("connection closed"); }); }, handleResult: function(aResultSet) {} }); } catch(err) { Services.console.logStringMessage(err+"\n"+err.stack); } (точнее - ~250 мсек. на селероне 1.86 ГГц с 1 Мб ОЗУ). |
hydrolizer > 06-06-2011 07:12:43 |
Стало самому интересно насчет скорости - набросал и прогнал тесты для вставки 10 000 строк в разных вариантах. Тесты выложены здесь: http://pastebin.mozilla-russia.org/108842 (не стал приводить код в теме, т.к. кода достаточно много). Варианты по ссылке: |
bidlocoder > 06-06-2011 17:24:17 |
спасибо за дельный совет и приведенный код |