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 

  • 相关阅读:
    程序员创业第二步:五个角度打造企业世界级竞争力
    开源题材征集 + MVC&EF Core 完整教程小结
    MVC+EF Core 完整教程20--tag helper详解
    MVC5+EF6 入门完整教程13 -- 动态生成多级菜单
    加载驱动三种的方法
    Caused by: javax.el.PropertyNotFoundException: Property [userName] not found on type [java.lang.String]
    Eclipse 中的 insert spaces for tabs 设置方法
    Windows中mysql的配置文件,解决字符集编码问题,统一使用utf8字符集
    ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated ......问题报错解决办法!
    Java中的类三种类加载器+双气委派模型
  • 原文地址:https://www.cnblogs.com/surfsky/p/438783.html
Copyright © 2011-2022 走看看