Bu yazımızda SQL Offline Log programı ile server’ ımızda bulunan database’ imize veri yazmaktan bahsediceğiz ama bu sefer bağlantı olmadığı zaman nasıl bir çözüm bulabiliriz onu göreceğiz.

Bir uygulama yaptığınızı düşünün belirli periyotlarda database’inize log atıyor. Ama bazen bağlantı kopabildiği ve server’ ın kapandığı ya da reset atıldığı durumlar olabilir. Bu durumlarda uygulamanız bağlantı kuramadığında log atma işlemi gerçekleşemeyecektir. Peki ya nolucak?

Bağlantı olmadığı durumlarda kendi hafızasındaki bir dosyada verilerinizi tutup belirli periyotlarda bağlantı durumunu kontrol ettirebilirsiniz. Bağlantı varsa hafızasıdaki bilgileri okuyup sırasıyla log atıp hafızasındaki verileri silebilirsiniz.

Bu çözümün C#‘ ta yazılmış kodları aşağıdadır. İlk önce bir database oluşturun. C#’ta bir form oluşturarak bir buton ekleyin. Amacımız butona basınca sql’e log atmak. Bağlantı olmayınca butona basınca log atamayacak ve log_test.txt dosyasına yazacak. Ardından timer’ ın çalşma zamanı geldiğince bağlantı kontrol edilecek, bağlantı varsa log_test.txt dosyası okunarak veriler log atılıp dosya temizlenecek. Bağlantı yoksa bir sonraki çalışma zamanına kadar beklenecek.

İncelemeniz ve başarılı olarak uygulayıp fayda sağlaması dileğiyle…

// www.kaizen40.com

namespace Sqlbuffer
{
    public partial class Form1 : Form
    {
        SqlConnection baglanti = new SqlConnection("Data Source = server adresi; Initial Catalog = database adı; Persist Security Info = True; User ID = kullanıcı adı; Password = şifre;");

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = baglanti;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "INSERT into dbo.test1 (veri1, veri2, tarih) VALUES (@veri1, @veri2, @tarih)";
                cmd.Parameters.AddWithValue("@veri1", textBox1.Text);
                cmd.Parameters.AddWithValue("@veri2", textBox2.Text);
                cmd.Parameters.AddWithValue("@tarih", textBox3.Text);

                try
                {
                    baglanti.Open();
                    cmd.ExecuteNonQuery();
                    baglanti.Close();

                    MessageBox.Show("ok");
                }
                catch (SqlException)
                {
                    string log = File.ReadAllText("log_test.txt");

                    using (StreamWriter writer = new StreamWriter("log_test.txt"))
                    {
                        log += textBox1.Text + ";" + textBox1.Text + ";";

                        writer.WriteLine(log);
                        writer.Close();
                    }

                    MessageBox.Show("fail");
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 30000;         // 30 sn de bir kontrol et
            timer1.Enabled = true;

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                if (baglanti.State == ConnectionState.Closed)
                {
                    baglanti.Open();

                    /////////// dosyadan oku, bufferda varsa sql'e bas ///////////
                    // satır sayısını hesapla
                    int satiradedi = 0;
                    using (StreamReader satirsayici = new StreamReader("log_test.txt"))
                    {
                        while (satirsayici.Read() > 0)
                        {
                            satirsayici.ReadLine();
                            satiradedi++;   // satır sayısını hesapla ve ona göre for döngüsünü yürüt
                        }
                        satirsayici.Close();
                    }

                    if (satiradedi > 0)
                    {
                        // satırları pakete ayır
                        for (int i = 0; i < satiradedi; i++)
                        {
                            string satirlog = File.ReadLines("log_test.txt").Skip(i).Take(1).First();
                            string bilgi = "";
                            string paket1 = "";     // veri1
                            string paket2 = "";     // veri2
                            int index = 0;

                            for (int j = 0; j < satirlog.Length; j++)        // gelen stringinin içindeki bilgileri ayır
                            {
                                char ch = satirlog[j];
                                if (ch == ';')
                                {
                                    if (index == 0)
                                    {
                                        paket1 = bilgi;
                                        index++;
                                    }

                                    if (index == 1)
                                    {
                                        paket2 = bilgi;
                                    }

                                    bilgi = "";
                                }
                                else
                                {
                                    bilgi += ch;    // birden fazla karakter varsa birleştir
                                }
                            }
                            bilgi = "";
                            index = 0;

                            // sql' e gönder

                            using (SqlCommand cmd = new SqlCommand())
                            {
                                cmd.Connection = baglanti;
                                cmd.CommandType = CommandType.Text;
                                cmd.CommandText = "INSERT into dbo.test1 (veri1, veri2) VALUES (@veri1, @veri2)";
                                cmd.Parameters.AddWithValue("@veri1", paket1);
                                cmd.Parameters.AddWithValue("@veri2", paket2);
                                cmd.ExecuteNonQuery();

                            }
                        }

                        // bufferı temizle
                        using (StreamWriter writer = new StreamWriter("log_test.txt"))
                        {
                            writer.Write("");
                            writer.Close();
                        }
                    }

                    baglanti.Close();   // sql'i kapa

                    LabelSQLStatus.Text = "Baglantı OK! Son kontrol zamanı: " + DateTime.Now;
                    LabelSQLStatus.ForeColor = Color.Black;
                    
                }
            }
            catch(SqlException)
            {
                LabelSQLStatus.Text = "SQL Bağanltı Hatası! Son kontrol zamanı: " + DateTime.Now;
                LabelSQLStatus.ForeColor = Color.Red;
            }
        }
    }
}

Bol kodlamalar,


0 yorum

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.