Имя: Пароль:
1C
1С v8
Получить 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
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);