我有一个遗留应用程序,到目前为止,它与 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/