|
Получить bytea в 1С | ☑ | ||
---|---|---|---|---|
0
KuJIT
19.12.15
✎
10:49
|
Собственно, ищу способ получить bytea в 1С. Подключаюсь к БД на psql, используя команды
Connection = Новый COMОбъект("ADODB.CONNECTION"); Connection.Provider = "MSDASQL.1"; Connection.ConnectionString = "Driver={PostgreSQL Unicode};data source=PostgreSQL35W;Server="+Хост+";Port=" + Порт+";Database="+ИмяБД+";Uid="+ИмяПользователя+";Pwd="+Пароль+";STMT="+"utf8"; Выполняю запрос в БД при помощи НаборЗаписей = Новый ComObject("ADODB.RecordSet"); Команда = Новый COMОбъект("ADODB.Command"); Попытка Команда.ActiveConnection = Connection; Команда.CommandText = ПолучитьТекстЗапроса(ИмяТаблицы); НаборЗаписей = Команда.Execute(); Сообщить("Данные получены."); Исключение // Сообщить("Нет данных."); Сообщить(ОписаниеОшибки()); Возврат -1; КонецПопытки; Как обработать поля с типом bytea. Например, вытащить из БД картинки, который там хранятся в bytea? |
|||
1
Serginio1
19.12.15
✎
11:02
|
||||
2
Мэс33
19.12.15
✎
11:11
|
Искать пробовали?
Например, тут хорошая подсказка http://www.sql.ru/forum/984612/kak-vytashhit-fayly-iz-polya-tipa-bytea-na-disk |
|||
3
KuJIT
19.12.15
✎
11:38
|
(2) этот вариант слишком костыльный какой-то, что ли. Выгрузить файлы диск, где-то вести учет какой файл к какой строке БД принадлежит, потом по этому соответствию подгружать в 1Ску.
|
|||
4
KuJIT
19.12.15
✎
12:51
|
(1) А вот это не понял как использовать -_-
Не совсем понятно что именно возвращает НаборЗаписей = Новый ComObject("ADODB.RecordSet"); Команда = Новый COMОбъект("ADODB.Command"); Команда.ActiveConnection = Connection; Команда.CommandText = ПолучитьТекстЗапроса(ИмяТаблицы); НаборЗаписей = Команда.Execute(); НаборЗаписей.Fields(НомерСтолбца).Value последняя строка. Для простых типов тип строки, возвращает строку, которую комфортно можно прочитать, а если там был bytea, то какой тип получается в 1Ске? |
|||
5
oleg_km
19.12.15
✎
14:55
|
Вроде как COMSafeArray
|
|||
6
oleg_km
19.12.15
✎
14:56
|
Но зато если выгрузить на диск в файл, то можно потом загрузить в ДвоичныеДанные или Картинка и записать в ХранилищеЗначений в базу
|
|||
7
Serginio1
19.12.15
✎
16:13
|
В отладчике посмотреть. По идее должен в COMSafeArray.
Который можно перекодировать в Base64 а из неё в Двоичные данные. Либо Врап.ПолучитьТип("System.IO.File").WriteAllBytes(имяФайла,Массив); |
|||
8
Serginio1
19.12.15
✎
16:15
|
||||
9
KuJIT
22.12.15
✎
09:23
|
1Ска крашится, как только я пытаюсь value столбца с bytea из запроса записать в какую-либо переменную в 1С. Отсюда невозможно как-либо его обработать (придётся, видимо, в файлы выгружать) -_-
|
|||
10
Мэс33
22.12.15
✎
09:36
|
(9) придется.
|
|||
11
KuJIT
22.12.15
✎
10:02
|
Кстати, поле Type для этого столбца возвращает загадочное число 204 оО
|
|||
12
Serginio1
22.12.15
✎
10:17
|
Там вроде возврашаем массив char
Попробуй http://stackoverflow.com/questions/7150873/postgres-bytea-column-is-returning-string-char-array-instead-of-byte-array http://catalog.mista.ru/public/238584/ |
|||
13
KuJIT
22.12.15
✎
13:00
|
Есть мнение, что там что-то побитое (сломанное) может лежать в некоторых полях из-за чего все и ломается.
|
|||
14
KuJIT
22.12.15
✎
13:00
|
(7) В отладчике ничего и не посмотришь, бо при попытке почитать value 1Ска крашится
|
|||
15
Мимохожий Однако
22.12.15
✎
13:05
|
А не надо напрямую если чё
|
|||
16
Serginio1
22.12.15
✎
14:53
|
||||
17
Serginio1
22.12.15
✎
20:24
|
Посмотри там есть пример работы с bytea
http://www.npgsql.org/doc/manual-2.2.html Working with large object support This sample is nearly identical to the bytea code above. It stores the retrieved file in Postgresql, and then later removes it. As with the bytea sample, it writes a file with a “database” suffix. using System; using System.Data; using Npgsql; using NpgsqlTypes; using System.IO; public class c { public static void Main(String[] args) { NpgsqlConnection newconn = new NpgsqlConnection("server=localhost;user id=npgsql_tests;password=npgsql_tests"); newcon.Open(); NpgsqlTransaction t = newcon.BeginTransaction(); LargeObjectManager lbm = new LargeObjectManager(newcon); int noid = lbm.Create(LargeObjectManager.READWRITE); LargeObject lo = lbm.Open(noid,LargeObjectManager.READWRITE); FileStream fs = File.OpenRead(args[0]); byte[] buf = new byte[fs.Length]; fs.Read(buf,0,(int)fs.Length); lo.Write(buf); lo.Close(); t.Commit(); t = newcon.BeginTransaction(); lo = lbm.Open(noid,LargeObjectManager.READWRITE); FileStream fsout = File.OpenWrite(args[0] + "database"); buf = lo.Read(lo.Size()); fsout.Write(buf, 0, (int)lo.Size()); fsout.Flush(); fsout.Close(); lo.Close(); t.Commit(); DeleteLargeObject(noid); Console.WriteLine("noid: {0}", noid); newcon.Close(); } public static void DeleteLargeObject(Int32 noid) { NpgsqlConnection conn = new NpgsqlConnection("server=localhost;user id=npgsql_tests;password=npgsql_tests"); newcon.Open(); NpgsqlTransaction t = newcon.BeginTransaction(); LargeObjectManager lbm = new LargeObjectManager(newcon); lbm.Delete(noid); t.Commit(); newcon.Close(); } } |
|||
18
Serginio1
22.12.15
✎
20:50
|
Там же
command = new NpgsqlCommand("select field_bytea from tableBytea where field_serial = (select max(select field_serial) from tableBytea);", conn); Byte[] result = (Byte[])command.ExecuteScalar(); fs = new FileStream(args[0] + "database", FileMode.Create, FileAccess.Write); BinaryWriter bw = new BinaryWriter(new BufferedStream(fs)); bw.Write(result); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |