SQLite и Javascript
Поиском не нашел. Может, не те вопросы задавал поиску.
Суть проблемы в следующем: имеется HTA, который обращается к локальной SQLite базе через ODBC. Имеем функцию, выдающую данные из Recordset по запросу. База открыта, соединение установлено. Обращаемся к первой записи. При первом вызове всё прекрасно, при втором ошибка «Произошла ошибка во время выполнения многошаговой операции». Ради эксперимента сделал alert содержимого, полученного запросом, затем присвоение. В результате уже при первом запросе alert показывает всё, а присвоение уже выдаёт ошибку. То есть, при повторном обращении к одному и тому же Recordset'у получение значения поля вызывает ошибку. Подскажите, где можно накопать на эту тему внятных объяснений. Для проверки можно использовать базу данных Skype. Строка соединения: Код:
DRIVER=SQLite3 ODBC Driver;Database=<путь до базы данных Skype>main.db;LongNames=0;Timeout=1000;NoTXN=0; Код:
select * from Contacts При этом поля «id», «is_permanent» и «type» читаются. Получается, такая проблема возникает при чтении только текстовых полей. |
Рекомендую переписать все с использованием node-webkit.
|
К сожалению, переписать всё — не вариант. База SQLite — это один и далеко не самый важный момент в проекте. Переписывать весь проект нереально, это более семидесяти мегабайт кода.
Прикрутить sql.js тоже не получается. В HTA при подключении модуля выскакивает ошибка: ![]() |
Удивительно. Если перед обращением к свойству ADODB.Recordset.Fields.Item (FieldName).Value выполнить Recordset.Save('d:\\1.txt', 1), значение получается. Правда, лишь в том случае, если файла 1.txt не существует. Иначе опять ошибка.
Можно, конечно, записывать какой-то временный файл, проверять его наличие при каждом обращении и, если есть, грохать, но как-то мне не кажется это правильным выходом из ситуации. Requery и Resync для SQLite не работают. |
Проблема решилась изменением параметров при открытии 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. |