Vadim в инспекторе объектов свойство Params. Не сохраняются сами параметры (при перезапуске Лазаруса значение сбрасывается в ноль). Решил соответствующим кодом при старте программы.
- Код: Выделить всё
SQLQuery.Params.CreateParam(ftString, 'idus', ptUnknown);
SQLQuery.Params.CreateParam(ftString, 'FName', ptUnknown);
//и так далее
Вот какой еще вопрос волнует и куда больше волнует, нежели не сохраняющиеся параметры.
Мне по заданию необходимо, чтобы несколько экземпляров программы имело доступ к одной БД. Для этих целей и была посоветована SQLite вместо привычных мне dbf-ок. Но вот засада. Сейчас вроде всё работает, всё прелестно, но вот эта самая мультиПользовательность не работает вообще.
Описываю ситуацию. Если выполняется INSERT в одном экземпляре программы, только один INSERT, после него ничего - всё работает. Этот же инсерт может выполняться хоть из 20 других экземпляров приложения в ту же самую базу данных - всё прекрасно.
Делаю таки вот так:
- Код: Выделить всё
SQLQuery.Close;
SQLQuery.SQL.Clear;
SQLQuery.SQL.Text:='INSERT INTO users (ID_us,FirName,PatName,SurName,NickName ) VALUES(:idus, :FName,:PName, :SName, :NName)';
if not SQLQuery.Prepared then
SQLQuery.Prepare;
SQLQuery.ParamByName('idus').AsString:=s;
SQLQuery.ParamByName('FName').AsString:=Edit2.text; SQLQuery.ParamByName('PName').AsString:=Edit3.text;
SQLQuery.ParamByName('SName').AsString:=Edit1.text; SQLQuery.ParamByName('NName').AsString:=Edit4.text;
SQLQuery.ExecSQL;
SQLTransaction.Commit;
Способ с
SQLite3Connection.ExecuteDirect, описанный выше освоить не получилось, там какие-то странные вещи с параметрами (нельзя обратится к ним по имени и тд), не понял, как с ними работать + транзакция не хотела начинаться

. Если совсем прижмет - еще попробую.. Но пока по старинке - с квери.
Дык вот, вышеописанный код, как уже сказал, работает прекрасно из кучи приложений, но если после него добавить SELECT, например стандартный:
- Код: Выделить всё
SQLQuery.Close;
SQLQuery.SQL.Clear;
SQLQuery.SQL.Text:='SELECT * from tests';
SQLQuery.Open;
SQLQuery.close;
То всё, пиши "пропало". После попытки второго (и всех последующих, конечно) экземпляра приложения ИНСЕРТнуть что-нибудь - вылетает
database is locked. Что я уже только не пробовал после этого СЕЛЕКТа, перезакрывал все транзакции, квери и Конекшены, закрывал все датаСеты. Ничего не помогает...
Как же разблочить БД после СЕЛЕКтов? (они мне нужны, ибо в БД не только вставляются новые записи). Я уже начитался того, что SQLite изначально полностью однопользовательская, но одновременно писатьчитать таки как-то можно.. Но разобраться в том, как - гугл не помог.
Добавлено спустя 42 минуты 29 секунд:Метод тыка хоть и долгий, но очень часто таки даёт плоды.
В итоге, после того, как выборка выполненного SELECT уже не нужна, пишем
- Код: Выделить всё
SQLQuery.ExecSQL;
SQLTransaction.Commit;
И у-аля! Всё работает.
Почти наверняка способ косой и через одно место, но работает же%)) По крайней мере пока. Если кто знает более разумное решение для обеспечения многопользовательности - ОЧЕНЬ прошу отписать сюда
Надеюсь, что и мои изыскания кому-нибудь когда-нибудь да помогут
