PetaPoco update just modified records in winforms

▼魔方 西西 提交于 2019-12-08 13:15:14

问题


I have this code :

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);
             }
        }
    }
}

bat this updates all record, no matter if they are changed or not. So, my question is does anyone know how to update only changed records in petapoco ?


回答1:


This is how I did it (eventually!) :

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);
            }
        }

    }
}

It functions, but if anyone has better idea pls share!




回答2:


This is the simplest way from me to do this by db.BeginTransaction on Form_Load

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

On Update (CellValueChanged) just simply do db.Save() this doesn't commit yet because our transaction is not complete yet

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

And yes we can do Insert and Delete as well !!!

Insert

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

Delete

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);
}

Finally to save change we just do db.CompleteTransaction() :Just a little note here after user press the Save Button if you don't close the form you have to call db.BeginTransaction() again if not everything user edit after this will be saved automatically because we don't have Transaction anymore

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
}


来源:https://stackoverflow.com/questions/21851825/petapoco-update-just-modified-records-in-winforms

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!