首先創建一個工程文件,為了便於展示數據這里創建一個類型為:WindowsApplication的工程文件。命名為:PetapocoTest。
程序最終布局及功能預覽如下:
在項目文件的Reference上右鍵, 選擇“管理NuGet程序包”,並搜索Petapoco,安裝之。
在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的增、刪、改、查的代碼與具體連接哪個物理數據庫類型無關。
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; } }
接下來創建一個PetaPoco.Database對象。
var db=new PetaPoco.Database("DefaultConnection ");
// 查詢所有數據 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));
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; } }
Petapoco支持2種查詢數據的方法:Query及Fetch。Fetch返回的是List<T>數據對象,而Query使用了yield迭代器,返回IEnumerable,並且不是一次性全部將數據獲取到內存。
執行非查詢語句,使用Execute 方法。
db.Execute("DELETE FROM articles WHERE draft<>0");
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);
上述例子中需要聲明表名及主鍵來增刪除改,簡化起見,可以在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; } }
使用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);
使用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);
使用事務非常簡單,只需要聲明如下:
using (var scope=db.Transaction) { // 其他任務處理 … // Commit scope.Complete(); }
事務可以嵌套,只有當事務中的所有語句成功執行時才會commit,否則rollback。
下面是最簡單的形式:
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