zoukankan      html  css  js  c++  java
  • Gentle.NET bugs fixing

    Gentle.net bugs fixing


    以下是自己遇到及网上收集的gentle bug及注意点合集及解决方案,借鉴之处请务怪罪:p
    Gentle.net还是有不少bug的,基本上都是Provider的细节问题,好在有源代码,自己改改就好


    ------------------------------------------------------------------
    [Common]
    ------------------------------------------------------------------
    表名和字段名最好不一样,否则自动生成的代码中属性名和类名会冲突
    Broker.Retrieve函数若找不到值,为什么不返回null,而要抛出异常?这不太符合使用习惯


    ------------------------------------------------------------------
    [代码生成器]
    ------------------------------------------------------------------
    mygernation gentle.net脚本无法生成oracle数据表操作代码,不知道codesmith行不行,没试过
    修改mygeneration代码。
        ·添加[Serializable()]特性
        ·添加静态删除函数,如:
            public static void Remove(int id)
            {
                Key key = new Key(typeof(Product), true, "id", id);
                Broker.Remove(typeof(Product), key);
            }
        ·添加PrePersist()和PreRemove()虚函数(类似iBatisNet),非常实用
            public override void Persist()
            {
                if (IsChanged || !IsPersisted)
                {
                    PrePersist();      // Add here
                    base.Persist();
                    isChanged = false;
                }
            }
            public override void Remove()
            {
                PreRemove();           // Add here
                base.Remove();
            }
            protected virtual void PrePersist()
            {
            }
            protected virtual void PreRemove()
            {
            }
               
       
    ------------------------------------------------------------------
    [Access]
    ------------------------------------------------------------------
    access数据表不允许取名为action, catalog,否则会报错“FROM 子句语法错误”,无论你是否调用了该表(古怪吧~)。估计是JetFactory.cs中的关键字不足
    access时间字段查询有问题


    ------------------------------------------------------------------
    [SqlServer]
    ------------------------------------------------------------------
    NET数据类型和数据库数据类型转化:string应该转为NVarchar而不是源代码中的Varchar(在文件SQLServerFactory.cs中):
        public override long GetDbType( Type type)
        {
            ...
           switch(...)
            {
               ...
               else if( type.Equals( typeof(string) ) )
                  result = SqlDbType.NvarChar;
               else if ...
               ...
            }
        }


    ------------------------------------------------------------------
    [Oracle]
    ------------------------------------------------------------------
    NET数据类型和数据库数据类型转化:string应该转为NVarchar而不是源代码中的Varchar(在文件OracleFactory.cs中):
        public override long GetDbType( Type type)
        {
            ...
           switch(...)
            {
               ...
               else if( type.Equals( typeof(string) ) )
                  result = OracleType.NvarChar;
               else if ...
               ...
            }
        }
       
    Oracle的Provider是不支持空字符串的(注:oracle就是如此,将''认为是null,会引发异常)。
        若希望支持空字符串,需要更改以下函数(Client\SqlStatement.cs)
        private void SetParameter( IDataParameter param, object val, FieldMap fm )
        {
            Check.Verify(
                param.Direction == ParameterDirection.Input ||
                param.Direction == ParameterDirection.InputOutput,
                "Cannot set value of output parameters!" );
            // do additional checking for known types
            if( map != null && fm != null )
            {
                param.Value = GetParameterValue( val, map, fm );
               
                // 下面这几行语句添加自 Gu Zhigang
                // 解决问题:因为oracle代理驱动的原因 ,字符型数据不能插入空字符串
                //if (this.Command.Connection.GetType().Name.IndexOf("Oracle",0)>=0)
                {
                    if(param.DbType == DbType.AnsiString && param.Value.ToString()=="")
                        param.Value = DBNull.Value;
                }
            }
            else // unknown type - no clipping or fancy checks, just do it
            {
                param.Value = val != null ? val : DBNull.Value;
            }
        }
        虽然不是真正的解决问题,但是能用就好了,要注意的就是程序中要注意这个变化.

    在OracleAnalyzer.cs中,会去数据库那里分析原有表中的每个字段、字段类型、字段长度。但分析CLOB时,将其长度定为了4000,这就不好了,长的数据会被它截断。所以,改了一下:
        fm.SetDbType( sr.GetString( i, "Type" ), false );
        fm.SetIsNullable( GetBoolean( sr.GetString( i, "IsNullable" ) ) );
        if( sr.GetString( i,"Type") == "CLOB")
        {
            fm.SetSize(0);
        }
        else if( sr[ i, "Size" ] != null )
        {
            fm.SetSize( sr.GetInt( i, "Size" ) );
        }

    转载请注明出处:http://surfsky.cnblogs.com 

  • 相关阅读:
    HTML5语音合成Speech Synthesis API简介
    数据库两大神器【索引和锁】
    进程、进程组、作业、会话
    linux的会话、进程、进程组等概念
    linux命令eval的用法
    配置mutt
    Shell 实现多任务并发
    利用linux mutt 发送邮件(在Shell脚本中使用比较方便)
    Linux-Shell-使用mkfifo实现多任务并发及并发数控制
    js逆向笔记
  • 原文地址:https://www.cnblogs.com/surfsky/p/438783.html
Copyright © 2011-2022 走看看