C# ASP.Net Access veri tabanı tarih kaydetme hatası

notify (538) 8 yıl önce sordu

Merhabalar;

Sayın Hocalarım ve Değerli arkadaşlarım ben Asp.net de bir takvim hazırladım ve bu takvimi label'a bağladım.Yani Takvimden bir tarihi seçtiğim zaman label'a geliyor.

Kod;

protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        this.Label1.Text = this.Calendar1.SelectedDate.ToShortDateString();
    }
}

Benim amacım ise label'a gelen tarihi Access veri tabanına kaydetmek ama birtürlü yapamadım bu kodda bir hata var ve çözemedim. Hata olan yeri koyu renkli olarak işaretledim. Yardımcı olursanız sevinirim tam 5 saattir uğraşıyorum son çarem sizsiniz...

protected void Page_Load(object sender, EventArgs e)

    {
        OleDbConnection baglan = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath("App_Data\\Veritabanı1.accdb"));
        baglan.Open();
        string Tarih = Label1.Text;
        OleDbCommand ekle = new OleDbCommand("Insert INTO  TarihTablosu (Tarih) Values( '" + Tarih + "')", baglan);
        ekle.ExecuteNonQuery();
        baglan.Close();
        baglan.Dispose();
    }

Toplam 1 cevap


alattin (17125) 8 yıl önce cevapladı

Böyle uzun süre bir sorunla uğraşınca arada ara verin, bir kahve çay alın. Biraz hava alın tekrardan bilgisayar başına oturun :-)

 

İlk hata Page_Load olayında kodları çalıştırmayı deniyorsunuz. Bu durumda  Label1'e değer atanmadığı için veri türü uyuşmazlığı "{"Data type mismatch in criteria expression."}" hatası alacaksınız.

Yani Label1.Text değerini değiştirmediseniz "label" olarak duruyordur.  Takvim kontrolünde henüz seçin yapılmadığı için Label1'e değer atanmamış durumdadır.

Kayıt kodlarını butonun click olayına koyarsanız daha mantıklı. Sayfaya bir buton ekler ve kodları şu şekilde düzenleyebilirsiniz:

 public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           
        }

        protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {
            this.Label1.Text = this.Calendar1.SelectedDate.ToShortDateString();
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            VeriKaydet();
        }
        void VeriKaydet() {
            OleDbConnection baglan = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath("App_Data\\Veritabanı1.accdb"));
            baglan.Open();
            string Tarih = Label1.Text;
            OleDbCommand ekle = new OleDbCommand("Insert INTO  TarihTablosu (Tarih) Values( '" + Tarih + "')", baglan);
            ekle.ExecuteNonQuery();
            baglan.Close();
            baglan.Dispose();
        }
    }

Ayrıca çok önemli bir nokta, SQL sorgularında string birleştirme yapmayın. Yani + ile sorgularınızı oluşturmayın. Bunun yerine parametre kullanın şu şekilde:

 OleDbCommand ekle = new OleDbCommand("Insert INTO  Uye (Tarih) Values(@prm1)", baglan);
ekle.Parameters.AddWithValue("@prm1", Tarih);

Bu şekilde SQL sorguları üzerinden gelecek saldırılara karşı önlem almış olursunuz.