zoukankan      html  css  js  c++  java
  • 《PDF.NE数据框架常见问题及解决方案-初》

                                                            《PDF.NE数据框架常见问题及解决方案-初》

    1、新增数据库后,获取标识列的值:

       解决方案:    PDF.NET数据框架,已经为我们考略了很多,因为用PDF.NET进行数据的添加操作时,一般我们会传递Model实体进去,
                 在进行数据库的新增操作时,执行成功后,新增记录的标示又会赋值给传递的实体,例如:

                 ///<summary>
                 ///添加一体记录
                 /// <param name="model">实体</param>
                 ///<summary>
                 public boll Add(BSCms.Model.article model){
                                                       
                     return EntityQuery<BSCms.Model.bs_article>.Instance.Insert(model) > 0;
                     //这时候,执行成功后,可以直接从model.id中取出属性的值。
                
                 }

    2、OQL语句,多条件组合查询:
         2.1>OQLCondition对象:
            例如:BSCms.Model.article model=new BSCms.Model.article();
                  OQL q=new OQL(model);
                  //这里我们可以添加自己的条件
                  if(channel_id>0){

                     q.Condition.AND(model.channel_id,"=",channel_id);

                   }
                  q.select().where(q.Condition);
         2.2>OQLComparer对象:
             PDF.NET数据框架对OQLComparer的操作符,进行了重写,如:+,|,&
             OQL q=new OQL(model);
             OQComparer comparer=new OQLComparer(q);//这一步,生成的条件表达式为">",因此直接使用,就会出现语法错误的现象。
             comparer=comparer.Compare(model.channel_id,"=",channel_id);//这一步生成的条件表达式为:"channel_id=@P0"
             comparer=comparer&comparer.Compare(model.category_id,"=",6);//这一步生成的条件表达式为:"category_id=@P1"
             OQLComparer对象可以组合成非常复杂的查询条件。
       
    3、根据多个字段进行排序:
        OQL1中OrderBy方法有多个重载,其中有一项是可以传递字符串数组的,那么我们就可以这样来写排序了,如:
        OQL q=new OQL(modle);
        q.Select().Where(q.Condition).OrderBy(new string[2]{"sort asc","add_time desc"});

    4、添加较长内容时,数据保存成功后,发现不完整:
            PDF.NET在定义实体的时候,可以指定每个属性的数据大小,StringFieldSize属性就是用来定义属性对应数据库字段的大小,如果使用的时候,没有定义此项,那么
        PDF.NET框架自身给字段默认了大小,最大长度是255,因此,添加内容的时候,如果长度超过了255个字符,那么超出的部分就会被忽略,导致内容不完整。StringFieldSize
    属性是泛型Directiry<string,int>类型,在给属性设置打下时,需要注意格式,这个数据字典的key就是TableName_字段名组合起来的,value就是数据长度了。于是我们可以这样写
    StringFieldSize[string.Format("{0}-{1}","article","title")]=100;//指定表article中title字段大小为100。


    5、使用OQL,进行多表联合查询时,如果两个表中的字段名一样,出现,字段XXX不明确的错误:
        例如,我按照前面介绍的方法,编写多表查询条件时,会出现此错误。
        代码:BSCms.Model.article article=new  BSCms.Model.article();
              BSCms.Model.category category=new BSCms.Model.category();
              OQL q=new OQL(article);
              if(channel_id>0)
               {
                  q.Conditon.AND(article.channel_id,"=",channel_id);  
               }
                  q.InnerJoin(category).On(article.category_id,category_id).select(article.id
                                                                                   article.title,
                                                                                   article.channel_id//channel_id在article表和category表中同时存在,且名称相同。  
                                                                                   ).Where(q.Condition);
           编写到此,我们来看看q生成的具体sql代码是什么,结果是:SELECT M.id,M.title,channel_id FROM article M INNER JOIN category ......这样,问题就一目了然了。
    字段channel_id不明确,为什么在channel_id的前面没有追加别名M呢?在详细阅读了深蓝医生的博客后,才豁然开朗,不过,深蓝医生的博客,写的颇有技术含量,需要我们耐心
    的阅读,和认真的思考分析,这样问题最终都会迎刃而解的。过多的我就不说什么了,那怎样解决此类问题呢?办法其实很简单,这里我们用OQComparer对象来组合条件,
    我们只需要把OQL的Select方法和Where方法拆开写,而且OQLComparer中使用重名的字段做条件时,一定要写在OQL对象的Select()方法之后,原因很简单,感兴趣的朋友
    可以下载官方的源码,一看便了然。下面我们就举一个简单的例子吧!
    例如:
              BSCms.Model.article article=new  BSCms.Model.article();
              BSCms.Model.category category=new BSCms.Model.category();
              OQL q=new OQL(article);
              q.InnerJoin(category).On(article.category_id,category_id).select(article.id
                                                                                   article.title,
                                                                                   article.channel_id//channel_id在article表和category表中同时存在,且名称相同。  
                                                                                   );
               OQLComparer comparer=new OQLComparer(q);
               if(channel_id>0)
               {
                 comparer=comparer.Compare(article.channel_id,"=",channel_id);  
               }
              //这样就可以了。另外再延伸一个问题,就是如果我们声明OQLComparer对象,在没有调用实例方法Compare时,comparer的条件始终是“>”,这样很容易导致系统
              出现语法错误。所以说,在使用OQLComparer做条件时,一定要注意,几个条件:1、实例化OQLComparer对象时,一定要有与之关联的OQL对象。
              2、用new实例化OQLComparer对象后,不可直接使用,否则会出现Where附近有语法错误。也就是说,在使用OQComparer对象作条件时,必须用对象的Comparer方法进行
             初始化。
      6、实现稍复杂些的条件,如 where channel_id=1 and category_id=6 and(flag like '%XXX%' or flag like '%XXX%'):
        我们来看看,这是如何实现的。其实方法很简单,例如:
            /// <summary>
            /// 根据频道号、栏目编号、标示,获取几条记录
            /// </summary>
            /// <param name="top">top</param>
            /// <param name="channel_id">频道编号</param>
            /// <param name="category_id">栏目编号,多个之间,用英文,分隔</param>
            /// <param name="flag">标示</param>
            /// <returns></returns>
            public List<BSCms.Model.View.article> get_article_list(int top,
                                                                   int channel_id,
                                                                   string category_id,
                                                                   string flag)
            {

                List<BSCms.Model.View.article> list = new List<Model.View.article>();
                //实体
                BSCms.Model.bs_article article = new Model.bs_article();
                BSCms.Model.bs_article_cateogry category = new Model.bs_article_cateogry();
                //条件
                OQL q = new OQL(article);
                OQL1 q1 = q.InnerJoin(category).On(article.category_id, category.id).Select(article.title,
                                                                                  article.add_time,
                                                                                  article.category_id,
                                                                                  article.id,
                                                                                  article.call_name,
                                                                                  article.show_image,
                                                                                  article.user_name);
                OQLCompare comparer = new OQLCompare(q);
                comparer = comparer.Comparer(article.id, ">", 0);
                //根据频道
                if (channel_id > 0)
                {
                    comparer = comparer & comparer.Comparer(article.channel_id, OQLCompare.CompareType.Equal, channel_id);
                }
                //根据栏目编号
                if (!string.IsNullOrEmpty(category_id))
                {
                    comparer = comparer & comparer.Comparer(article.category_id, OQLCompare.CompareType.IN, BSCms.Core.Util.Util.SplitInt(category_id));
                }
                //根据标示
                if (!string.IsNullOrEmpty(flag))
                {
                    OQLCompare cmp = new OQLCompare(q);
                    string[] flags = BSCms.Core.Util.Util.Split(flag, ',');
                    cmp = cmp.Comparer(article.flag, "like", "%" + flags[0] + "%");
                    for (int i = 1; i < flags.Length; i++)
                    {
                        cmp = cmp | cmp.Comparer(article.flag, OQLCompare.CompareType.Like, "%" + flags[i] + "%");
                    }
                    comparer = comparer & cmp;
                }
                if (top > 0)
                {
                    q.TopCount = top;
                }
                //追加条件
                q1.Where(comparer).OrderBy(article.add_time);
                //获取列表
                list = get_article_list(q);

                return list;
            }       
             _________________________________________________________________________________________________________________________________________
                                                       本文章出自郑州北鲨计算机科技有限公司,转载请注明出处,谢谢合作,如有问题,请咨询QQ:1058736170
  • 相关阅读:
    Android Bitmap 载入与像素操作
    java poi读取excel公式,返回计算值(转)
    模块化Java简介
    java模式
    java—三大框架详解,其发展过程及掌握的Java技术慨括
    java设计模式、框架、架构、平台之间的关系
    POI 怎么设置Excel整列的CellStyle啊
    POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写
    POI对EXCEL的操作【重点:如何设置CELL格式为文本格式】
    ActiveX插件的Z-Index属性无效问题解决
  • 原文地址:https://www.cnblogs.com/ibeisha/p/pdfnet.html
Copyright © 2011-2022 走看看