2014-02-18 60 views
0

我有這樣的代碼:PetaPoco更新只是修改的記錄

namespace PetaPocoTest 
{ 
    public partial class Form1 : Form 
    { 
     PetaPoco.Database db = new PetaPoco.Database("PgConnection"); 

     IEnumerable<customers> allCustomers; 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      allCustomers = db.Query<customers>("SELECT * FROM customers"); 
      mGrid.DataSource = allCustomers .ToList();    
     } 

     private void saveButton_Click(object sender, EventArgs e) 
     { 
      foreach (var a in allCustomers) 
      { 
       db.Save("customers", "custumer_id", a); 
      } 
     } 
    } 
} 

蝙蝠更新所有的記錄,不管他們是否被更改或不。 所以,我的問題是沒有人知道如何更新petapoco中只更改的記錄?

回答

1

這是我做到了(最終!):

namespace PetaPocoTest 
{ 
    public partial class Form1 : Form 
    { 
     PetaPoco.Database db = new PetaPoco.Database("PgConnection"); 
     Dictionary<string, int> modRows = new Dictionary<string, int>(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      bindingSource = db.Fetch<customers>("SELECT * FROM customers"); 
      mGrid.DataSource = bindingSource;    
     } 

     private void saveButton_Click(object sender, EventArgs e) 
     { 
      db.BeginTransaction(); 

       foreach (customers c in bindingSource) 
       { 
        if (modRows.ContainsKey(c.id.ToString())) 
        { 
         db.Save("customers", "id", c); 
        } 
       } 

      db.CompleteTransaction(); 
     } 

     private void mGrid_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
     { 
      int recId = ((customers)bindingSource.Current).id; 

      if (!modRows.ContainsKey(recId.ToString())) 
      { 
       modRows.Add(recId.ToString(), recId); 
      } 
     } 

    } 
} 

它的功能,但如果任何人有更好的主意請分享!

+0

感謝這將被自動保存。這真是太好了,現在我們可以簡單地將db.Save(c)保存在foreach循環中; –

0

這是我通過做到這一點db.BeginTransaction的Form_Load

private void Form1_Load(object sender, EventArgs e) 
{ 
     studentBindingSource.DataSource = db.Query<student>("SELECT * FROM student"); 
     db.BeginTransaction(); // Begin Transaction here 
} 

更新CellValueChanged)只是簡單地做db.Save()最簡單的方法這還沒有交付,因爲我們的交易尚未完成

private void studentDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     db.Save((student)studentBindingSource.Current);   
    } 

是的,我們可以做插入刪除以及!!!

插入

private void buttonInsert_Click(object sender, EventArgs e) 
{ 
    student newStudent = new student 
    { 
     StudentName = "POCONEW" 
    } 
    studentBindingSource.Add(newStudent); 
    db.Save(newStudent); 
} 

刪除

private void studentDataGridView_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) 
{ 
    int rowIndex = e.Row.Index; // We use Gridview row index instead because BindingSource.Current isn't work when user drag then deleting multiple row 
    db.Delete(studentDataGridView.Rows[rowIndex].DataBoundItem as student); 
} 

最後到保存修改我們只是做db.CompleteTransaction() :只要稍微注意一下這裏的用戶後,如果不關閉,請按保存按鈕表格你必須調用db.BeginTransaction(),如果再在此之後不能代表一切用戶編輯,因爲我們沒有交易了

private void btSave_Click(object sender, EventArgs e) 
{ 
    db.CompleteTransaction(); 
    db.BeginTransaction(); // everything user edit after this will be saved automatically because we don't have Transaction anymore so we Begin it again 
} 
+0

捕捉異常而不做任何事......壞主意:) – rasputino

+0

我仍然想知道如何處理它。如果我在消息框中顯示異常,你認爲沒關係嗎? –

+0

當然不是,只是不要在那裏捕捉任何異常,你想避免哪種異常? – rasputino