将C#对象另存为Oracle中的Blob

我有一个公共类,需要将其保存为Oracle中的Blob。我构建了DataLayer使其能够与Oracle或MySQL一起使用,因此DBType是添加参数的标准方法。现在的问题是,由于数据层被编写为不可知的,因此在创建参数时我正在使用DBType。但是,当您在oracle中创建blob参数时,通常人们会使用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:'不支持的列数据类型'

chinaoct 回答:将C#对象另存为Oracle中的Blob

我的看法,您有两种选择。

第一个描述为here,这是一种全局方法。创建一个转换器,然后在任何地方使用它。

第二个方法是覆盖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才能取回对象。

,

替换

dbParam.DbType = DbType.Object; 

dbParam.DbType = DbType.Binary;
本文链接:https://www.f2er.com/3149548.html

大家都在问