导航

Castle ActiveRecord 访问 Oracle 的几个应注意之处

Posted on 2006-07-31 15:27  InterMa  阅读(1528)  评论(2编辑  收藏  举报
以前都是拿AR访问Sql Server的, 工作的一直很好. 最近数据库换成Oracle 8i了, 使用AR访问时遇到了几个小问题, 现把问题描述和解决方案提供出来, 希望给遇到同样问题的朋友一些帮助.

[1] Primary Key映射属性:
要设为Sequence或者Native, 而不是Identity, 这个提醒一下大家.
例如: (表中的Id类型为Number)
    [PrimaryKey(PrimaryKeyType.Sequence, "id")]
    
public int Id
    {
        
get { return this.id; }
        
set { this.id = value; }
    }

[2] varchar2类型的映射:
把string类型映射到表中的varchar2类型的时候, 映射的时候要在映射属性中标明映射到AnsiString, 否则一旦涉及到更新操作就会报告这个异常: "ORA-12704: 字符集不匹配".
例如:(表中的Name类型为varchar2)
    [Property("xm", ColumnType = "AnsiString")]
    
public string Name
    {
        
get { return this.name; }
        
set { this.name = value; }
    }

[3] 执行HQL语句报告"ORA-12704: 字符集不匹配"异常:
尽管在[2]步中已经设置映射到AnsiString, 但是在执行HQL查询(SimpleQuery)的时候还是会报告这个异常.
后来发现只要采用传参形式的SimpleQuery就会出现这个异常, 而采用字面字符串的形式就没有任何问题, 因此解决的方法就是就是改用丑陋的字符串连接方式,
例如:(注释掉的那一行执行的时候就会报告异常)
    public static TUser FindByName(string _name)
    {
        SimpleQuery query 
= new SimpleQuery(typeof(TUser), @"from TUser user where user.Name = '" + _name + "'");
        
// SimpleQuery query = new SimpleQuery(typeof(TUser), @"from TUser user where user.Name = ?", _name);
        return ((TUser[])(ExecuteQuery(query)))[0];
    }


最后:
由于我做的只是一个小的系统, 肯定还有其它一些问题我没发现, 暂时就发现这么多.
同时我一直在怀疑是不是我的Oracle 8i字符集没设好? 或者有什么其它的原因? (本人系Oracle菜菜...) 还恳请大家指点~~