《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. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

  2. Npm包的开发

    个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │   ...

  3. js中参数不对应问题

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...

  4. 解决cookie跨域访问

    一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入c ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统 (源码购买说明)

    系列目录 升级日志 !!!重大版本更新:于2016-12-20日完成了系统的结构重构并合并简化了T4(这是一次重要的更新,不需要修改现有功能的代码),代码总行数比上个版本又少了1/3.更新了代码生成器 ...

  6. golang语言构造函数

    1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  7. Redis简单案例(二) 网站最近的访问用户

    我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我们可以先简单了解一下在oracle.sqlserve ...

  8. [原创]关于Hibernate中的级联操作以及懒加载

    Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...

  9. EC笔记:第4部分:20、传递引用代替传值

    考虑以下场景: #include <iostream> #include <string> using namespace std; struct Person { strin ...

  10. 装饰者模式 Decoration

    1.什么是装饰者模式 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活.当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列 ...