PetaPoco是一個簡單輕巧的orm開源類庫,全部功能只有一個文件,可以很方便集成到項目中。代替SqlHelper輔助類的不二選擇。。。
主要功能包括: - 映射實體類,支持enum,Nullable等類型,可同時映射多個實例。 - 支持分頁 - 以@0等占位符代替SqlParameter,傳參更方便 - 帶有sql字符串構造器,構造條件查詢sql非常方便 - update支持指定字段更新 - 支持T4模板
使用示例: 使用前需要先new一個數據庫實例:
var db = new PetaPoco.Database("ConnectionName");
可以放心地把db實例設為static,因為實例中沒有SqlConnection的引用,連接每次執行完后,會自動關閉。 發現有人反映在web上使用static的db實例還是會有問題,具體可看鏈接(Link1),StackOverflow中推薦web中每個請求使用一個單獨的db實例(Link2). 1、取一條記錄
var a = db.SingleOrDefault("SELECT * FROM articles WHERE article_id=@0", 123));
2、分頁
// 分頁實質在內部是用Row_Number()重寫了sql,支持join
var result=db.Page(1, 20, "SELECT * FROM articles WHERE category=@0 ORDER BY date_created DESC", "coolstuff");
上面的分頁sql,會被改寫為sql:
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY date_created DESC) peta_rn, * FROM articles WHERE category=@0 ) peta_paged WHERE peta_rn>@1 AND peta_rn
3、部分更新
db.Update("articles", "article_id", new { title="New title" }, 123);
4、sql條件構造
var sql = PetaPoco.Sql.Builder .Append("SELECT * FROM articles") .Append("WHERE article_id=@0", id) .Append("WHERE date_created>=@0", start_date) .Append("WHERE date_created<=@0", end_date);
5、直接執行sql
db.Execute("DELETE FROM articles WHERE draft<>0");
6、調用存儲過程
//調用存儲過程 db.Execute("exec procSomeHandler @0, @1", 3, "2011-10-01"); //調用帶輸出(OUTPUT)參數的存儲過程, 寫的sql語句,@0參數后的“output”是關鍵 var param = new SqlParameter() { Direction = ParameterDirection.Output, SqlDbType = SqlDbType.Int }; db.Execute("exec procSomeHandler @0 OUTPUT", param);
7、代替返回值DataTable 有時,我們並不想每條執行的sql都需要創建對應的實體類,這樣會導致項目中存在過多的實體類,有方法能做到DataTable這樣靈活就最好了。在.net4.0中,PetaPoco可以返回dynamic類型,可以很好地解決這個問題,而在.net3.5中就沒辦法,不過可以通過修改PetaPoco代碼,實現使用Dictionary類型來代替dynamic動態類型的功能。改動代碼如下:https://github.com/cxfksword/PetaPoco/commit/e07746c06977f09ef8e7a0f81b718e520b4513ed
var list = db.Fetch>("select article_id,date_created from articles");
使用petapoco時有點需要注意,就是當數據庫字段數據類型是varchar等非unicode字符類型時,petapoco傳參需要把string轉換為AnsiString類型,否則會有性能問題。
Ansi String Support DBA guru Rob Sullivan yesterday pointed out that SQL Server has pretty severe performance overhead if you try to query an index with varchar column using a unicode string parameter. To fix this the parameter needs to be bound as DbType.AnsiString. To facilitate this you can now wrap such string parameters in a new AnsiString class: var a = db.SingleOrDefault("WHERE title=@0", new PetaPoco.AnsiString("blah"));
參考資料: http://code.google.com/p/dapper-dot-net/ http://www.toptensoftware.com/petapoco/