C#类和Oracle映射参数

时间:2011-01-25 14:00:02

标签: c# oracle types class-attributes

我在Oracle数据库中声明了一个类型:

CREATE OR REPLACE TYPE t_project_code_changes AS TABLE OF obj_project_code_change; 

我在C#中映射到这种类型,如此

[OracleCustomTypeMapping("DEV_SCHEMA.OBJ_PROJECT_CODE_CHANGE")]
class ProjectCodeChangeFactory : TypeFactoryTemplate<ProjectCodeChangeDTO>
{
    //code
}

上面的代码可以正常运行,但是如果我从属性中删除模式名称“DEV_SCHEMA”,它就会失败:

[OracleCustomTypeMapping("OBJ_PROJECT_CODE_CHANGE")]

生成以下错误:

  

未处理的例外情况:   System.InvalidOperationException:   'ProjectCodeChangeDTO'的自定义类型映射   未指定或有效   at Oracle.DataAccess.Types.OracleUdt.GetUdtName(String   customTypeName,String dataSource)

在某些时候我会想要将代码发送到'DEV_SCHEMA',但这会导致代码失败。

架构名称来自连接字符串User Id

"Data Source=DBNAME;User id=DEV_SCHEMA;Password=pwd;Pooling=False;" 

我有什么办法可以帮助我解决这个问题。即,某种方式:

  1. 将架构名称作为属性参数
  2. 传递
  3. 以我不需要使用架构的方式在Oracle中定义类型
  4. 作为更多信息,当我使用ODP.NET客户端版本11.1.0.7时,这个问题就出现了。 DLL的11.2版本完美地工作,没有属性中的模式名称。

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

如果您不需要坚持OracleCustomTypeMapping属性方法, 我认为最好的解决方案是通过配置文件设置自定义类型映射。

答案 1 :(得分:2)

我过去使用以下方法处理过这个问题:

internal static class OracleConfig
{
#if SHIPPING
    internal const string SCHEMA = @"REL.";
#else
    internal const string SCHEMA = @"DEV.";
#endif
}

然后你可以像这样使用它:

[OracleCustomTypeMapping(OracleConfig.SCHEMA + "OBJ_PROJECT_CODE_CHANGE")]