【问题标题】:Saving a C# object as a Blob in Oracle在 Oracle 中将 C# 对象保存为 Blob
【发布时间】:2020-03-03 08:08:14
【问题描述】:

我有一个需要在 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: '不支持的列数据类型'

【问题讨论】:

  • 为什么要强迫自己序列化为 byte[]?有许多库能够以 XML、Json 和其他格式序列化任何内容(或多或少):看看JSon.Net:对于简单的场景(而不仅仅是简单的场景),它可以实现您的目标
  • 如果你真的需要它是一个字节数组 - 使用一些确定性格式,如 protobuf

标签: c# database oracle blob


【解决方案1】:

在我看来,你有两条路可以走。

第一个描述为here,它是一种全局方法。创建一个转换器并在任何你想要的地方使用它。

第二种方法是覆盖BatchSummary 中的ConvertTo() 函数,因为您的对象不支持(但在您实现它之前)转换,这就是您得到 NotSupportedException 的原因。

大多数原生数据类型(Int32、String、枚举类型等) 具有提供字符串到值转换的默认类型转换器 并执行验证检查。默认类型转换器位于 System.ComponentModel 命名空间并命名为 类型转换器名称转换器。你可以扩展一个类型转换器,当 默认功能不足以满足您的目的或实施 自定义类型转换器,当您定义一个没有 关联的类型转换器。

您可以查看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 才能取回对象。

【讨论】:

  • 谢谢,我选择了更简单的路线,并建议团队让该对象可序列化。但是,我没有遇到我更新的帖子中指出的其他问题。
【解决方案2】:

替换

dbParam.DbType = DbType.Object; 

dbParam.DbType = DbType.Binary;

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 2010-09-27
    • 2012-09-19
    • 1970-01-01
    • 2012-09-29
    • 2017-10-07
    • 2015-12-07
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多