AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.07.2017, 19:12   #1  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Чтение картинки из БД
Всем доброго дня. Прошу совета вот в каком вопросе. У меня есть две аксаптовских БД (4 и 12). Так уж получилось что и в той в той есть одинаковые товары, но в базе Ах4 в отдельной таблице есть картинки. Задача при нажатии кнопки в Ах12 подтягивать картинку из базы Ах4 и записывать её в базу Ах12. Где-то натыкался на подобное обсуждение, но не могу его сейчас найти.
Пробовал вот так
X++:
        loginProperty    = new LoginProperty();

        loginProperty.setServer  (systemParameters.Ax4ServerName);
        loginProperty.setDatabase(systemParameters.Ax4DatabaseName);

        odbc =  new ODBCConnection(loginProperty);

        if(odbc)
        {
            binData = new BinData();

            statement       = odbc.createStatement();

            queryText   = strfmt(<>);

            perm = new SqlStatementExecutePermission(queryText);
            
            perm.assert();

            odbc.ttsbegin();

            resultSet = statement.executeQuery(queryText);
            CodeAccessPermission::revertAssert();

            resultSet.next();

            inventItemImage = InventItemImage::findOrCreate(_inventTable.ItemId, InventItemImageFormat::FullAx, true);
            
            // но не могу из resultSet забрать картинку и положить в binData

            odbc.ttscommit();

            inventItemImage.Image = binData.getData();
            inventItemImage.update();

            _inventTable.IsImage = NoYes::Yes;
            _inventTable.update();
Может у кого-нибудь все-таки получилось из resultSet достать картинку?
Еще пробую вот так
X++:
sqlConnection = new System.Data.SqlClient.SqlConnection(strFmt("Data Source=%1;Initial Catalog=%2;Integrated Security=True",
        systemParameters.Ax4ServerName,
        systemParameters.Ax4DatabaseName));

    queryText   = strfmt(<>);

    sqlCommand    = new System.Data.SqlClient.SqlCommand(queryText, sqlConnection);

    try
    {
        sqlConnection.Open();

        sqlCommand.ExecuteNonQuery();
        
        binData = new BinData();
       
        binData.setData(sqlCommand.get_Container()); 
// вот тут ругается на что setData вызван с недопустимыми параметрами

        sqlCommand.Dispose();

        sqlConnection.Close();
        sqlConnection.Dispose();

        ttsBegin;

        inventItemImage = InventItemImage::findOrCreate(_itemId, InventItemImageFormat::FullAx, true);

        inventItemImage.Image = binData.getData();
        inventItemImage.update();

        ttsCommit;
    }
    catch
    {
        info(CLRInterop::getLastException().ToString());
        sqlConnection.Close();
    }
В этом случае я в правильном направлении иду?
Еще был вариант слинковать сервера и написать что-то вроде
X++:
update t1 set t1.Image=t2.Image
from TableWithImage t1 join [SQLAx4].Ax4.dbo.TableWithImage  t2
но мне сказали что при выполнении подобных запросов на линкованных серверах сначала требуемая таблица полностью скачается на сервер, а лишь потом из неё сделается выборка. В данном случае в таблице картинки и перекидывать её между серверами неприемлемо.
Старый 01.08.2017, 07:05   #2  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Забирал изображение из 1С, код вида:
X++:
    Com         connect;
    com         comImage, comImageGet;
    BinData     binData;
    container   con;            
;
comImageGet = connect.NewObject("Картинка");
comImageGet = comImage.Get();
comImageGet.write(#filepath);

binData = new BinData();
binData.loadFile(#filepath);
con = binData.getData();
т.е. через сохранение на диск во временную папку
Старый 01.08.2017, 07:50   #3  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
Цитата:
Сообщение от smailik Посмотреть сообщение
Может у кого-нибудь все-таки получилось из resultSet достать картинку?
загружаю картинку из внешней базы

X++:
container sqlFileData()
{
    container   ret;
    System.Data.SqlClient.SqlConnection     sqlConnection;
    System.Data.SqlClient.SqlDataReader     dataReader;
    System.Data.SqlClient.SqlCommand        command;
    Object k;
    System.Byte[] byteArray;
    str     string ;
    str  comandText;

    str connectionString = "---------";

    CodeAccessPermission permission = new InteropPermission(InteropKind::ClrInterop);

    ;
    try
    {
        permission.assert();
        sqlConnection = new System.Data.SqlClient.SqlConnection();
        sqlConnection.set_ConnectionString(connectionString);
        command = sqlConnection.CreateCommand();
        comandText = strFmt("select TOP 1 Picture from  AA_InventItemPicture where RecId = %1", this.RecId);
        command.set_CommandText(comandText);
        sqlConnection.Open();
        dataReader = command.ExecuteReader();

        if (dataReader.Read())
        {
            string = CLRInterop::staticInvoke("System.Convert", "ToBase64String", dataReader.GetValue(0));
            ret = ContainerClass::blob2Container(binData::loadFromBase64(string));
        }
        dataReader.Close();

        sqlConnection.Close();

        CodeAccessPermission::revertAssert();
    }
    catch(Exception::CLRError)
    {
        info(CLRInterop::getLastException().ToString());

    }
    return ret;
}
__________________
С уважением, Вячеслав.
За это сообщение автора поблагодарили: smailik (1), arhat (1).
Старый 02.08.2017, 11:31   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от smailik Посмотреть сообщение
Еще был вариант слинковать сервера и написать что-то вроде
X++:
update t1 set t1.Image=t2.Image
from TableWithImage t1 join [SQLAx4].Ax4.dbo.TableWithImage  t2
но мне сказали что при выполнении подобных запросов на линкованных серверах сначала требуемая таблица полностью скачается на сервер, а лишь потом из неё сделается выборка.
Зависит от того, есть ли ограничение в директиве Where по удаленной таблице. Если where ограничивает выборку в базе Ax2012, то да, сначала скачает все из Ax4.0, потом начнет искать нужное. Соответственно, надо сконструировать запрос так, чтобы ограничение where касалось удаленной таблицы или продублировать условие связи. Ну, как-то так

X++:
update t1 set t1.Image=t2.Image
from TableWithImage t1 
join [SQLAx4].Ax4.dbo.TableWithImage  t2 on t1.ItemId = t2.ItemId
where t1.ItemId = XXX
    and t2.ItemId = XXX

//или так

update t1 
set t1.Image=(select top 1 t2.image from [SQLAx4].Ax4.dbo.TableWithImage  t2 where t2.ItemId = XXX)
from TableWithImage t1
where t1.ItemId = XXX
Собственно, можно же не одну команду UPDATE-SQL передать, а набор команд, если поиск нужной записи в Ax4.0 не так прост. Или сделать хранимку в базе Ax4.0, чтобы она возвращала только одну картинку по переданному параметру

В общем случае, прокачка данных через Axapta - не очень хорошая практика. Имеет смысл только в безвыходной ситуации, когда прямое копирование из базы в базу по каким-либо причинам невозможна. Чем меньше посредников - тем лучше.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: smailik (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вывод картинки, хранящейся в БД, с помощью display-метода в грид Vasiliusis DAX: Программирование 5 09.09.2016 12:04
Установка текущего SID-а в БД sukhanchik DAX: Администрирование 0 16.09.2009 07:58
Подключение АОС к новой БД AxaptaUser DAX: Администрирование 4 07.04.2008 16:09
Владельцы таблиц в БД аксапты AxaptaUser DAX: Администрирование 11 23.05.2007 18:33
Создание точной копии БД для анализа ошибок Maxim Gorbunov DAX: База знаний и проекты 1 18.12.2001 15:24

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:52.