PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引
一、框架的由来 快速入门
有关框架的更多信息,请看框架官方主页!本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有ORM和SQL-MAP的特性,同时还参考了后来.NET的LINQ(本框架成型于2006年,当时还未听说过LINQ)使用风格,设计了OQL查询表达式。本框架的设计思想是通用的,完全可以移植到Java 平台,现在只提供了.NET平台的实现,暂且将本框架命名为 PDF.NET |
|
从2013.10.1日起,原PDF.NET 将更名为 SODone SQL-MAP,ORM,Data Control framework原PDF.NET框架将成为一个全功能的企业开发框架,而 SOD框架将是PDF.NET开发框架下面的 “数据开发框架" PDF.NET 开源历史:
开源协议:
注:框架的支持工具指的是集成开发工具,可以连接各种数据库进行查询,生成实体类,SQL-MAP DAL和 SqlMap.config 文件。 |
二、开源捐助账号
右图为二维码捐款方式 感谢所有PDF.NET 框架的会员朋友热心的捐助,并为框架不断完善和推广作出的杰出贡献!2015新春之际,送红包给大家! |
三、快速入门:
3.1,总览
SOD框架分为3大部分:
- SQL-MAP
- ORM
- Data Control
3.2,“SqlHelper”基础
这三大部分,都是基于AdoHelper组件,它符合MS DAAB标准,所以熟悉SqlHelper的人应该很容易上手,下面举例说明:
AdoHelper helper=new SqlServer();
DataSet ds=helper.ExecuteDataSet( ”Data Source=.;Initial Catalog=LocalDB;Integrated Security=True”,
CommandType.Text,
”SELECT * FROM Table_User”);
AdoHelper是一个抽象类,所以它可以实例化成其他数据库访问类,比如继续下面的代码:
helper=new Access(); //Access数据库访问类
DataSet dsAcc=helper.ExecuteDataSet( ”Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Engine Type=;Data Source=D:\Data\SuperMarket.accdb”,
CommandType.Text,
”SELECT * FROM Table_User”);
在 PWMIS.Core.dll SOD核心库中,内置了SqlServer,SqlServerCe,Access,Oracle,OleDb,Odbc 等常见的数据库访问类提供程序。
在程序中每次都指定连接字符串和查询命令类型,好处是“随用随取”,线程安全,随时随地“SqlHelper”,但不好之处就是代码冗余,所以可以把数据访问类类型和连接字符串放到应用程序配置文件中(App.config / Web.config ):
<connectionStrings>
<add name="AccessDb"
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Engine Type=6;Data Source= |DataDirectory|SuperMarket.accdb"
providerName="Access"/>
</connectionStrings>
在上面的连接配置中, providerName="Access" 表示这将是用SOD框架的Access数据库访问提供程序,同样道理,如果 providerName="SqlServer" 将使用SqlServer提供程序。
如果是SOD 核心程序之外的数据访问提供程序,需要使用下面格式的连接配置:
<add name="default"
connectionString="server=10.0.0.1;User Id=pdfnet;password=pdfnet2015;CharSet=utf8;DataBase=test;Allow Zero Datetime=True"
providerName="PWMIS.DataProvider.Data.MySQL,PWMIS.MySqlClient"/>
这个配置说明,连接名为 default 的SOD数据访问驱动程序 所在程序集 是 PWMIS.MySqlClient.dll ,提供程序全名称是 PWMIS.DataProvider.Data.MySQL 。
注意:Web.config 文件中,连接字符串支持|DataDirectory| 路径格式。
配置了数据库连接信息之后,就可以在程序中像下面这样使用了:
using PWMIS.DataProvider.Adapter;//…
AdoHelper accessDb1=MyDB.Instance;//应用程序配置文件连接配置节的最后一个数据连接配置
AdoHelper accessDb2=MyDB.GetDBHelperByConnectionName(“AccessDb”); //连接字符串名字
AdoHelper mySqlDb=MyDB.GetDBHelperByConnectionName(“default”); //连接字符串名字
bool flag= accessDb.GetType() == typeof(Access); //flag=true;
bool flag2= mySqlDb.GetType() == typeof(PWMIS.DataProvider.Data.MySQL); //flag2=true;
注意示例中的 MyDB.Instance 对象,这是系统使用的默认数据访问类,它始终读取的是应用程序配置文件连接配置节的最后一个数据连接配置,这是一个静态单利对象,请勿在事务中使用它,初此之外,在任何地方使用它都是可以的,但仍然不建议你在多线程环境下使用 MyDB.Instance 这个AdoHelper的单例对象,推荐 accessDb2 的AdoHeper 实例化方式。
3.3,微型ORM
除此之外,AdoHelper 对象还是一个“微型ORM”,请看下面的示例:
AdoHelper dbLocal = new SqlServer();
dbLocal.ConnectionString = "Data Source=.;Initial Catalog=LocalDB;Integrated Security=True";
var dataList = dbLocal.GetList(reader =>
{
return new
{
UID=reader.GetInt32(),
Name=reader.GetString()
};
}, "SELECT UID,Name FROM Table_User WHERE Sex={0} And Height>={1:5.2}",, 1.60M);
上面将一条SQL语句的结果,直接映射到了一个匿名实体类上,注意还有格式化参数的功能。
如果不想接SQL结果映射到匿名类型上,而是一个结构根SQL结果类型相同的POCO类上,可以这样使用:
//假设UserPoco 对象跟 Table_User 表是映射的相同结构
AdoHelper dbLocal = new SqlServer();
dbLocal.ConnectionString = "Data Source=.;Initial Catalog=LocalDB;Integrated Security=True";
var list=dbLoal.QueryList<UserPoco>("SELECT UID,Name FROM Table_User WHERE Sex={0} And Height>={1:5.2}",, 1.60M);
该功能可以类似流行的Dapper 数据访问组件,可以使用SOD AdoHelper替代使用。
3.4,小结:
上面说明了PDF.NET SOD框架最基础的数据访问组件 AdoHelper 的使用,但这也是很多新手朋友不太清楚的地方,特别是 MyDB.Instance 单例对象容易滥用,一定要掌握。
SOD框架绝大部分情况下,只需要进行上面的数据连接配置,即可顺利运行代码了,比起Entity Framework 的配置来,是不是简单很多?
看到这里,我想你应该入门了,下面就让我们简要的浏览下SOD框架的一个大概。
----
四、SQL-MAP
你是不是曾经或者看到过别人做的项目,
- 大量拼接SQL语句,或者SQL参数化查询后拖沓呈长而又繁琐的代码,甚至SQL满天飞?
- 维护这样的代码是不是非常痛苦?
- 每天写这样的CRUD代码是不是感觉有点浪费生命?
现在好了,你可以将所有SQL语句集中写到一个配置文件中,集中管理维护你的查询程序,甚至,这个工作你可以丢给DBA去做!
本功能类似于Java界著名的 iBatis 和移植到.Net的 MyBatis.Net ,但是,SQL-MAP去除了它们沉长的配置,并且使用工具自动生成代码,使得编写DAL 数据访问层不需要写一行代码,请参考下面的文章:
更多的内容,你也可以参考SOD框架官方博客的介绍:
(PDF.NET框架实例讲解)将存储过程映射为实体类 深蓝医生 2011-08-18 17:25 阅读:1748 评论:6
使用XSD编写具有智能提示的XML文件(以SQL-MAP脚本为实例) 深蓝医生 2011-05-13 12:17 阅读:1609 评论:7
PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范 深蓝医生 2011-05-07 00:05 阅读:937 评论:1
抽象SQL查询:SQL-MAP技术的使用 深蓝医生 2011-05-06 11:59 阅读:3598 评论:21
使用OQL+SQLMAP解决ORM多表复杂的查询问题 深蓝医生 2011-02-25 19:08 阅读:928 评论:0
PDF.NET数据开发框架 之SQL-MAP使用存储过程 深蓝医生 2010-07-03 23:31 阅读:2386 评论:4
五、ORM
SOD框架发明了独具特色的ORM查询语言OQL,它基本覆盖了SQL92标准的大部分功能,使得你在VS IDE 使用“对象化的SQL”。目前做到这个功能的除了Linq之外,没有更多的ORM具有这个能力,但是对比EF框架的查询语言Linq,OQL有自己的特色,它跟SQL更为接近,对.NET框架的依赖非常小,这使得你有可能将OQL移植到Java ,C++ 这样的面向对象的语言。
下面给出一个简单的示例,有关该示例的详细内容,请参考这篇博客文章《DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架》
SOD的实体类示例:
public class UserEntity:EntityBase, IUser
{
public UserEntity()
{
TableName = "Users";
IdentityName = "User ID";
PrimaryKeys.Add("User ID");
} public int UserID
{
get { return getProperty<int>("User ID"); }
set { setProperty("User ID", value); }
} public string FirstName
{
get { return getProperty<string>("First Name"); }
set { setProperty("First Name", value,); }
} public string LasttName
{
get { return getProperty<string>("Last Name"); }
set { setProperty("Last Name", value,); }
} public int Age
{
get { return getProperty<int>("Age"); }
set { setProperty("Age", value); }
}
}
这是一个简单的用户信息实体类,它继承了一个接口 IUser ,在App.config 中配置了数据连接后,就可以像下面这样使用了:
EntityBuilder.RegisterType(typeof(IUser), typeof(UserEntity));
UserEntity user = EntityBuilder.CreateEntity<IUser>() as UserEntity;
//实体类作为索引器使用
bool flag = (user["User ID"] == null);//true //删除测试数据
LocalDbContext context = new LocalDbContext();//自动创建表
OQL deleteQ = OQL.From(user)
.Delete()
.Where(cmp=>cmp.Comparer(user.UserID,">",)) //为了安全,不带Where条件是不会全部删除数据的
.END;
context.UserQuery.ExecuteOql(deleteQ);
Console.WriteLine("插入3条测试数据");
//插入几条测试数据
context.Add<UserEntity>(new UserEntity() { FirstName ="zhang", LasttName="san" });
context.Add<IUser>(new UserDto() { FirstName = "li", LasttName = "si", Age = });
context.Add<IUser>(new UserEntity() { FirstName = "wang", LasttName = "wu", Age = }); //查找姓张的一个用户
UserEntity uq = new UserEntity() { FirstName = "zhang" };
OQL q = OQL.From(uq)
.Select(uq.UserID, uq.FirstName, uq.Age)
.Where(uq.FirstName)
.END; //下面的语句等效
//UserEntity user2 = EntityQuery<UserEntity>.QueryObject(q,context.CurrentDataBase);
UserEntity user2 = context.UserQuery.GetObject(q);
注意:该实例需要SOD框架最新版本的支持,你也可以使用之前的方式,使用EntityQuery<T> 来操作实体类。
另外,SOD的ORM也支持根据接口之间创建实体类并查询的功能,请看下面的示例:
static void TestGOQL()
{
string sqlInfo="";
//下面使用 ITable_User 或者 Table_User均可
List<ITable_User> userList =
OQL.FromObject<ITable_User>()
//.Select() //选全部自断
.Select(s => new object[] { s.UID, s.Name, s.Sex }) //仅选取3个字段
.Where((cmp, user) => cmp.Property(user.UID) < )
.OrderBy((o,user)=>o.Asc(user.UID))
.Limit(, ) //限制5条记录每页,取第一页
.Print(out sqlInfo)
.ToList(); Console.WriteLine(sqlInfo);
Console.WriteLine("User List item count:{0}",userList.Count);
}
有关该功能的详细内容介绍,请看博客文章《一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架》。
六、Data Control
框架支持Windows Forms,WebForms 的窗体编程,扩展了一套数据控件,包括常用的 文本框、复选框、单选框、列表框、日历控件、标签控件等。这些控件全部遵循SOD的窗体数据接口,实现这个接口的控件将极大的简化窗体应用程序的数据操作,有关内容详细介绍,请看这篇博客文章:
《不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD》
你也可以在 pwmis.codeplex.com 下载源码,找到下面地址对应的SimpleAccessWinForm,
或者下载这个 PDF.Net_V4.6 WinForm 数据表单实例
或者看这个 WebTestTool
这2个示例应用程序,都演示了WinForm下如何使用Data Control 数据控件简化CRUD窗体编程。
另外,如果你是WebForms 应用程序,开源项目的超市管理系统源码 你可以看看,
或者直接下载这个(版本较老) PDF.Net_V4.6_OpenSource (new)
结束语:
SOD不仅仅是一个ORM,它还有SQL-MAP和DataControl,具体可以看框架官网 http://www.pwmis.com/sqlmap ,9年历史铸就的成果,坚固可靠。
非常感谢你看到这里,相信你初步了解了SOD框架的基本功能,如果您还有其它问题,欢迎你在项目的开源网站 pwmis.codeplex.com 的讨论去发帖,或者去官方博客相关文章回帖也可。
最后,祝愿所有.NET 程序员早日摆脱日复一日的CRUD功能,感谢大家对PDF.NET SOD框架一如既往的支持,
2015年新春之际,祝贺各位会员和其他使用框架的朋友喜气洋洋,合家欢乐,万事如意!
附注:如果大家还没有买到节日期间的火车票,推荐本框架开发作者自主开发的《12306无声购票弹窗通知小工具》,工作抢票2不误,绿色无毒安全放心!
深蓝医生
2015.2 月春节
PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引的更多相关文章
- Spring框架的IOC核心功能快速入门
2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...
- pthon web框架flask(二)--快速入门
快速入门 迫切希望上手?本文提供了一个很好的 Flask 介绍.假设你已经安装 Flask, 如果还没有安装话,请浏览下 安装 . 一个最小的应用 一个最小的应用看起来像这样: from flask ...
- SOD开源框架MSF(消息服务框架)进阶篇
复习:在上一篇我介绍了MSF的基本订阅,模式就是,客户端A,订阅服务器.客户端B,订阅服务器.通过服务器广播消息, 所有订阅过的客户端都能接到消息. 进阶:在上一篇的基础上,增加客户端A,发送信息到服 ...
- SOD开源框架MSF(消息服务框架)介绍
前言:之前想做消息的广播,拖着就忘记了,现在拿了医生的框架来学习,就按实现了之前想实现的功能. 传送门http://www.cnblogs.com/bluedoctor/,框架的获取,按传送门的链接就 ...
- Python遗传和进化算法框架(一)Geatpy快速入门
https://blog.csdn.net/qq_33353186/article/details/82014986 Geatpy是一个高性能的Python遗传算法库以及开放式进化算法框架,由华南理工 ...
- 实体框架Entity Framework 4.1快速入门
介 绍 在旧的Entity 框架中,开发者可以从已存在的数据库中产生业务实体的模型,这种开发方法被称为数据库驱动的开发方法.而在4.1的Entity Framework中,支开发者先创建实体业务类,然 ...
- 【Go语言系列】第三方框架和库——GIN:快速入门
要求要安装Gin软件包,需要:1.安装Go(需要1.11+版本)2.设置Go工作区 安装1.下载并安装 gin: $ go get -u github.com/gin-gonic/gin 2.将 gi ...
- Hibernate入门第一讲——Hibernate框架的快速入门
Hibernate框架的概述 什么是框架? 框架指的是软件的半成品,已经完成了部分功能. JavaEE开发的三层架构 了解框架的基本概念之后,我们就来看看Hibernate框架处于JavaEE开发的经 ...
- 一年之计在于春,2015开篇:PDF.NET SOD Ver 5.1完全开源
前言: 自从我2014年下半年到现在的某电商公司工作后,工作太忙,一直没有写过一篇博客,甚至连14年股票市场的牛市都错过了,现在马上要过年了,而今天又是立春节气,如果再不动手,那么明年这个无春的年,也 ...
随机推荐
- 手机页面的 HTML<meta> 标签使用与说明
name="viewport" 设置窗口(网页可绘制的区域) width="device-width" 应用宽与屏幕的宽一样的 (height同width) i ...
- 深入理解CSS中的长度单位
前面的话 本文分为绝对长度单位和相对长度单位来介绍CSS中的长度单位的主要知识 绝对长度单位 绝对长度单位代表一个物理测量 像素px(pixels) 在web上,像素px是典型的度量单位,很多其他长度 ...
- office 2010 安装教程
Microsoft Office 2010,是微软推出的新一代办公软件,提供了一些更丰富和强大的新功能,开发代号为Office 14,实际是第12个发行版.该软件共有6个版本,分别是初级版.家庭及学生 ...
- 参与github上开源项目的大致流程和注意事项
Foreword github是一个很火的代码托管服务网站,可能好多人都想参与一两个项目玩一玩学习一下,但由于是纯英文的网站,可能又会止步于想法上没有动手实践.接下来我就介绍一下参与github上开源 ...
- Azure ARM (4) 开始创建ARM Resource Group并创建存储账户
<Windows Azure Platform 系列文章目录> 好了,接下来我们开始创建Azure Resource Group. 1.我们先登录Azure New Portal,地址是: ...
- 基于HTML5技术的电力3D监控应用(一)
最近参与了国网计量中心的四线一库自动化检定系统的项目开发,团队封闭开发了大半年终于快到尾声了,整个项目过程实在非常累,我的mentor杨杨老师是这样描述的:累的不想说话了.我估计是我太渴望新知识,整天 ...
- Auto Mapper01
在项目中一直在使用Auto Mapper技术,但是只是会简单的使用,对其里面的一些具体的细节和知识点不是很清楚,现在就跟着我从最基础的知识点来重新认识下,AutoMapper技术吧. ...
- C++ - unordered_map 源码解析
转自:http://zrj.me/archives/1248,转载请注明.(分析得不错) 主要尝试回答下面几个问题: 一般情况下,使用 hash 结构,需要有桶的概念,那么 unordered_map ...
- 二维码详解(QR Code)
作者:王子旭链接:https://zhuanlan.zhihu.com/p/21463650来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 2016.7.5 更新:长文 ...
- C# 3DES加密
最近一个项目中,因为服务端是用的java开发的,客户端是用的C#,由于通信部分采用到了3DES加密,所以做个记录,以备以后需要的时候直接用. 这是对方(java)的加密算法,和网上流传的代码也差不多( ...