《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. JavaScript 中的数据类型

    Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...

  2. Ajax 概念 分析 举例

    Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...

  3. ExtJS 4.2 第一个程序

    本篇介绍如何创建一个ExtJS应用程序.并通过创建目录.导入文件.编写代码及分析代码等步骤来解释第一个ExtJS程序. 目录 1. 创建程序 1.1 创建目录建议 1.2 实际目录 1.3 index ...

  4. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  5. [.NET] C# 知识回顾 - 事件入门

    C# 知识回顾 - 事件入门 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通过<C# 知识回顾 - 委托 de ...

  6. C# await和async

    基础阅读:http://www.cnblogs.com/jesse2013/p/async-and-await.html 答疑阅读:http://www.cnblogs.com/heyuquan/ar ...

  7. 【云知道】究极秒杀Loadrunner乱码

    Loadrunner乱码一击必杀 之前有介绍一些简单的针对Loadrunner脚本或者调试输出内容中乱码的一些设置,但是并没能完全解决一些小伙伴的问题,因为那些设置实在能力有限,还是有很多做不到的事情 ...

  8. Loadrunner Http Json接口压力测试

    前天接到了一个测试任务,要求测试一下ES(elsticsearch)在不同并发下的查询效率.如图: 业务场景是在客户端根据具体车牌查询相关车辆信息,结果返回前10条记录. 从图中可以看到,接口的请求参 ...

  9. BAT“搅局”B2B市场,CIO们准备好了吗?

    "CIO必须灵活构建其所在企业的IT系统,深入业务,以应对日新月异的数字化业务环境."   BAT军团"搅局"B2B市场,CIO们准备好了吗? 庞大的企业级市场 ...

  10. Java—恶心的java.lang.NumberFormatException解决

    项目中要把十六进制字符串转化为十进制, 用到了到了Integer.parseInt(str1.trim(), 16):这个是不是后抛出java.lang.NumberFormatException异常 ...