c# - 如何使用 Oracle 的托管 ODP.Net 处理 bool 值

标签 c# odp.net

我有一个遗留应用程序,到目前为止,它与 Microsoft 已弃用的 System.Data.OracleClient 驱动程序配合得很好。 C# bool 值在其 Oracle 数据库中通常表示为 Number(5,0)。多年来,这一直运作得相当平静。

我们现在正在尝试迁移到 Oracle 的托管 ODP.Net 替代品,事实证明 bool 值特别麻烦。用 Oracle ODP.Net nuget 包替换 Microsoft 驱动程序后,我发现使用 sql 进行写入操作,例如“insert.. where mybooleancolumn = true”(或参数化等效项)会引发“未定义数据类型”异常,并从当将值分配给 C# bool 值时,数据库(“Select mybooleancolumn from ....”)会给出各种错误。

其他人如何克服这个问题?是否需要完成一些额外的映射?

最佳答案

在我连接的 Oracle 数据库(使用 Oracle 的托管 ODP.NET)中, bool 值用 NUMBER(1, 0) 表示。

这是我的 web.config 中正确的映射代码,允许此映射正常工作:

<oracle.manageddataaccess.client>
    <version number="*">
      <edmMappings>
        <edmNumberMapping>
          <add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number" />
          <add NETType="byte" MinPrecision="2" MaxPrecision="2" DBType="Number" />
          <add NETType="int16" MinPrecision="3" MaxPrecision="4" DBType="Number" />
          <add NETType="int32" MinPrecision="5" MaxPrecision="9" DBType="Number" />
          <add NETType="int64" MinPrecision="10" MaxPrecision="19" DBType="Number" />
        </edmNumberMapping>
      </edmMappings>

      <settings>
       <setting name="TNS_ADMIN" value="PATH TO TNS_ADMIN" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>

重要的是:

<add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number" />

如果您定义了这样的映射,它应该可以工作。

编辑:不要忘记刷新您的 edmx 模型(只需更新它而不进行任何更改)并重建应用程序以确保它使用新映射进行更新。

关于c# - 如何使用 Oracle 的托管 ODP.Net 处理 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47515101/

相关文章:

.net - 在 .Net 中从 Oracle 获取 clob 字段的性能不佳

c# - 有没有办法在 C# 中限制 API 的处理器资源?

c# - 使用 $Rev :$ SVN keyword in C# code?

c# - 无法从文本框将零转换为int32

c# - 中等信任下的 ODP.net 访问违规

oracle - EF + ODP.NET + CLOB = 值不能为空 - 参数名称 : byteArray?

c# - C# 中的多数据库支持

c# - C# 中的 'out' 修饰符

c# - 没有记录 - 抛出异常的地方

c# - 如何连接到远程 Oracle 数据库