Страницы: 1
RSS
v8sqlite. Ошибка при подключении к базе
 

Всем здравствуйте. Возникает ошибка «К сожалению возникла непредвиденная ситуация» при загрузке данных из внешней sqlite-базы. Не работает даже первая строка создание базы. Код следующий:

база = Новый("AddIn.v8sqlite.v8sqlite");

   база.ОткрытьБазуДанных("C:\Выгрузка_из_77.db");

   база.Выполнить("pragma encoding='UTF-16'");

   лРезультатЗапроса = база.ВыполнитьЗапрос("

       |select *

       |from Контрагенты", "ТаблицаЗначений", "");

   лТЗКонтрагенты = ЗначениеИзСтрокиВнутр(лРезультатЗапроса);

В чем может быть моя ошибка, что не так делаю?

 
Цитата
Larisa написал:
Всем здравствуйте. Возникает ошибка «К сожалению возникла непредвиденная ситуация» при загрузке данных из внешней sqlite-базы. Не работает даже первая строка создание базы. Код следующий:  база = Новый("AddIn.v8sqlite.v8sqlite");      база.ОткрытьБазуДанных("C:\Выгрузка_из_77.db");      база.Выполнить("pragma encoding='UTF-16'");      лРезультатЗапроса = база.ВыполнитьЗапрос("          |select *          |from Контрагенты", "ТаблицаЗначений", "");      лТЗКонтрагенты = ЗначениеИзСтрокиВнутр(лРезультатЗапроса);  В чем может быть моя ошибка, что не так делаю?
А компонента у вас подключена? Имею в виду нативную внешнюю компоненту для 1С 8 для работы с базами данных sqlite - v8sqlite. Вот она как раз дает возможность выполнить запросы к базам данных sqlite и получать их результаты в виде ТаблицыЗначений или массива массивов.

Сама библиотека sqlite подключена статически, то есть внедрена в ВК. Используется версия 3.39.4. Чтобы узнать свою версию вбейте запрос: select sqlite_version()

Вообще работать возможно с базами с любой кодировкой, стоит учитывать, что внутри 1С для данных типа "Строка" используется кодировка UTF-16, поэтому при чтении текста из баз с этой кодировкой движку sqlite не нужно выполнять каждый раз перекодировку текста из UTF-8 в UTF-16 и наоборот. Поэтому из соображений производительности, если вы планируете пользоваться базой данных в-основном в 1С, создавайте её в кодировке UTF-16. Для этого после первого открытия базы данных выполните pragma encoding:

   // Создать пустую базу в файле

   ИмяФайла = ПолучитьИмяВременногоФайла("db");

   база.ОткрытьБазуДанных(ИмяФайла);

   база.Выполнить("pragma encoding='UTF-16'");

 
Цитата
Larisa написал:
Всем здравствуйте. Возникает ошибка «К сожалению возникла непредвиденная ситуация» при загрузке данных из внешней sqlite-базы. Не работает даже первая строка создание базы. Код следующий:  база = Новый("AddIn.v8sqlite.v8sqlite");      база.ОткрытьБазуДанных("C:\Выгрузка_из_77.db");      база.Выполнить("pragma encoding='UTF-16'");      лРезультатЗапроса = база.ВыполнитьЗапрос("          |select *          |from Контрагенты", "ТаблицаЗначений", "");      лТЗКонтрагенты = ЗначениеИзСтрокиВнутр(лРезультатЗапроса);  В чем может быть моя ошибка, что не так делаю?
Попробовала сейчас сам создать базу – все ок, все создается. Может вам попробовать тогда вот так еще:

база.ОткрытьБазуДанных("file:/C:/Выгрузка_из_77.db?mode=ro");

Возможно, у вас нет прав на создание файлов в корне диска, а если база в режиме WAL, то при открытии не режиме "только чтение", sqlite пытается создать рядом с базой два служебных файла.

Вообще имейте в виду, что эта нативка подключается как обычная нативная ВК, например так

   Функция ПодключитьВК()

       ПутьКВК = КаталогПрограммы();

       СистемнаяИнформация = Новый СистемнаяИнформация;

       Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда

           ПутьКВК = ПутьКВК + "v8sqlite.dll";

       ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда

           ПутьКВК = ПутьКВК + "libv8sqlite.so";

       КонецЕсли;

       Если не ПодключитьВнешнююКомпоненту(ПутьКВК, "v8sqlite", ТипВнешнейКомпоненты.Native) Тогда

           Предупреждение("Не удалось подключить внешнюю компоненту " + ПутьКВК);

           Возврат Ложь;

       КонецЕсли;

       Возврат Истина;

   КонецФункции // ПодключитьВК()

После подключения доступен к созданию объект внешней компоненты, через который и можно будет работать с базой даных sqlite.

   база = Новый("AddIn.v8sqlite.v8sqlite");

 

Коллеги, тут несколько раз пересоздавал и переименовывал папку, в которой лежит v8sqlite. Подсовывал dll-ки разной разрядности. Вроде все получилось, всем спасибо! Возможно проблема крылась в том, что в названии папки "1С" была русскими буквами, а в коде - латинские буквы.

А подскажите еще такой момент - можно ли результат запроса сразу засунуть в ТЗ на форме? Чтобы не делать преобразования в промежуточную ТЗ?

РезультатЗапроса = база.ВыполнитьЗапрос(""..."):

ТЗКонтрагенты = ЗначениеИзСтрокиВнутр(РезультатЗапроса);

Можно ли сделать что-то типа:

ТЗНаФорме.Загрузить(РезультатЗапроса)?

 

К сожалению, нет, так не выйдет, механизм нативных ВК не предусматривает передачу и возврат объектов, только примитивные типы - строки, числа и т.п.

Ну например вот такие свойства объекта:

СтрокИзменено / Changes

Число. Только чтение.

Показывает, сколько строк было вставлено/изменено во время выполнения последнего запроса.

ПоследнийИд / LastId

Число. Только чтение.

После выполнения операций вставки выдает ID последней вставленной строки.

БазаДанныхОткрыта / isDataBaseOpen

Булево. Только чтение.

Показывает, открыта ли в данный момент база данных.

Страницы: 1