Имя: Пароль:
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ско для "широкого" общения.
пс. вопрос о том, что рекродсет определяет атрибуты для поля не так как хотелось бы, для меня все таки остался висеть..
Основная теорема систематики: Новые системы плодят новые проблемы.