Показать сообщение отдельно
Старый 13.06.2013, 08:28   #2  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 22.11.2007
Решение вопросов.
1. Записывать в базу контейнера как аксапта это делает (получается такой же Image)
X++:
conClass = new ContainerClass(con);
binData = new BinData();
binData.setData(conClass.toBlob());
string = binData.base64Encode();
clrObject = System.Convert::FromBase64String(string);
//clrObject отправляем в System.Data.SqlClient.SqlParameter.Value
На выходе получаем byte[], который пригоден для записи в базу.
2. Выяснилось что SQL генерирует разные уровни оповещений, и не все являются ошибками, которые перехватывает метод CLRInterop::getLastException().
Также хочу заметить что аксапта не может использовать нетовские handler(обработчик событий. Поэтому
Решение - написание библиотеки, которая в себе содержит функции обработки событий и возвращает готовые исключения типа SqlException или Exception, либо это info от sql типа SqlInfoMessageEventArgs
X++:
public class SysSqlCommand
    {
        SqlCommand      sqlComm;
        SqlException    sqlEx;
        Exception ex;

        public SysSqlCommand(SqlCommand _sqlComm)
        {
            this.sqlComm = _sqlComm;
        }
        public void ExecuteNonQuery()
        {
            try
            {
                sqlComm.ExecuteNonQuery();
            }
            catch (SqlException _ex)
            {
                sqlEx = _ex;
                throw;
            }
            catch (Exception _ex)
            {
                ex = _ex;
                throw;
            }
        }
        public SqlException sqlException()
        {
            return sqlEx;
        }
        public Exception exception()
        {
            return ex;
        }
    }
Вот как то так.