《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. JavaWeb——Filter

    一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...

  2. 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!

    如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...

  3. 跟我一起云计算(5)——Shards

    什么是sharding Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库 (server)上,从而缓解单一数据库的性能问题.不太严格的讲,对于海量数据的数据库,如果是因为表多而 ...

  4. 由Dapper QueryMultiple 返回数据的问题得出==》Dapper QueryMultiple并不会帮我们识别多个返回值的顺序

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#dapper 今天帮群友整理Dapper基础教程的时候手脚快了点,然后遇到了一个小问题,Dapp ...

  5. javascript匹配各种括号书写是否正确

    今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...

  6. 在centos7上安装Jenkins

    在centos7上安装Jenkins 安装 添加yum repos,然后安装 sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins ...

  7. gulp 自动添加版本号

    本文介绍利用 gulp-rev 和 gulp-rev-collector 进行版本管理 npm官网介绍使用后的效果如下: "/css/style.css" => " ...

  8. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...

  9. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  10. Android Starting Window(Preview Window)

    当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前系统要做什么呢?如果 ...