• 15-04-2017, 12:54:44
    #1
    Arkadaşlar merhaba,

    C#'a merak saldım ve öğrenmek amaçlı bir otomasyon hazırlıyorum. Otomasyonda form üzerinden girdiğim verileri, veritabanına kayıt ederken hata alıyorum. Hata:

    Alıntı
    Data type mismatch in criteria expression.
    Sanırım hata form üzerindeki tarihlerden kaynaklı.


    Form üzerindeki tarih alan şekli:


    Tarihleri datetimepicker olarak oluşturdum ve Kayıt Bitiş Tarihi'nden tarih seçtiğimde Ücret label alanına gün sayısı ve ücreti form üzerinden hesaplattım. Kodları:

    private void dtkayitbit_ValueChanged(object sender, EventArgs e)
            {
                int ucret;
                DateTime giristarihi = Convert.ToDateTime(dtkayitbas.Text);
                DateTime cikistarihi = Convert.ToDateTime(dtkayitbit.Text);
                TimeSpan gunsayisi = cikistarihi - giristarihi;
                tbgunsayisi.Text = gunsayisi.TotalDays.ToString() + " Gün";
                labelgunsayisi.Text = gunsayisi.TotalDays.ToString();
                ucret = Convert.ToInt32(labelgunsayisi.Text) * 4;
                tbucret.Text = ucret.ToString() + " TL";
            }

    Kaydet butonuna tıkladığımda ise veri girdirme kodlarım:

    private void button1_Click(object sender, EventArgs e)
            {
                baglanti = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=veritabani.accdb");
                komut = new OleDbCommand("insert into Musteriler(tcno,ad,soyad,adres,eposta,telefon,hocaid,ucret,kayitbaslamatar,kayitbitistar,cinsiyet,dogumtar,boy,kilo,hastalik,sporturu) values (@tcno,@ad,@soyad,@adres,@eposta,@telefon,@hocaid,@ucret,@kayitbaslamatar,@kayitbitistar,@cinsiyet,@dogumtar,@boy,@kilo,@hastalik,@sporturu)",baglanti);
                komut.Parameters.AddWithValue("@tcno", Convert.ToInt32(tbtc.Text));
                komut.Parameters.AddWithValue("@ad", tbad.Text);
                komut.Parameters.AddWithValue("@soyad", tbsoyad.Text);
                komut.Parameters.AddWithValue("@adres", tbadres.Text);
                komut.Parameters.AddWithValue("@eposta", tbeposta.Text);
                komut.Parameters.AddWithValue("@telefon", tbtel.Text);
                komut.Parameters.AddWithValue("@hocasi", tbhocaad.Text);
                komut.Parameters.AddWithValue("@ucret", tbucret.Text);
                komut.Parameters.AddWithValue("@kayitbaslamatar", dtkayitbas.Value);
                komut.Parameters.AddWithValue("@kayitbitistar", dtkayitbit.Value);
                komut.Parameters.AddWithValue("@cinsiyet", cbcinsiyet.Text);
                komut.Parameters.AddWithValue("@dogumtar", tbyas.Text);
                komut.Parameters.AddWithValue("@boy", tbboy.Text);
                komut.Parameters.AddWithValue("@kilo", tbkilo.Text);
                komut.Parameters.AddWithValue("@hastalik", tbhasta.Text);
                komut.Parameters.AddWithValue("@sporturu", tbsporturu.Text);
                baglanti.Open();
                komut.ExecuteNonQuery();
                MessageBox.Show("Test");
                baglanti.Close();
            }

    Veritabanı tasarımım:



    Nerede hata yaptım araştırmama rağmen çözüm bulamadım.
  • 15-04-2017, 13:56:36
    #2
    Merhaba, şu şekilde dener misin; kayıt tarihlerini sql acces dosyasında metin olarak ayarla daha sonra saat ifadelerini string olarak tanımla.
  • 15-04-2017, 15:43:09
    #3
    burda

    komut.Parameters.AddWithValue("@tcno", Convert.ToInt32(tbtc.Text));


    tcno yu string olarak ayarlamissin tablonda ama kodunda integer a ceviriyorsun ve bunu limit 2 milyar kusur. Boyle olunca kimlik numarasi 3 ya da 5 olanlarda hata alacaksin yani zaten converttoin32 calismayacak.

    komut.Parameters.AddWithValue("@tcno", tbtc.Text);


    tarih olayinda da bir hata olabilir, buradaki sikinti formatlama ile ilgili olabilir. Veritabanina hangi format ile kaydediliyorsa (yil-ay-gün ..) gibi, da dtkayitbas.Value da ayni formatta vermesi lazim ama problem olmamasi lazim. Once bir dene bu tcno olayini olmazsa tarih icin bakarsin.
  • 15-04-2017, 16:56:29
    #4
    @ertan2002'nin dediklerini aynen yap ve benim tavsiyem database diye access kullanma. Her zaman başını ağrıtır. Onun yerine kur sql server localdb (50mb falan bişey) mis gibi mssql kullan. İstersen mysql, sqlite gibi database'ler de kullanabilirsin ama access'ten uzak dur derim...
  • 15-04-2017, 19:06:00
    #5
    Teşekkür ederim mesajlarınız için.

    @SametKarakus; belirttiğin şekilde tarihleri string olarak bastırdım ama olmadı.

    @ertan2002; veritabanında tc alanını integer yapmıştım çalışmayınca da tc alanını char olarak güncellemiştim ve öyle kalmış. Düzelttim ama yine değişen bir şey yok.

    @OguzK; tavsiyen için teşekkür ederim. Projemi öğrenme amaçlı yaptığımdan access üzerinde geliştirmeye çalışıyorum kendimi. Ama sorun devam ettiği için halen kayıt gönderemiyorum veritabanına.


  • 15-04-2017, 19:32:52
    #6
    access i acmissin ve musteriler tablosunu design da acik birakmissin. Access i tamamen kapatir dener misin?
  • 16-04-2017, 00:10:52
    #7
    Çok dikkatsiz davranmışım, kapatınca oldu teşekkür ederim. Onun haricinde

    
    komut.Parameters.AddWithValue("@kayitbaslamatar", dtkayitbas.Value.ToString("dd-MM-yyyy"));
    komut.Parameters.AddWithValue("@kayitbitistar", dtkayitbit.Value.ToString("dd-MM-yyyy"));
    formatında tarihleri veritabanına kaydedince asıl sorunum çözülmüş oldu. Herkese çok teşekkür ediyorum.
  • 16-04-2017, 18:27:19
    #8
    BurakH adlı üyeden alıntı: mesajı görüntüle
    Çok dikkatsiz davranmışım, kapatınca oldu teşekkür ederim. Onun haricinde

    
    komut.Parameters.AddWithValue("@kayitbaslamatar", dtkayitbas.Value.ToString("dd-MM-yyyy"));
    komut.Parameters.AddWithValue("@kayitbitistar", dtkayitbit.Value.ToString("dd-MM-yyyy"));
    formatında tarihleri veritabanına kaydedince asıl sorunum çözülmüş oldu. Herkese çok teşekkür ediyorum.
    Bu tarz kullanımlar doğru değil. Eğer siz veritabanında bir tarih alanı saklamak istiyorsanız, veritabanında bu kolonu datetime yapar uygulamanız üzerinden de bu alana parametre değeri olarak datetime gönderirsiniz. Database'e veriyi gönderirken tür dönüşümüne girilmez.

    komut.Parameters.AddWithValue("@kayitbitistar", dtkayitbit.Value);

    Bu şekilde göndermelisiniz. Tabi veritabanında kolonunuzu tarih olarak ayarlamanız gerekir.