|   |   | 
| 
 | При чтении из sqlite-базы с помощью ADO портятся данные | ☑ | ||
|---|---|---|---|---|
| 0
    
        zelenprog 29.06.23✎ 10:09 | 
        Здравствуйте!
 Нужно в 1С8 загрузить данные из файла, которые представляет собой sqlite-базу. Открываем базу с помощью ADO. До недавних пор все работало нормально. Но вот недавно в sqlite-базу добавили новое поле с типом "Строка" длиной 1000 символов. И теперь, когда ADO читает это поле, команда "лНаборЗаписейАДО.Fields(лИмяКолонки).Value" возвращает строку с какими-то лишними символами-кракозябрами. Например, в строке содержится: "(81122) 73-72-73 ". В конце много "пробелов" до 1000 символов. ADO же возвращает: "(81122) 73-72-73 È È È " Из-за чего такое происходит? | |||
| 1
    
        Волшебник 29.06.23✎ 10:11 | 
        добавьте СтрЗаменить("È","") и СокрЛП     | |||
| 2
    
        zelenprog 29.06.23✎ 10:15 | 
        (1) Нет, проблема не в этом.
 В самой базе строки нормальные. АДО их почему-то портит. Если делать по вашему рецепту, то сначала ("È") будем менять, потом еще какие-то кракозябры. Вряд ли таким способом получится привести строку к ее исходному виду. Надо понять в чем проблема. | |||
| 3
    
        Волшебник 29.06.23✎ 10:18 | 
        (2) Решайте проблемы по мере их поступления.     | |||
| 4
    
        zelenprog 29.06.23✎ 10:47 | 
        (3) Так ведь это и есть первая проблема - порча строки при чтении из базы.
 Вот ее и решаем. | |||
| 5
    
        lEvGl гуру 29.06.23✎ 10:53 | 
        может драйвер поменять?     | |||
| 6
    
        lEvGl гуру 29.06.23✎ 10:54 | ||||
| 7
    
        eklmn гуру 29.06.23✎ 11:01 | 
        (6) а это драйвер? ))     | |||
| 8
    
        eklmn гуру 29.06.23✎ 11:02 | 
        (0) это не ты разрабатывал лерадатовский кусочек отрыжки?     | |||
| 9
    
        lEvGl гуру 29.06.23✎ 11:10 | 
        (7) а что, нет разве?)     | |||
| 10
    
        eklmn гуру 29.06.23✎ 11:24 | 
        (9) ODBC??     | |||
| 11
    
        zelenprog 29.06.23✎ 12:05 | 
        Драйвер я устанавливал как раз с этого сайта.
 Причем совсем недавно, с месяц назад. | |||
| 12
    
        crasler 29.06.23✎ 12:10 | 
        (11) Попробуй сделать дамп и загрузить в чистую бд файл     | |||
| 13
    
        lodger 29.06.23✎ 12:20 | 
        (11) а подключаешься через вот эту штуку? v8sqlite. Ошибка при подключении к базе     | |||
| 14
    
        Chai Nic 29.06.23✎ 13:18 | 
        Так данные в базе портятся или же криво выдаются? Это разные вещи.     | |||
| 15
    
        zelenprog 29.06.23✎ 13:47 | 
        (13) Нет. Через эту штучку не получилось.
 Подключаюсь через стандартный драйвер, который скачал с сайта sqlite SQLiteObject = Новый COMОбъект("ADODB.Connection"); SQLiteConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=" + ФайлБД + ";"; SQLiteObject.Open(SQLiteConnectionString); SQLiteRS = Новый COMОбъект("ADODB.Recordset"); SQLiteRS = SQLiteObject .Execute(пЗапрос); | |||
| 16
    
        zelenprog 29.06.23✎ 13:50 | 
        (14) >> Так данные в базе портятся или же криво выдаются? Это разные вещи.
 Данные в базе нормальные. Команда SQLiteRS.Fields("ФактАдрес").Value выдает "испорченную" строку. | |||
| 17
    
        zelenprog 29.06.23✎ 13:56 | 
        Я записываю данные в sqlite-базу в 1С 7.7 с помощью 1sqlite и ТаблицыЗначений:
 лБаза = СоздатьОбъект("SQLiteBase"); лБаза .Открыть("C:\Выгрузка.db"); лЗапрос = лБаза .НовыйЗапрос(); лЗапрос.ВыполнитьЗапрос("pragma encoding='UTF-16'"); лТЗ = СоздатьОбъект("ТаблицаЗначений"); лТЗ.НоваяКолонка("ID", "Строка", 100); лТЗ.НоваяКолонка("Наименование", "Строка", 100); лТЗ.НоваяКолонка("ФактАдрес", "Строка", 200); лБаза .УложитьТЗ(лТЗ, "Контрагенты77", 1); Я провел эксперимент. Оказалось, что проблема точно из-за длины строки. Если в ТЗ указаны длины строк например 200 символов, то эти строки на стороне 1С8 читаются нормально. Если в ТЗ указать длину строки например 1000 символов, то такая строка на стороне 1С8 читаются с кракозябрами. | |||
| 18
    
        zelenprog 29.06.23✎ 13:57 | 
        Получается драйвер криво отрабатывает длинные поля в sqlite-базе?
 Никто с таким не сталкивался? | |||
| 19
    
        Chai Nic 29.06.23✎ 14:00 | 
        (18) А если в запросе данные урезать через CAST?     | |||
| 20
    
        lEvGl гуру 29.06.23✎ 14:04 | 
        (18) сталкивался, но вопрос отпал и разбираться не стал
 Recordset SQLite | |||
| 21
    
        Djelf 29.06.23✎ 14:10 | 
        (0) Сама библиотека sqlite так устроена что чихать она хотела на тип данных в поле.
 Т.е. несмотря на определенный тип в поля в него можно засунуть что угодно. В каких-то последних релизах, вроде бы через pragma можно ужесточить такие вольности. (15) Это не "стандартный" драйвер, стандартного драйвера не существует. За корректность его работы, разработчики sqlite не несут ответственности. (17) Интересно. А в 7.7 такие поля нормально читаются? Тогда, да, виноват драйвер. | |||
| 22
    
        zelenprog 29.06.23✎ 14:17 | 
        (21) >> Интересно. А в 7.7 такие поля нормально читаются?
 Надо будет проверить. Пока не проверял. И еще один косяк. Все строки, записываемые из 7-ки в sqlite-базу, дополняются пробелами. Например, записываю строку "12-34-56", а записывается "12-34-56 ". Количество пробелов зависит от типа "Строка" и длины строки, установленного в колонке ТЗ. Это тоже неудобно. Приходится при чтении, всегда обрезать. | |||
| 23
    
        lEvGl гуру 29.06.23✎ 14:23 | 
        фиксированная длина поля видимо     | |||
| 24
    
        lodger 29.06.23✎ 14:24 | 
        (22) подозреваю, что данные испорчены при записи, и в талдычке sqlite тоже какая-то х.     | |||
| 25
    
        Djelf 29.06.23✎ 14:30 | 
        (22) Только что проверил и ответил в теме https://www.1cpp.ru/forum/YaBB.pl?num=1214205575/1141#1141
 Кратко: При выгрузке из 7.7 типизация "строка" в колонке тз требуется, количество символов не требуется (в том случае если строка переменной длины, а не какой-то жесткий идентификатор). | |||
| 26
    
        Djelf 03.07.23✎ 08:43 | 
        Разобрался. 
 Суть в следующем: 1sqlite при выгрузке тз с колонкой Name в базу sqlite создает такую таблицу "CREATE TABLE t (Name not null)" sqlite odbc сначала смотрит схему таблицы, и если в ней тип поля не varchar(1000), то типизирует как varchar(256) Исправить можно вот так: 
 | |||
| 27
    
        orefkov 03.07.23✎ 10:07 | 
        Дико пиарюсь^wизвиняюсь, но почему ADO, когда есть https://github.com/orefkov/v8sqlite?
 Не пробовали? | |||
| 28
    
        orefkov 03.07.23✎ 10:14 | 
        (22)
 Просто не указывай длину строки в типе колонки, или вообще не задавай ей тип. | |||
| 29
    
        Djelf 03.07.23✎ 10:22 | 
        (27) У него с этим проблема: v8sqlite. Ошибка при подключении к базе
 У меня все нормально, правда на W10x64. (28) Без VARCHAR(1000) не сработает, такой уж драйвер. http://www.ch-werner.de/sqliteodbc/html/index.html 
 | |||
| 30
    
        orefkov 03.07.23✎ 10:31 | 
        (29) Имхо всё-таки более правильно было бы разобраться, почему v8sqlite не работает. Лучше день потерять, потом за пять минут долететь :)     | |||
| 31
    
        zelenprog 03.07.23✎ 13:06 | 
        Спасибо, ребята!
 (26) >> Исправить можно вот так: >> ALTER TABLE t ADD Name2 VARCHAR (1000); >> UPDATE t SET Name2=Name; Где это нужно сделать? Перед чтением данных в 1С8 с помощью ADO? Или при записи данных в 1С77? Может быть лучше перед записью данных в 1С77 явно создать колонку с нужным типом? А потом уже сделать "уложение" ТЗ? (30) >> Имхо всё-таки более правильно было бы разобраться, почему v8sqlite не работает. Лучше день потерять, потом за пять минут долететь :) Я согласен. Но я потратил уже больше дня. И так и не понял в чем причина. Не подключается v8sqlite и все тут! Думаю, что виновата моя Win11. | |||
| 32
    
        Djelf 03.07.23✎ 13:33 | 
        (31) А уже нигде не надо ;) Забирай 1sqlite_3.42.0.30_draft4.zip https://cloud.mail.ru/public/9znr/ZJ6ULE9aR
 +При укладке ТаблицыЗначений в том случае, если типизация колонки Строка и указана ее Длина поле в sqlite будет типироваться как varchar(длина). Во всех предидущих версиях, как было указано выше, лучше при выгрузке, быстрее будет. P.S. все таки используй формат базы utf-8, а не utf-16. Самое медленное это запись на диск, а не преобразования туда сюда. А база в формате utf-16 раза в 4 больше, это существенно. Можешь потестить скорость на приличном объеме, это не долго. | |||
| 33
    
        zelenprog 06.07.23✎ 09:16 | 
        Какая вообще может быть максимальная длина строки в sqlite-базе?
 А какая максимальная длина строки может быть в ТаблицеЗначений (интересно и для 1С 7.7 и для 8.3)? | |||
| 34
    
        lodger 06.07.23✎ 10:06 | 
        (33) когда-то 1с признавалась, что кладёт мегастроки в ntext
 https://its.1c.ru/db/pubapplied/content/329/hdoc/_top/ntext а он в свою очередь вмещает maximum string length of 2^30 - 1 (1,073,741,823) bytes https://learn.microsoft.com/en-us/sql/t-sql/data-types/ntext-text-and-image-transact-sql?view=sql-server-ver16 | |||
| 35
    
        zelenprog 06.07.23✎ 11:07 | 
        (34) А для строк переменной длины VARCHAR(n) есть какое-то ограничение?     | |||
| 36
    
        Djelf 06.07.23✎ 11:58 | 
        (35) 65536 см. SQL_LONGVARCHAR 
 
 | |||
| 37
    
        zelenprog 06.07.23✎ 17:20 | 
        А в программном коде 1С есть какое-то ограничение на длину строк в колонках ТаблицыЗначений с типом "Строка"?     | |||
| 38
    
        lodger 06.07.23✎ 19:26 | 
        (37) для 8ки кто-то изголялся в оперативке в переменной наращивая Строку неограниченную пошагово - оно сдыхало где-то на 20+ итераций, ближе или больше 1 млн значков. а тебе зачем столько?     | |||
| 39
    
        zelenprog 07.07.23✎ 08:19 | 
        (38) Просто интересно чисто теоретически     | |||
| 40
    
        Djelf 07.07.23✎ 08:33 | 
        (37) В ТаблицеЗначний нет строк, там ссылки на строки, а самих строк там нет.     | |||
| 41
    
        DrZombi гуру 07.07.23✎ 08:38 | 
        (0) Скорей всего она их не портит. 1С если что-то не может показать, она это не показывает, но это не значит, что их там нет.
 Обычно этот эффект можно добиться, к примеру простой загрузкой данных через режим "ОбменДанными.Загрузка = Истина". Вы в поле с "1000" символами, можете записать символы, которые 1С не может пережевать на Тонком клиенте. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |