none
ORM öğrenmeye çalışıyorum. Update işlemini yapamadım. RRS feed

  • Soru

  • Merhaba;

    ORM ile veritabanı işlemleri yapmayı öğrenmeye çalışıyorum.

    Bir solution içinde 4 proje var. 


    Form1 içinde veriler datagrid içinde görünüyor.

    Ekleme ve güncelleme işlemi için yeni bir form açılıyor. 

    Ekleme işleminde bir sıkıntı yok. Gayet güzel çalışıyor. 

    Güncelleme işleminde aşağıdaki kodda direkt olarak else bloğuna giriyor ve Güncelleme işlemi başarısız kodu çalışıyor. 

    Kod şu şekilde.

        public partial class FrmPopupSiparis : Form
        {
            siparislerORM orm = new siparislerORM();
            private siparis siparis { get; set; }
    
            public FrmPopupSiparis(siparis _siparis)
            {
                InitializeComponent();
    
                if (_siparis == null)
                {
                    groupBox1.Text = "Yeni sipariş Ekle";
                    button1.Text = "EKLE";
    
                }
                else
                {
                    groupBox1.Text = "Sipariş  Güncelleme";
                    button1.Text = "GÜNCELLE";
                    siparis = _siparis;
                    txtSiparisKod.Text = siparis.SipKod;
                    txtSipNo.Text = siparis.SipNo;
                }
    
            }
    
       
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (siparis == null)
                {
                    siparis = new siparis();
                    siparis.SipKod = txtSiparisKod.Text;
                    siparis.SipNo = txtSipNo.Text;
                    if (orm.Ekle(siparis))
                        ToolsMessage.Basarili("Kayıt", this);
                    else
                        ToolsMessage.Hata("Kayıt işlemi Başarısız", this);
                }
                else
                {
                    siparis.SipKod = txtSiparisKod.Text;
                    siparis.SipNo = txtSipNo.Text;
                    siparis.ID = siparis.ID;
                    int id = siparis.ID;
    
    
                    if (orm.Guncelle(siparis))
                        ToolsMessage.Basarili("Kayıt", this);
                    else
                        ToolsMessage.Hata("Güncelleme işlemi Başarısız", this);
                }
    
                this.DialogResult = DialogResult.OK;
            }
        }

    ORMBase kodu da aşağıdaki gibi .

     public bool Guncelle(T entity)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append($"UPDATE {(TipGetir.GetCustomAttribute<Table>()).SqlTabloAdi} SET ");
    
                OleDbCommand cmd = new OleDbCommand();
                int index = 0;
                string whereID = "";
                foreach (PropertyInfo pi in TipGetir.GetProperties())
                {
                    cmd.Parameters.AddWithValue("@" + pi.Name, pi.GetValue(entity));
                    //cmd.Parameters.AddWithValue("@UrunAdi","Bilgisyar")
                    if (pi.Name == TipGetir.GetCustomAttribute<Table>().IdentityCol)
                    {
                        whereID = " WHERE " + pi.Name + "=@" + pi.Name;
                    }
                    else if (TipGetir.GetProperties().Length - 1 == index)
                    {
                        sb.Append(pi.Name + "=@" + pi.Name);
                    }
                    else
                    {
                        sb.Append(pi.Name + "=@" + pi.Name + ",");
                    }
                    index++;
    
                }
                string query = sb.ToString() + whereID;
    
                cmd.CommandText = query;
                return ExecuteNonQuery(cmd);
            }

    Nerede hata yapıyorum acaba. Yardımcı olabilirseniz sevinirim. 

    18 Nisan 2020 Cumartesi 09:38

Yanıtlar

  • Bu koddan bir sey söylemek imkansız. TipGetir tipiyle calisiyorsunuz, parametrede gelen ise T, ilk görünen hata o.

    Ikinci ve belkide en büyük hata: OleDb ile calismaniza ragmen, parametreleri TipGetir.GetProperties'den gelen sirayla ekliyorsunuz, sorgudaki sirayla degil. Bu güncellemenin yapılmamasına ya da hatalı yapılmasına neden olacaktır. (Bu arada AddWithValue kullanmayınız, Add kullanıp tipini belirtiniz). 

    Bu sekilde tekerleği yeniden bulmaya calismak yerine ornegin EF veya nHibernate kullanabilirsiniz. Kod acısından, onların kodlarını inceleyebilirsiniz.

    Not: Basit ve efektif bir ORM ornegi IQToolkit. Onun kodu kisa ve anlasilir. 



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız.





    18 Nisan 2020 Cumartesi 19:03
    Yanıtlayıcı
  • Merhaba ;

    Sorun kodda değilmiş.

    Sorun Access ten kaynaklı. (Bu projeyi yazılımcı bir arkadaşıma uzaktan bağlanarak kontrol ettirdim. )

    Aynı kodu SQLServerda çalıştırdığımda hiç problemsiz çalıştı. 

    Ama ne yazık ki bu çalışmayı  Access i kullanarak yapmak zorundayım  :(

    Benim gibi mecbur değilseniz Access mi  aman  aman.....


    • Yanıt Olarak İşaretleyen asasad1616 3 Mayıs 2020 Pazar 08:00
    • Düzenleyen asasad1616 3 Mayıs 2020 Pazar 08:00 Eksik bilgi...
    3 Mayıs 2020 Pazar 08:00

Tüm Yanıtlar

  • Deleted
    18 Nisan 2020 Cumartesi 18:34
  • Bu koddan bir sey söylemek imkansız. TipGetir tipiyle calisiyorsunuz, parametrede gelen ise T, ilk görünen hata o.

    Ikinci ve belkide en büyük hata: OleDb ile calismaniza ragmen, parametreleri TipGetir.GetProperties'den gelen sirayla ekliyorsunuz, sorgudaki sirayla degil. Bu güncellemenin yapılmamasına ya da hatalı yapılmasına neden olacaktır. (Bu arada AddWithValue kullanmayınız, Add kullanıp tipini belirtiniz). 

    Bu sekilde tekerleği yeniden bulmaya calismak yerine ornegin EF veya nHibernate kullanabilirsiniz. Kod acısından, onların kodlarını inceleyebilirsiniz.

    Not: Basit ve efektif bir ORM ornegi IQToolkit. Onun kodu kisa ve anlasilir. 



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız.





    18 Nisan 2020 Cumartesi 19:03
    Yanıtlayıcı
  • siparis.ID = siparis.ID; int id = siparis.ID;

    Siparis.ID değerini kendine eşitlemişsiniz. sanırım id değeri olmadığı için update yapamıyor kontrol edermisiniz


    Yanıtları yardımcı olurlarsa yanıt olarak işaretlemeyi ve yardım sağlamazlarsa işaretlerini kaldırmayı unutmayın; bu, aynı veya benzer soruna çözüm arayan diğerlerine yardımcı olacaktır.

    19 Nisan 2020 Pazar 06:44
  • Merhaba ;

    Sorun kodda değilmiş.

    Sorun Access ten kaynaklı. (Bu projeyi yazılımcı bir arkadaşıma uzaktan bağlanarak kontrol ettirdim. )

    Aynı kodu SQLServerda çalıştırdığımda hiç problemsiz çalıştı. 

    Ama ne yazık ki bu çalışmayı  Access i kullanarak yapmak zorundayım  :(

    Benim gibi mecbur değilseniz Access mi  aman  aman.....


    • Yanıt Olarak İşaretleyen asasad1616 3 Mayıs 2020 Pazar 08:00
    • Düzenleyen asasad1616 3 Mayıs 2020 Pazar 08:00 Eksik bilgi...
    3 Mayıs 2020 Pazar 08:00
  • Merhaba ;

    Sorun kodda değilmiş.

    Sorun Access ten kaynaklı. (Bu projeyi yazılımcı bir arkadaşıma uzaktan bağlanarak kontrol ettirdim. )

    Aynı kodu SQLServerda çalıştırdığımda hiç problemsiz çalıştı. 

    Ama ne yazık ki bu çalışmayı  Access i kullanarak yapmak zorundayım  :(

    Benim gibi mecbur değilseniz Access mi  aman  aman.....


    @Çetin abinin gönderisini okudunuz umarım, karşınızda SQL tarzı bir şey varmış gibi parametreleri yanlış veriyorsunuz. 

    Access konusunda ise haklısınız bulaşan her yazılımcı en az bir kere sövmüştür.


    www.cihanyakar.com


    3 Mayıs 2020 Pazar 08:13
  • Merhaba ;

    Sorun kodda değilmiş.

    Sorun Access ten kaynaklı. (Bu projeyi yazılımcı bir arkadaşıma uzaktan bağlanarak kontrol ettirdim. )

    Aynı kodu SQLServerda çalıştırdığımda hiç problemsiz çalıştı. 

    Ama ne yazık ki bu çalışmayı  Access i kullanarak yapmak zorundayım  :(

    Benim gibi mecbur değilseniz Access mi  aman  aman.....


    @Çetin abinin gönderisini okudunu umarım, karşınızda SQL tarzı bir şey varmış gibi paramatreleri yanlış veriyorsunuz. 

    Access konusunda ise haklısınız bulaşan her yazılımcı en az bir kere sövmüştür.


    www.cihanyakar.com

    Cihan ve Çetin Abi tşk ederim ikinize de parametre sırasını değiştirince oldu. 

     @Çetin abinin gönderisini okuduğunu umarım, karşınızda SQL tarzı bir şey varmış gibi paramatreleri yanlış veriyorsunuz. 

    Cümlesini bir şekilde anlamamış / yada atlamışım.  

    Her ikinize de tşkler. 


    • Düzenleyen asasad1616 3 Mayıs 2020 Pazar 12:27
    3 Mayıs 2020 Pazar 12:25
  • Merhaba ;

    Sorun kodda değilmiş.

    Sorun Access ten kaynaklı. (Bu projeyi yazılımcı bir arkadaşıma uzaktan bağlanarak kontrol ettirdim. )

    Aynı kodu SQLServerda çalıştırdığımda hiç problemsiz çalıştı. 

    Ama ne yazık ki bu çalışmayı  Access i kullanarak yapmak zorundayım  :(

    Benim gibi mecbur değilseniz Access mi  aman  aman.....


    Sorun tabii ki kodda. SQL Server ile "named parameters" kullaniyorsunuz ve bu nedenle verilis sırası onemli degil. access ile ise "positional parameters" kullaniyorsunuz ve parametre sırası onemli, sanırım yeteri kadar açık yazamamasim altını cizidigim koyu işaretli bolumu.


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    4 Mayıs 2020 Pazartesi 16:18
    Yanıtlayıcı