Çözüldü C# butona günde sadece bir kez tıklama nasıl yapılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

THE_YORULMAZZZ

Hectopat
Katılım
26 Şubat 2021
Mesajlar
463
Makaleler
1
Çözümler
7
C# da bir projem var ve bu projede veritabanına veri eklemek için bir butonum var ancak günde yalnızca bir kez veri eklemesi gerek bu yüzden butona günde sadece bir kez tıklanma izni vermem gerek. 2. Kez tıklanmaması gerekiyor, yardımcı olur musunuz?
 
Çözüm
Hocam amacınızı anladım da Date'in kullanıldığı yer yok attığınız kodlarda if içerisine eklenmesi gerekmezmi.
Gerek yok hocam, şöyle daha detaylı bir kod daha yazdım buna da bakabilirsiniz.


C#:
using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    // Bugünün tarihi
    private DateTime today = DateTime.Today;
    // Bugünkü tıklama sayısı
    private int clickCount = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Tarih kontrol et.
        if (today != DateTime.Today)
        {
            // Tarih farklıysa, tıklama sayısı sıfırla
            clickCount = 0;
            today = DateTime.Today;
        }

        // Tıklama sayısı kontrol et.
        if (clickCount < 1)
        {
            // Tıklama sayısı 1 den azsa, veri ekle
            // veritabanına veri ekleme kodu
            clickCount++;
        }
        else
        {
            // Tıklama sayısı 1 den fazla ise, uyarı ver
            MessageBox.Show("Bugün için veri ekleme izniniz doldu.");
        }
    }
}
C#:
private void btngunsonu_Click(object sender, EventArgs e)
        {
            // Tarih kontrol et.
            if (today != DateTime.Today)
            {
                // Tarih farklıysa, tıklama sayısı sıfırla
                clickCount = 0;
                today = DateTime.Today;
            }

            // Tıklama sayısı kontrol et.
            if (clickCount < 1)
            {
                try
                {
                    using (SqlConnection conn = new SqlConnection(connectionString))
                    {
                        conn.Open();

                        // Bugün için Gelir ve Gider bilgilerini al
                        SqlCommand gelirCommand = new SqlCommand(Gelirquery, conn);
                        gelirtoplam = (int)gelirCommand.ExecuteScalar();

                        SqlCommand giderCommand = new SqlCommand(Giderquery, conn);
                        gidertoplam = (int)giderCommand.ExecuteScalar();

                        // Bakiye bilgisini hesapla
                        bakiyetoplam = gelirtoplam - gidertoplam;

                        // Bakiye bilgisini veritabanına ekle
                        SqlCommand cmd1 = new SqlCommand();
                        cmd1.Connection = conn;
                        cmd1.CommandText = "INSERT INTO Kasa(Tarih,Gelir,Gider,Bakiye) VALUES (@Tarih, @Gelir, @Gider, @Bakiye)";
                        cmd1.Parameters.AddWithValue("@Tarih", DateTime.Now);
                        cmd1.Parameters.AddWithValue("@Gelir", gelirtoplam);
                        cmd1.Parameters.AddWithValue("@Gider", gidertoplam);
                        cmd1.Parameters.AddWithValue("@Bakiye", bakiyetoplam);
                        cmd1.ExecuteNonQuery();
                        conn.Close();
                        // Verileri listele
                        listele();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Hata oluştu: " + ex.Message, "SİSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                clickCount++;
            }
            else
            {
                // Tıklama sayısı 1 den fazla ise, uyarı ver
                MessageBox.Show("Bugün için veri ekleme izniniz doldu.");
            }
        }

Bir de böyle deneyin hocam, yukarıda sizin kodu biraz daha optimize ettim, aşağıdaki kodda da veri sorununuzu da çözüyor. Ayrıca listele() komutunu ellemedim fakat bunun yerine gridview, listview kullanmak daha doğru olacaktır.

Eğer yapmak isterseniz;

C#:
 // Verileri gerçek zamanlı olarak güncelle, SqlDataAdapter veritabanındaki verileri okur ve DataTable'a doldurur. Sonra, dataGridView1 adlı gridview'in DataSource'u olarak DataTable atanır. Bu şekilde, veritabanındaki veriler gerçek zamanlı olarak güncellenir ve kullanıcının verileri tekrar listelemek için "listele()" methodunu çağırmasına gerek olmaz.
        string selectQuery = "SELECT * FROM Kasa";
        SqlDataAdapter adapter = new SqlDataAdapter(selectQuery, conn);
        DataTable table = new DataTable();
        adapter.Fill(table);
        dataGridView1.DataSource = table;




C#:
private void btngunsonu_Click(object sender, EventArgs e)
{
    try
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();

            // Bugün için Gelir ve Gider bilgilerini al
            string Gelirquery = "SELECT SUM(Gelir_Tutari) FROM Gelir WHERE CAST(Tarih AS DATE) = CAST(GETDATE() AS DATE)";
            SqlCommand gelirCommand = new SqlCommand(Gelirquery, conn);
            gelirtoplam = (int)gelirCommand.ExecuteScalar();

            string Giderquery = "SELECT SUM(Gider_Tutari) FROM Gider WHERE CAST(Tarih AS DATE) = CAST(GETDATE() AS DATE)";
            SqlCommand giderCommand = new SqlCommand(Giderquery, conn);
            gidertoplam = (int)giderCommand.ExecuteScalar();

            // Bakiye bilgisini hesapla
            bakiyetoplam = gelirtoplam - gidertoplam;

            // Bakiye bilgisini veritabanına ekle
            SqlCommand cmd1 = new SqlCommand();
            cmd1.Connection = conn;
            cmd1.CommandText = "INSERT INTO Kasa(Tarih,Gelir,Gider,Bakiye) VALUES (@Tarih, @Gelir, @Gider, @Bakiye)";
            cmd1.Parameters.AddWithValue("@Tarih", DateTime.Now);
            cmd1.Parameters.AddWithValue("@Gelir", gelirtoplam);
            cmd1.Parameters.AddWithValue("@Gider", gidertoplam);
            cmd1.Parameters.AddWithValue("@Bakiye", bakiyetoplam);
            cmd1.ExecuteNonQuery();
            conn.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Hata oluştu: " + ex.Message, "SİSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Veritabanına bugün için yapılan tüm işlemleri döndüren sorgular kullandım.
 
Son düzenleme:
C#:
private void btngunsonu_Click(object sender, EventArgs e)
{
    try
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();

            // Bugün için Gelir ve Gider bilgilerini al
            string Gelirquery = "SELECT SUM(Gelir_Tutari) FROM Gelir WHERE CAST(Tarih AS DATE) = CAST(GETDATE() AS DATE)";
            SqlCommand gelirCommand = new SqlCommand(Gelirquery, conn);
            gelirtoplam = (int)gelirCommand.ExecuteScalar();

            string Giderquery = "SELECT SUM(Gider_Tutari) FROM Gider WHERE CAST(Tarih AS DATE) = CAST(GETDATE() AS DATE)";
            SqlCommand giderCommand = new SqlCommand(Giderquery, conn);
            gidertoplam = (int)giderCommand.ExecuteScalar();

            // Bakiye bilgisini hesapla
            bakiyetoplam = gelirtoplam - gidertoplam;

            // Bakiye bilgisini veritabanına ekle
            SqlCommand cmd1 = new SqlCommand();
            cmd1.Connection = conn;
            cmd1.CommandText = "INSERT INTO Kasa(Tarih,Gelir,Gider,Bakiye) VALUES (@Tarih, @Gelir, @Gider, @Bakiye)";
            cmd1.Parameters.AddWithValue("@Tarih", DateTime.Now);
            cmd1.Parameters.AddWithValue("@Gelir", gelirtoplam);
            cmd1.Parameters.AddWithValue("@Gider", gidertoplam);
            cmd1.Parameters.AddWithValue("@Bakiye", bakiyetoplam);
            cmd1.ExecuteNonQuery();
            conn.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Hata oluştu: " + ex.Message, "SİSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Hocam son paylaştığınızı yazıyorum hemen ilk yazdığınız ile farkı nedir
 
İlk yazdığım kod senin yazdığın kodun orijinal sadece biraz daha optimize edilmiş ufak tefek bir kaç hatanın çözülmüş hali, veri sorununu vesaire o kodda çözmedim. Son kodda veri sorununun da çözümü var listele() komutunu hala ellemedim. Sen değiştirmek istersen diye kodunu attım.
 
Hocam son attığınız kodu yazdım ancak catch kodunda ki hata uyarısını veriyor direkt butona bastığım zaman
 
Hata mesajını atar mısınız hocam?
C++:
catch (Exception ex)
                {
                    MessageBox.Show("Hata oluştu: " + ex.Message, "SİSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

Buradaki hatayı veriyor hocam direkt uygulama içerisinde
 
Hocam veri tabanı yüzünden bir hata alıyorsunuz, veri tabanını bir kontrol edin oralarda bir sıkıntı var mı. Ayrıca "catch" kod bloğunu bir silip tekrar deneyin bu sefer ne hatası verecek acaba.
System.ArgumentException: 'Başlatma dizesinin biçimi, 0 dizininde başlayan belirtime uygun değil.'

verdiği hata bu hocam.
 
Veritabanı sunucusunun adresinin doğru olduğundan, veritabanının adının doğru olduğundan, kullanıcı adının ve şifrenin doğru olduğundan veya veritabanı sunucusunun çalışıyor olup olmadığından emin olun hocam.

Bağlantı dizgisinde yanlış bir yazım varsa veya eksik bir bilgi varsa da bu hatayı alabilirsiniz, örnek olarak veritabanı sunucusu adresiniz localhost ise 'Data Source=localhost;' şeklinde olması gerekiyor.
 
Hocam bağlantı dizininde herhangi bir hata yok
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…