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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM