我有一个旧应用程序,到目前为止,它与Microsoft的revebated System.data.oraclecleclient驱动程序非常合作。C#布尔值通常在其Oracle数据库中表示为数字(5,0)。多年来,这一直齐声。
我们现在正试图迁移到Oracle的托管ODP.NET替代品,而布尔值则特别麻烦。在用oracle odp.net nuget软件包替换了Microsoft驱动程序之后,我发现使用SQL写下操作,例如" insert .. mybooleancolumn = true"(或参数化的等效物),抛出'Undefined DataType'例外',并从中读取Boolean Value当值分配给c#booleans时,数据库("从...."选择mybooleancolumn。
其他人如何克服这个问题?还有一些需要完成的绘制吗?
在我要连接到(使用Oracle的托管odp.net)的Oracle数据库中,布尔值用数字表示(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模型(只需没有更改而更新)并重建应用程序以确保使用新映射对其进行更新。
我这样做的方式将OracleParameter的oracledBtype设置为INT32,但将其值设置为布尔值。例如
var param = new OracleParameter("mybooleancolumn", OracleDbType.Int32);
param.Value = true;
我通过在配置中添加映射:
来使其起作用。 <oracle.manageddataaccess.client>
<version number="*">
<edmMappings>
<edmMapping dataType="number">
<add name="bool" precision="1"/>
</edmMapping>
</edmMappings>
</version>
</oracle.manageddataaccess.client>
并将OracleCommand的用途设置为true。这样的东西:
string oradb = "Data Source=ORCL;User Id=hr;Password=hr;";
OracleConnection conn = new OracleConnection(oradb);
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.UseEdmMapping = true; // # THIS IS WHAT I HAD TO SET TO TRUE #
cmd.Connection = conn;
cmd.CommandText = "select department_name from departments where department_id = 10";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
label1.Text = dr.GetString(0);
conn.Dispose();