31.07.2017, 19:12 | #1 |
Участник
|
Чтение картинки из БД
Всем доброго дня. Прошу совета вот в каком вопросе. У меня есть две аксаптовских БД (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(); Еще пробую вот так 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 |
Участник
|
Забирал изображение из 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 |
сибиряк
|
загружаю картинку из внешней базы
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 |
Участник
|
Цитата:
Сообщение от smailik
Еще был вариант слинковать сервера и написать что-то вроде
X++: update t1 set t1.Image=t2.Image from TableWithImage t1 join [SQLAx4].Ax4.dbo.TableWithImage t2 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 В общем случае, прокачка данных через Axapta - не очень хорошая практика. Имеет смысл только в безвыходной ситуации, когда прямое копирование из базы в базу по каким-либо причинам невозможна. Чем меньше посредников - тем лучше.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: smailik (1). |