Сохранение объекта C # как BLOB-объекта в Oracle - PullRequest
1 голос
/ 06 ноября 2019

У меня есть публичный класс, который мне нужно сохранить как BLOB-объект в Oracle. Я построил DataLayer для работы с Oracle или MySQL, поэтому DBType - это стандартный метод добавления параметров. Теперь проблема в том, что, поскольку слой данных был написан как независимый, я использую DBType при создании параметров. Однако, когда вы создаете параметр blob в oracle, обычно люди используют OracleDBType. DBType.blob не существует. Я попытался использовать DBType.object, но это дало мне ошибку.

            IDbCommand command = ProviderManager.factory.CreateCommand();
            command.CommandText = commandText;
            command.Connection = connection;
            command.CommandType = commandType;

            DbParameter dbParam = ProviderManager.factory.CreateParameter();
            dbParam.ParameterName = "Summary";
            dbParam.Value = batchSummary;
            dbParam.Direction = parameterDirection;
            dbParam.DbType = DbType.Object;

            command.Parameters.Add(dbParam);
            command.ExecuteNonQuery();

Я получил эту ошибку:

Oracle.ManagedDataAccess.Client.OracleException: 'Неподдерживаемый столбецтип данных '

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Заменить

dbParam.DbType = DbType.Object; 

на

dbParam.DbType = DbType.Binary;
0 голосов
/ 06 ноября 2019

С моей точки зрения, есть два пути для вас.

Первый описан здесь , и это глобальный способ сделать это. Создайте конвертер и используйте его там, где вы хотите.

Вторым будет переопределение функции ConvertTo() в BatchSummary, поскольку ваш объект не поддерживает (пока, пока вы не реализуете) преобразование,и именно поэтому вы получаете NotSupportedException.

Большинство собственных типов данных (Int32, String, перечислимые типы и другие) имеют преобразователи типов по умолчанию, которые обеспечивают преобразования строк в значения и выполняют проверки правильности. Преобразователи типов по умолчанию находятся в пространстве имен System.ComponentModel и называются TypeConverterNameConverter. Вы можете расширить конвертер типов, если функциональность по умолчанию не подходит для ваших целей, или реализовать собственный конвертер типов, когда вы определяете нестандартный тип, у которого нет связанного конвертера типов.

Вы можете проверить microsoft docs о том, как создать конвертер для неизвестных значений.

По сути, вам нужно сделать следующее:

   // Overrides the ConvertTo method of TypeConverter.
   public override object ConvertTo(object value, Type destinationType) {  
      if (destinationType == typeof(byte[])) {
         // Do whatever transformation you want here
         return transformedObject;
      }
      return base.ConvertTo(value, destinationType);
   }

ПосколькуТип объекта известен, вы можете делать с ним все что угодно. Вам также может понадобиться создать ConvertFrom, чтобы вернуть объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...