PetaPoco入门(二)
1. Petapoco基本用法
1.1. 创建示例工程
首先创建一个工程文件,为了便于展示数据这里创建一个类型为:WindowsApplication的工程文件。命名为:PetapocoTest。
程序最终布局及功能预览如下:
1.2. 添加petapoco包
在项目文件的Reference上右键, 选择“管理NuGet程序包”,并搜索Petapoco,安装之。
1.3. 添加数据库连接
在app.config或web.config文件中添加数据库连接串。
下面是连接SQL Server:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=huhm\sqlexpress;Initial Catalog=Northwind;Persist Security Info=True;User ID=aspnet;Password=***;" providerName="System.Data.SqlClient" />
</connectionStrings>
下面是连接MySQL:
<add name="DefaultConnection" connectionString="Server=huhm;Port=3306;Database=Northwind;Uid=aspnet;Pwd=***;pooling=false;" providerName="MySql.Data.MySqlClient"/>
由于petapoco是与面向数据库无关的ORM组件,故对DB的增、删、改、查的代码与具体连接哪个物理数据库类型无关。
1.4. 定义POCO-实体类

public class article
{
public long article_id { get; set; }
public string title { get; set; }
public DateTime date_created { get; set; }
public bool draft { get; set; }
public string content { get; set; }
}

1.5. 创建petapoco操作对象
接下来创建一个PetaPoco.Database对象。
var db=new PetaPoco.Database("DefaultConnection ");
1.6. 查询数据

// 查询所有数据
foreach (var a in db.Query<article>("SELECT * FROM articles"))
{
Console.WriteLine("{0} - {1}", a.article_id, a.title);
}
//查询标量
long count=db.ExecuteScalar<long>("SELECT Count(*) FROM articles"); //查询单条数据
var a = db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=@0", 123));

1.7. 分页查询
var result=db.Page<article>(1, 20, // <-- page number and items per page
"SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC", "coolstuff");
返回的是一个PagedFetch对象,包括以下属性:

public class Page<T> where T:new()
{
public long CurrentPage { get; set; }
public long ItemsPerPage { get; set; }
public long TotalPages { get; set; }
public long TotalItems { get; set; }
public List<T> Items { get; set; }
}

1.8. Query 与Fetch 方法
Petapoco支持2种查询数据的方法:Query及Fetch。Fetch返回的是List<T>数据对象,而Query使用了yield迭代器,返回IEnumerable,并且不是一次性全部将数据获取到内存。
1.9. 非查询命令
执行非查询语句,使用Execute 方法。
db.Execute("DELETE FROM articles WHERE draft<>0");
1.10. 增删改查
Petapoco很好地支持了增删改查。
插入一条记录,需要声明表名及主键:

// Create the article
var a=new article();
a.title="我的标题";
a.content="测试数据 by tinyhu";
a.date_created=DateTime.UtcNow; // Insert it
db.Insert("articles", "article_id", a);

更新数据:

// Get a record
var a=db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=@0", 123); // Change it
a.content="测试数据 by tinyhu"; // Save it
db.Update("articles", "article_id", a);

可以传入一个匿名类型只更新部分部分字段。例如,下面只更新标题title列。
db.Update("articles", "article_id", new { title="New title" }, 123);
删除有2种方法:
// Delete an article extracting the primary key from a record
db.Delete("articles", "article_id", a); // Or if you already have the ID elsewhere
db.Delete("articles", "article_id", null, 123);
1.11. 声明POCO对象
上述例子中需要声明表名及主键来增删除改,简化起见,可以在poco对象添加TableName及PrimarKey属性,这样做CRUD操作时不再需要声明表名及主键了。

[PetaPoco.TableName("articles")]
[PetaPoco.PrimaryKey("article_id")]
public class article
{
public long article_id { get; set; }
public string title { get; set; }
public DateTime date_created { get; set; }
public bool draft { get; set; }
public string content { get; set; }
}

如下所例,直接删除、更新或删除一个实体对象。

// Insert a record
var a=new article();
a.title="测试标题";
a.content="测试数据 by tinyhu ";
a.date_created=DateTime.UtcNow;
db.Insert(a); // Update it
a.content="修改,修改 …";
db.Update(a); // Delete it
db.Delete(a);

可以声明一些字段忽略更新,如下例:

public class article
{
[PetaPoco.Ignore]
public long SomeCalculatedFieldPerhaps
{
get; set;
}
}

1.12. 自动Select子句
使用PetaPoco时,大多数查询以”select * from table”开始。可以省略掉SELECT * FROM table子句,因为petapoco会自动帮我们构建。
例如下句:
// Get a record
var a=db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=@0", 123);
可简写为:
// Get a record
var a=db.SingleOrDefault<article>("WHERE article_id=@0", 123);
1.13. IsNew 及 Save 方法
使用IsNew可以检测记录是否在数据表中存在:
// Is this a new record
if (db.IsNew(a))
{
// Yes it is...
}
Save方法会自动发送Insert(如果表中不存在)或Update子句。
// Save a new or existing record
db.Save(a);
1.14. 事务Transactions
使用事务非常简单,只需要声明如下:

using (var scope=db.Transaction)
{
// 其他任务处理 … // Commit
scope.Complete();
}

事务可以嵌套,只有当事务中的所有语句成功执行时才会commit,否则rollback。
1.15. PetaPoco的SQL Builder
下面是最简单的形式:

var id=123;
var a=db.Query<article>(PetaPoco.Sql.Builder
.Append("SELECT * FROM articles")
.Append("WHERE article_id=@0", id)
) var id=123;
var a=db.Query<article>(PetaPoco.Sql.Builder
.Append("SELECT * FROM articles")
.Append("WHERE article_id=@0", id)
.Append("AND date_created<@0", DateTime.UtcNow)
)

可以附加条件判断动态生成子句

var id=123;
var sql=PetaPoco.Sql.Builder
.Append("SELECT * FROM articles")
.Append("WHERE article_id=@0", id); if (start_date.HasValue)
sql.Append("AND date_created>=@0", start_date.Value); if (end_date.HasValue)
sql.Append("AND date_created<=@0", end_date.Value); var a=db.Query<article>(sql)

注意每个append子句使用参数: @0? PetaPoco构建参数列表并自动完成赋值。
可以使用命名参数,如下示例。

sql.Append("AND date_created>=@start AND date_created<=@end",
new
{
start=DateTime.UtcNow.AddDays(-2),
end=DateTime.UtcNow
}
);
var sql=PetaPoco.Sql.Builder()
.Select("*")
.From("articles")
.Where("date_created < @0", DateTime.UtcNow)

出处: http://www.cnblogs.com/tinyhu/archive/2013/06/02/3113692.html
来源:http://www.cnblogs.com/youring2
PetaPoco入门(二)的更多相关文章
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- Swift语法基础入门二(数组, 字典, 字符串)
Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...
- Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)
原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...
- DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表
原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的, ...
- css入门二-常用样式
css入门二-常用样式总结 基本标签样式 背景色background-color 高度height; 宽度width; 边框对齐以及详细设定举例 width/*宽度*/: 80%; height/*高 ...
- 微服务(入门二):netcore通过consul注册服务
基础准备 1.创建asp.net core Web 应用程序选择Api 2.appsettings.json 配置consul服务器地址,以及本机ip和端口号信息 { "Logging&qu ...
- IM开发者的零基础通信技术入门(二):通信交换技术的百年发展史(下)
1.系列文章引言 1.1 适合谁来阅读? 本系列文章尽量使用最浅显易懂的文字.图片来组织内容,力求通信技术零基础的人群也能看懂.但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获.如果您大 ...
- 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?
1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机 ...
- 2.Python爬虫入门二之爬虫基础了解
1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...
随机推荐
- php数组序列化serialize与unserialize
$arr=array('1','2','3');echo serialize($arr); //序列化 a:3:{i:0;s:1:"1";i:1;s:1:"2" ...
- js 所有事件列表
javascript事件列表解说 事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown ...
- Mysql权限
连接Oracle/Mysql数据库的配置 1.Oracle <context:property-placeholder location="jdbc.properties"/ ...
- .gitignore文件不起作用
当我们用git时常常会习惯把我们不想上传到远程代码库中的一些本地文件(夹)放在一个叫做.gitignore的文件中,例如常见的本地build文件夹,一些IDE如Intellig,Eclipse的项目管 ...
- only for equality comparisons Hash Index Characteristics
http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html Hash Index Characteristics Hash indexes ...
- maven说
maven打包命令:mvn assembly:assembly 打包成jar包需要修改配置把unpack改成false文件在: C:\Users\Administrator\.m2\repositor ...
- iOS后台定位,实时向服务器发送最新位置
第一步,开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: Past ...
- 大商创 sql追踪 用户注册
用户注册sql追踪 用户注册数据表 sql语句分析 ', 'wzd222@qq.com', 'addf92072794a4b668f70815672ba5c8') 主要成分: user_name,mo ...
- Android drawText获取text宽度的三种方式
String str = "Hello";canvas.drawText( str , x , y , paint); //1. 粗略计算文字宽度Log.d(TAG, " ...
- RDIFramework.NET ━ Web中打印的各种方案参考-欢迎补充
RDIFramework.NET ━ Web中打印的各种方案参考-欢迎补充 做Web开发的同志应该都深有体会,在web程序中打印不再象应用程序中那样便于控制了,web程序天生的一些特性造成了这个缺点, ...