Имя: Пароль:
1C
1С v8
Recordset SQLite
0 lEvGl
 
гуру
23.07.15
11:08
Доброго здоровья всем
пытаюсь читать из SQLLite посредством Recorset через драйвер SQLite3 ODBC Driver

Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("DRIVER=SQLite3 ODBC Driver;Database=D:\results.db;");
RecordSet = Новый COMОбъект("ADODB.Recordset");
RecordSet.Open("Select
Cast(Result.Value_binary as character(10000)) As XML
From result As result", Connection, 3);

Тип поля - BLOB, там хранится описание данных, которые нужны в виде XML. При прямом запросе из браузера SQLite запрос возвращает полную строку (много букв ~ 2000-3000), схема XML в текстовом варианте. При обходе выборки, полученной через recordset значение этого поля обрезается до 255 символов. СтрДлина(RecordSet.Fields(0).Value) показывает как будто строка полная, но сами символы не видны в отладчике, сохранение текста в файл через Новый ТекстовыйДокумент тоже самое и т д. Разобрать XML не получается.
1 shuhard_серый
 
23.07.15
11:10
(0) путчек и гетчек
2 Лефмихалыч
 
23.07.15
11:12
попробуй
Convert(VarChar(10000), Result.Value_binary)
3 lEvGl
 
гуру
23.07.15
11:13
Почему Recordset так себя ведет?
(0) GetChunk()? или не то, подробней можно?)
(1) Convert насколько я понял в SQLite нет
4 lEvGl
 
гуру
23.07.15
11:16
+(3) почему так ведет - имею ввиду заставить понимать размерность поля вариантов нет ? Про эксель драйвер начитал - можно править количество строк, по которым он определяет размер для всего поля http://forum.infostart.ru/forum86/topic131531/ а тут другое
5 lEvGl
 
гуру
23.07.15
18:44
Не пойму что не так
(1) не работает
Произошла исключительная ситуация (ADODB.Field): Операция не допускается в данном контексте.

Возможность использования GetChunk определяется свойством adFldLong, не пойму где его найти?
6 Маленький Вопросик
 
23.07.15
19:11
по-моему там ограничения в поле до 1000 кб ... сталкивался с этим несколько лет назад....
7 lEvGl
 
гуру
23.07.15
19:29
а там это где ?
да (1) должно работать, но где то не так делаю, пробовал настройки и соединения и рекордсета и через стрим пробовал... рекордсет в value выдает обрезок строки или safeArray, заполненный до 255 элемента, как не сохраняй, куда не грузи - лажа в общем ) либо поле без adFldLong, не слишком длинное типа, либо.. больше не на что думать..
8 shuhard_серый
 
23.07.15
19:36
(7) [больше не на что думать..]
что-то мешает задать вопрос по специфике GetChunk на форуме вендора ?

ибо ADODB про это не знает
9 sapphire
 
23.07.15
19:58
10 Маленький Вопросик
 
23.07.15
20:12
(0) кстати, а почему через recordset именно?

чем запрос не устраивает???

SQLiteObject.Execute(Запрос);
11 lEvGl
 
гуру
23.07.15
20:33
(9) в общем все не просто, надо сделать на VB, потом перекинуть к себе
(10)похоже recorset и вернет
12 lEvGl
 
гуру
27.07.15
15:49
лажа, не работает, пробовал много вариантов, один из них такой
Dim cn As ADODB.Connection, rs As ADODB.Recordset, SQL As String, fld As ADODB.Field, bData() as Byte

cn = New ADODB.Connection
rs = New ADODB.Recordset
cn.CursorLocation = ADODB.CursorLocationEnum.adUseServer
cn.Open("dsn=SQLite3 Datasource")
SQL = "Select result.Value_binary As XML From result as result Where result.id = 23290)"
rs.Open(SQL, cn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly)
fld = rs.Fields(0)
bData = fld.GetChunk(fld.ActualSize)
"операция не доступна в данном контексте" и все тут.
Type поля = adBinary (по документации должен быть LongVarChar, LongVarWChar или LongVarBinary - как привести к такому типу? cast дает VarChar, VarWChar), сумма констант attributes насколько понимаю значения adFldLong не содержит (по документации должна, где это определяется - при создании исходной базы? добавлял свой столбец - настройки, указывающей на что то похожее на увидел). Вариант вытягивания данных - через substring в цикле и преобразование двоичных данных, но некрасиво, давно бы забил, но просто интересно.  Укажите в каком месте косяк: рекордсет - тип курсора, место курсора(сервер/клиент) или тип блокировки; или чанк надо как то получать не так; или поле в исходной базе не такое? Код вроде простой, для использования GetChunk по примерам с MS support тоже ничего особенного; требования к полю есть(attributes и type), но как же тогда создать его "правильно", для "гетчега" и "путчега", чтоб работали?
13 lEvGl
 
гуру
27.07.15
17:24
fld.Attributes = ADODB.FieldAttributeEnum.adFldLong - false
есть ли возможность сделать наоборот? доступ к базе есть
14 Serginio1
 
27.07.15
17:42
Попробуй для начала на Ado.Net
15 Serginio1
 
27.07.15
17:44
16 lEvGl
 
гуру
29.07.15
10:55
(15) так работает.

через SQLiteConnection -> SQLiteCommand -> SQLiteDataReader
получает все полностью, НО это будет обертка, так как качал System.Data.SQLite.dll для .Net
17 Serginio1
 
29.07.15
11:05
Все обертка. Используй v8: Использование сборок .NET в 1С 7.x и 8.x v8: v8: Использование сборок .NET в 1С 7.x и 8.x
18 lEvGl
 
гуру
29.07.15
11:20
обертка обертке - рознь ) адо тоже обертка, но она есть в системе по умолчанию, а это надо устанавливать
спасибо за ссылку, почитаю..
19 trdm
 
29.07.15
11:32
Да ладно, над SQLite столько оберток уже, что можно адо и не тянуть.
Там с ней exe-шник поставляется для командной строки, можо и через него сделать.
20 lEvGl
 
гуру
29.07.15
13:52
(19)вот сижу и думаю... это ж надо фреймворк ставить на "целевую" машину
21 oleg_km
 
29.07.15
14:03
(20) О да, это основная трудность? Мне бы ваши проблемы (шутка)
22 lEvGl
 
гуру
29.07.15
14:12
(21) да согласен, что это не такая большая проблема - инсталл запустить, но говорит об универсальности решения
23 lEvGl
 
гуру
29.07.15
14:32
+ а рекродсет, скажу еще раз, работает по умолчанию :)
все равно, тем кто поучаствовал - спасибо, Serginio1 похоже вложил немало сил, как и  oleg_km. Буду делать универсальную обертку, подобные задачи появляются часто, можно рассматривать это как отдельный обязательный подблок. Не предназначена 1ско для "широкого" общения.
пс. вопрос о том, что рекродсет определяет атрибуты для поля не так как хотелось бы, для меня все таки остался висеть..
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn