Accessde Tablodan Tabloya Veri Aktarımında Performans Sorunu

29/09/2018, 23:47

mfyildiz

Merhaba Accesde Bir Tablodan Diğer Tabloya Veri Aktarımında Performans Sorunu Yaşıyorum. 50 satıra kadar veride sıkıntı olmuyor fakat 100 den fazla satır olması durumunda işlem çok uzun sürüyor. Aşağıdaki kod ile yapmak istediğim işlemin bir kısa yolu var mı?.
Ayrıca datagridviev'e ikinci bir veri yüklemesinde satırlar mükerrer görünüyor. Genel olarak işlenmemiş veriyi tekrar yüklesem bile datagrid mükerrer gösteriyor.  
Kodum Aşağıdadır ve Projem Ektedir. Yardımlarınızı Rica Ediyorum. 


 public string patch = Application.StartupPath + "\\data.mdb";


        private void Form1_Load(object sender, EventArgs e)
        {
            billload();
            periodload();
        }

        public void periodload()
        {
            OleDbConnection con_kdv = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" + patch);
            OleDbDataAdapter da_kdv = new OleDbDataAdapter("SElect *from period", con_kdv);
            DataSet ds_kdv = new DataSet();
            con_kdv.Open();
            da_kdv.Fill(ds_kdv, "period");
            periodgrid.DataSource = ds_kdv.Tables["period"];
            con_kdv.Close();

        }


        public void billload()
        {
            OleDbConnection faturayuklecon = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + patch);
            OleDbDataAdapter faturayukleda = new OleDbDataAdapter("SElect *from bill", faturayuklecon);
            DataSet faturayukleds = new DataSet();
            faturayuklecon.Open();
            faturayukleda.Fill(faturayukleds, "bill");
            billgrid.DataSource = faturayukleds.Tables["bill"];
            faturayuklecon.Close();

            int ilkonsay;
            ilkonsay = billgrid.RowCount; int bi = ilkonsay - 1;
            rowlabel.Text = bi.ToString();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            periodemtyrowadd();
        }

        public void periodemtyrowadd()
        {
            OleDbConnection connection = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + patch);
            connection.Open();

            OleDbCommand kdvsil = new OleDbCommand("DELETE FROM period WHERE ID", connection);
            kdvsil.ExecuteNonQuery();

            try
            {
                for (int i = 0; i < billgrid.RowCount; i++)
                {
                    if (billgrid.Rows != null && billgrid.Rows.Cells[1].Value != null)
                    {
                        DateTime d = DateTime.Parse(billgrid.Rows.Cells[1].Value.ToString());
                        InsertRow(d.ToString("dd.MM.yyyy"));
                    }
                }
            }
            catch
            {
                MessageBox.Show("Bill Date Sorting Error ...!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            connection.Close();

            perioddublicatedrowclean();
            periodload();
        }


            void InsertRow(string cell)
            {
                DateTime month;
                string ncell = cell.Replace('.', '-');
                if (DateTime.TryParseExact(ncell, "dd-MM-yyyy", null, DateTimeStyles.None, out month))
                {
                    InsertMonth(month.AddMonths(-1));
                    InsertMonth(month);
                }
            }

            void InsertMonth(DateTime month)
            {
                using (var conn = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + patch))
                using (var cmd1 = conn.CreateCommand())

                {
                    cmd1.Connection.Open();
                    cmd1.CommandText = "insert into period (a) values (?)";
                    cmd1.Parameters.AddWithValue("?", month.ToString("MM/yyyy").Replace('.', '/'));
                    cmd1.ExecuteNonQuery();
                }
            }

            int kdvsil1, kdvsil2;

            public void perioddublicatedrowclean()
            {
                OleDbConnection con = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + patch);
                DataSet ds = new DataSet();
                OleDbDataAdapter da = new OleDbDataAdapter("select * from period", con);
                con.Open();
                da.Fill(ds, "period");
                for (int i = 0; i < ds.Tables["period"].Rows.Count; i++)
                {
                    DataRow row = ds.Tables["period"].Rows;
                    kdvsil2++;
                    for (int j = kdvsil2; j < ds.Tables["period"].Rows.Count; j++)
                    {
                        DataRow row2 = ds.Tables["period"].Rows[j];

                        if (row.ItemArray.GetValue(1).ToString() == row2.ItemArray.GetValue(1).ToString())
                        {
                            if (row.ItemArray.GetValue(3).ToString() == row2.ItemArray.GetValue(3).ToString())
                            {
                                kdvsil1 = int.Parse(row2.ItemArray.GetValue(0).ToString());
                                kdvsila(kdvsil1);
                            }
                        }
                    }
                }
                con.Close();
            }


            public void kdvsila(int num)
            {
                OleDbConnection con = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + patch);
                con.Open();
                OleDbCommand c = new OleDbCommand("Delete from period where ID =?", con);
                c.Parameters.AddWithValue("ID", num);
                c.ExecuteNonQuery();
                con.Close();
            }
30/09/2018, 01:17

mehmetdemiral

Sorunuz Access sorusu değil. Yazılım platformunuza uygun olan yer olan .net bölümüne taşıyorum.
09/10/2018, 09:51

emir ustaoğlu

Sayın mfyildiz;

Kullanmış olduğunuz kod yapısı performans açısından bir çok sorun yaratabilecek bir yapıda


INSERT StokSatis (StokAdi, StokRengi)  SELECT StokAdi ,StokRengi FROM Stoklar 

Şeklinde bor kod yapısı ile çok daha hızlı ve performanslı bir şekilde tablolar arası kayıt kopyalayabilirsiniz.

İsterseniz kodu WHERE yapısı ile sadece belirlediğiniz kriterlere sahip kayıtların kopyalanmasını sağlayacak şekilde çalıştırabilirsiniz.

Kodu denemenizi ve olumlu/olumsuz dönüş yapmanızı rica ederim.
13/10/2018, 19:25

mfyildiz

Merhaba Verdiğiniz Örnekteki Kod Yapısından Veriler Olduğu Gibi Bir Tablodan başka tabloya basit bir şekilde aktarmakta kullanılmaktadır. 
1. tablonun tarih içeren 2. sütunundaki satırları 2 tabloya aktarırken örneğin "28.12.2015" tarihi için "11/2015" satırı ve sonra "12/2015" satırı ekleyecek ve daha sonra bu satırlardan mükerrer olanları silinecek.

örnek:
1. tablo sütun a (veri alınacak sütun)
18.06.2018
15.06.2018
10.08.2018
30.09.2018

2. tablo sütun a (veri yazılacak - satır eklenecek sütun)
05/2018
06/2018
07/2018
08/2018
09/2018

yukarıdaki işlemi hızlı bir şekilde yapabilecek yöntem yok mu ?