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