如何使用 Oracle 的托管 ODP.Net 处理布尔值



我有一个旧应用程序,到目前为止,它与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();

相关内容

  • 没有找到相关文章

最新更新