《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
《PDF.NE数据框架常见问题及解决方案-初》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- 【.net 深呼吸】限制执行代码的权限
前面好几篇文章,老周都跟大伙伴们聊了跟应用程序域有关的话题,干脆咱们一聊到底吧,做学问就应该这样,有恒心. App Domain的创建新应用程序域的方法中,有一个特殊的重载: public stati ...
- 【WCF】使用“用户名/密码”验证的合理方法
我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...
- nginx+php的使用
原文来自:windows下配置nginx+php环境 按照他的步骤走,亲测可用! 但是这里他后面说的根目录可能有些人有点懵. 其实在设置的时候就设置了: 网站根目录就是www这个目录,如果没创建请自行 ...
- 获取Canvas当前坐标系矩阵
前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(75)-微信公众平台开发-用户管理
系列目录 前言 本节主要是关注者(即用户)和用户组的管理,微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号也提供了相应的接口 ...
- JavaScript基础知识总结(二)
JavaScript语法 二.数据类型 程序把这些量.值分为几大类,每一类分别叫什么名称,有什么特点,就叫数据类型. 1.字符串(string) 字符串由零个或多个字符构成,字符包括字母,数字,标点符 ...
- 来自于微信小程序的一封简讯
9月21晚间,微信向部分公众号发出公众平台-微信应用号(小程序)的内测邀请,向来较为低调的微信在这一晚没人再忽视它了. 来自个人博客:Damonare的个人博客 一夜之间火了的微信应用号你真的知道吗? ...
- BPM SharePoint解决方案分享
一.需求分析 SharePoint作为微软推出的协同类平台产品,为客户提供了门户.内容.文档.流程.社区.搜索.BI等一系列的解决方案,然而其流程功能由于设计理念差异,不能完全满足客户的需求,主要原因 ...
- Web开发安全之文件上传安全
很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...
- Java—恶心的java.lang.NumberFormatException解决
项目中要把十六进制字符串转化为十进制, 用到了到了Integer.parseInt(str1.trim(), 16):这个是不是后抛出java.lang.NumberFormatException异常 ...