《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

《PDF.NE数据框架常见问题及解决方案-初》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  2. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  3. Js 原型和原型链

    Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...

  4. bootstrap-datetimepicker 进一步跟进~~~开始时间和结束时间的样式显示

    上次简单介绍了一下:05.LoT.UI 前后台通用框架分解系列之——漂亮的时间选择器(http://www.cnblogs.com/dunitian/p/5524019.html) 这次深入再介绍一下 ...

  5. C++的内存泄漏检测【转载】

    原文地址: http://www.cnblogs.com/jily/p/6239514.html

  6. android_m2repository_rxx.zip下载地址以及MD5

    地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E646 ...

  7. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  8. 转: 如何高效利用GitHub

    注:写了很多使用哲学,有意思 from: http://www.yangzhiping.com/tech/github.html

  9. Object是什么

    Object是什么 .Net程序员们每天都在和Object在打交道如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" ...

  10. bzoj1531: [POI2005]Bank notes

    Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...