Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   SQLite и Javascript (https://javascript.ru/forum/misc/42926-sqlite-i-javascript.html)

Mel 14.11.2013 10:58

SQLite и Javascript
 
Поиском не нашел. Может, не те вопросы задавал поиску.
Суть проблемы в следующем: имеется HTA, который обращается к локальной SQLite базе через ODBC.
Имеем функцию, выдающую данные из Recordset по запросу.

База открыта, соединение установлено. Обращаемся к первой записи. При первом вызове всё прекрасно, при втором ошибка «Произошла ошибка во время выполнения многошаговой операции».

Ради эксперимента сделал alert содержимого, полученного запросом, затем присвоение. В результате уже при первом запросе alert показывает всё, а присвоение уже выдаёт ошибку.

То есть, при повторном обращении к одному и тому же Recordset'у получение значения поля вызывает ошибку.

Подскажите, где можно накопать на эту тему внятных объяснений.

Для проверки можно использовать базу данных Skype. Строка соединения:
Код:

DRIVER=SQLite3 ODBC Driver;Database=<путь до базы данных Skype>main.db;LongNames=0;Timeout=1000;NoTXN=0;
SyncPragma=NORMAL;StepAPI=0;

Открываем таблицу контактов:
Код:

select * from Contacts
Прочитайте два раза подряд содержимое поля «skypename» первой записи.

При этом поля «id», «is_permanent» и «type» читаются. Получается, такая проблема возникает при чтении только текстовых полей.

Octane 14.11.2013 14:43

Рекомендую переписать все с использованием node-webkit.

Mel 15.11.2013 06:23

К сожалению, переписать всё — не вариант. База SQLite — это один и далеко не самый важный момент в проекте. Переписывать весь проект нереально, это более семидесяти мегабайт кода.

Прикрутить sql.js тоже не получается. В HTA при подключении модуля выскакивает ошибка:


Mel 15.11.2013 09:07

Удивительно. Если перед обращением к свойству ADODB.Recordset.Fields.Item (FieldName).Value выполнить Recordset.Save('d:\\1.txt', 1), значение получается. Правда, лишь в том случае, если файла 1.txt не существует. Иначе опять ошибка.

Можно, конечно, записывать какой-то временный файл, проверять его наличие при каждом обращении и, если есть, грохать, но как-то мне не кажется это правильным выходом из ситуации. Requery и Resync для SQLite не работают.

Mel 18.11.2013 06:25

Проблема решилась изменением параметров при открытии Recordset'а.

Было:
Recordset.Open (Sql, ConnectionString, 0, 2);


CursorType - adOpenForwardOnly(0) - определяет forward-only курсор. То же, что и статический курсор, но вы можете прокручивать записи только вперед. Это оптимизирует выполнение, если вы должны сделать только один проход по Recordset'у.

Стало:
Recordset.Open (Sql, ConnectionString, 3, 2);


CursorType - adOpenStatic(3) - Определяет статический курсор. Статическая копия набора записей, которую вы можете использовать, чтобы найти данные или генерировать отчёты. Добавления, изменения или удаления другими пользователями не видимы.


Часовой пояс GMT +3, время: 01:18.