《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

时间: 2024-10-25 00:14:18

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

《I&#039;m a Mac:雄狮训练手册》——2.4 快速用户切换

2.4 快速用户切换 I'm a Mac:雄狮训练手册 传统的用户切换需要登出系统重新登录,这样一方面耗时较长,另一方面一次只能登录一个用户,再者会关闭原用户已打开的程序和窗口. 而快速切换则用于不登出系统就切换到另外一个用户,使得多账户同时运行.切换到另一个用户时,前一用户的所有已打开程序和窗口都将暂停并保持原装,不受干扰.当再次切回时,所有一切都像原来一样,所不同的只是时间变了. 2.4.1 在菜单栏上显示快速用户切换菜单 打开"系统偏好设置",点击"用户与群组→解锁→登

《I&#039;m a Mac:雄狮训练手册》——2.3 账户类型

2.3 账户类型 I'm a Mac:雄狮训练手册 用户的社会属性并不决定它的计算机角色,虽然这个世界上有成千上万的Mac用户,形形色色,但是Mac认不过来,它才不管你是美国总统还是平头百姓.用户是指人,账户是指OS分配给用户的系统角色. Mac下的账户类型有五种:超级用户(Super User),管理员,普通用户,客人用户和仅限共享. 2.3.1 超级用户 超级用户也叫root用户,享有对计算机的绝对控制权限,可以任意删除和移动任何文件,所以Mac默认不启用.因为权力太大.当一个人的权力大到无

《I&#039;m a Mac:雄狮训练手册》——2.2 用户账户

2.2 用户账户 I'm a Mac:雄狮训练手册 用户和账户是两个概念,用户是指人,账户是指赋予用户的系统身份,也就是登录凭证,Mac ID.一个用户要登录系统首先要有一个账户,以下为方便说明,假设二者一致. Mac下所有账户和登录都是通过"用户与群组"偏好设置来进行设置.所以要对登录和账户进行设置,首先要打开"用户与群组"偏好设置. 2.2.1 "用户与群组"偏好设置 打开"用户与群组"偏好设置,有五种方式. (1)打开&

《I&#039;m a Mac:雄狮训练手册》——序章 0.1 Mac

序章 0.1 Mac I'm a Mac:雄狮训练手册 苹果电脑共有3种类型:掌上型.膝上型和桌面型. 掌上型也叫平板电脑,膝上型也叫笔记本,桌面型也叫台式机. 0.1.1 笔记本 笔记本原来有3种:MacBook.MacBook Air和MacBook Pro,分别简称MB.MBA和MBP.Macbook是苹果的入门级电脑产品,因塑料全白外壳而得名小白,但小白的命运比较坎坷,曾经一度被拿掉,后来又上,又被拿掉,2012年苹果宣布不再生产白色塑料外壳的MacBook.因为和MBA和MBP相比,小

《I&#039;m a Mac:雄狮训练手册》——0.2 OS X

0.2 OS X I'm a Mac:雄狮训练手册 用乔布斯的话说,Mac之所以是Mac,是因为Mac OS.硬件是骨架,软件是灵魂,正是因为Mac OS才让Mac是Mac.否则,它与PC没有什么不同,只是漂亮一些,电路板整齐一些. Mac是苹果电脑,OS X是装在苹果电脑上的操作系统.以前叫做Mac OS X,Lion之后叫做OS X,去掉Mac的概念是因为苹果想淡化Mac的概念.搭载在Mac上的操作系统可以有很多,OS X是原配,最新版本是10.7,叫做Lion. Mac OS有两个版本,一

《I&#039;m a Mac:雄狮训练手册》——1.7 shift键在开机时的作用

1.7 shift键在开机时的作用 I'm a Mac:雄狮训练手册shift键在开机时的作用有三:①在开机"咚"声时按住shift键将以安全模式启动:②在屏幕闪烁时按住shift键将取消自动登录:③在白屏时按住shift键将取消系统重返和停止加载登录项. 1.7.1 以安全模式启动在开机"咚"声时按住shift直到看到灰色的Apple Logo和进度指示器表示以安全模式启动.所谓安全模式是仅加载核心进程,强制对启动卷宗进行目录检查,并停用一切与系统核心无关的应用,

《I&#039;m a Mac:雄狮训练手册》——0.6 如何快速熟悉Mac

0.6 如何快速熟悉Mac I'm a Mac:雄狮训练手册(1)要了解系统相关的设置,请看"系统偏好设置". (2)要查看程序的功能,请看菜单栏. (3)想知道程序都可以做那些设置,请看程序"偏好设置"(按command,或者点击"'程序'菜单→偏好设置"). (4)要了解电脑的信息,请查看"系统信息"("Launchpad/实用工具/系统信息"或者按住option点击"图片 19菜单→系统信息

《I&#039;m a Mac:雄狮训练手册》——1.6 查看开机信息

1.6 查看开机信息 I'm a Mac:雄狮训练手册Mac的一个设计原则就是隐藏一切与用户无关的信息,不需要你知道的不让你知道,不需要你看到的不让你看到,一切从简,所以在开机的时候你只会听见一个简单的"咚"声和看到一个简单的画面,但其实在这些简单的表面背后有很多复杂的操作.只不过用幕布遮起来不需要用户看到,因为用户关注应用,而不需要看到内核. 如果你要查看Mac的启动过程和开机信息,就可以Verbose模式启动. 开机时按command-V,将以Verbose模式,也就是详细模式启动

《I&#039;m a Mac:雄狮训练手册》——1.8 以32位模式启动

1.8 以32位模式启动 I'm a Mac:雄狮训练手册Lion是64位系统,如果你想以32位模式启动,就可以在开机"咚"声时同时按住数字键3和2以32位模式启动.Mac下的开机设置,都是一次设置,单次有效,下次开机时则正常启动,所以下次开机时系统则以默认的64位方式启动. 查看系统是32位还是64位如果你没有以32位模式启动,则默认是64位. 打开"系统信息"(按住option点击"→系统信息..."),点击"软件",就可

《I&#039;m a Mac:雄狮训练手册》——1.9 恢复磁盘助理

1.9 恢复磁盘助理 I'm a Mac:雄狮训练手册Lion内置了恢复功能,让你可以无须安装盘即可恢复Mac.在开机"咚"声时按住command-R将会直接打开Lion的恢复磁盘助理(相当于按住option,然后选择Recovery HD磁盘). 通过此Recovery HD你可以修复磁盘.重装系统.在外部驱动器上创建Lion恢复,从TimeMachine备份恢复或使用Safari浏览网页. 注:要创建外部Lion恢复,请下载Lion恢复磁盘助理应用程序.插入外部驱动器并启动Lion