.net

C# ile Dosyadan Okuma-Yazma İşlemleri!

Finaller, Fuarlar, MSP başvuru videosu derken blogumu yeteri kadar boşladım. (Eğer bu haftada birşeyler yazmasaydım kapatacaktım blogumu :)). Admin paneline girerken tedirgindim ama şifresini hatırlayınca içim rahatladı :).

Yazacağım makalelerin konusunu daha çok forumlardan belirliyorum. Forumlarda en çok hangi konularda problemler ile karşılaşılıyorsa onunla ilgili birşeyler yazmayı tercih ediyorum. Dosyadan okuma yazma işlemleri ile ilgili sorular soruluyordu bende bununla alakalı bir makale yazmak istedim. Umarım faydalı olur…

Dosyadan okuma yazma yapmak için bir tane FileStream türünden nesneye ihtiyacınız olacak.

Örnek olarak; FileStream fs = new FileStream(@”C:\dosya.txt”, FileMode.Create, FileAccess.Read);

İlk parametre hangi dosyadan okuma yapacaksanız veya yazma yapacaksanız dosya yolunu, ikinci parametre ise FileMode türünden bir enum. Bu enum türünden dosyayı ne modda üreteceğinizi veya erişeceğinizi belirtiyorsunuz. FileMode‘da şu değerler var;

FileMode.Append: Eğer dosya başka bir program tarafından kullanılıyorsa veya açıksa
yazacağınız karakterler dosyanın sonuna eklenecek.
FileMode.Create: Belirttiğiniz dosya isminde bir dosya yoksa üretecek, eğer varsa üstüne
yazacak.
FileMode.CreateNew: Dosya olsada olmasada yeni bir tane üretecek.
FileMode.Open: Belirtilen dosyayı açacak. Bu durumda dosyanın kapalı olması lazım
aksi takdirde Exception alabilirsiniz.
FileMode.OpenorCreate: Eğer dosya varsa açacak, yoksa yeni bir tane üretecek.
FileMode.Truncate: Bu modda dosyanın mutlaka açık olması lazım, açık olan dosyanın içindeki
bilgileri siliyor.

FileStream sınıfının üretici fonksiyonun üçüncü parametresi ise, FileAccess türünden bir enum ile dosyaya erişim modunu istiyor. FileAccess’de eğer okuma yapacaksanız .Read, yazma yapacaksanız .Write, hem okuma hem de yazma yapacaksanız .ReadWrite. FileStream’ı tanımladıktan sonra işimiz artık daha da kolay. Bu sınıfın bize sağladı fs.Read(…) ve fs.Write(…) fonksiyonları ile dosyadan veri okuma ve veri yazma yapabiliriz. Şimdi “…” bunları biraz açalım. Önce okuma fonksiyonundan başlayalım;

int [Okunan Byte Sayısı] fs.Read(byte[] dizi, int Indis, int Yazılacak Byte Sayısı): İlk parametre bir byte dizisi dosyadan okuduğunuz verileri bu byte dizisinde olacak, ikinci parametre ise dosyadaki verileri bu dizinin kaçıncı indisinden itibaren yazacağınızı, üçüncü parametre de ise kaç karakter okunacağını istiyor. Geri dönüş değeri ise dosyadan kaç karakter okuduğunuz.

void fs.Write(byte[] dizi, int Indis, int Yazılacak Byte Sayısı): İlk parametre bir byte dizisi dosyaya yazacağınız veriler bu byte dizisinde olacak, ikinci parametre ise dizideki verileri kaçıncı indisinden itibaren yazacağınızı, üçüncü parametre de ise belirtiğiniz indisten itibaren kaç karakter yazacağınızı istiyor.

Dikkatini çektiyse burada hiç string türünden birşey yok, yani siz dosyaya “Deneme yazısı” yazmak istediğinizde bunu bir byte dizisine atmanız gerekiyor. Elbette bu string türünden ifadeyi direk dosyaya yazan bir fonksiyon var ama biz gelin önce bu string’i byte dizisine çevirelim sonra da dosyaya yazalım;

FileStream fs = new FileStream(@"C:\dosya.txt", FileMode.Create, FileAccess.Read);
byte[] dosyaYazisi = ASCIIEncoding.ASCII.GetBytes("Deneme yazısı");
fs.Write(dosyaYazisi, 0, dosyaYazisi.Length);

Evet hepsi bu kadar ama her seferinde yazacağınız veriyi ASCIIEnco…. sınıfında byte’a dönüştürüp sonra yazmak zor olsa gerek. Gelin bunu biz .Write(“Deneme yazısı”) şeklinde yapalım. .Net kütüphanesinde birden fazla okuma ve yazma yapan sınıflar var; StreamWriter, BinaryWriter, StreamReader, BinaryReader gibi sınıflar bu konuda imdadımıza yetişiyor. Bu sınıfların hepsi FileStream türünden bir nesne istiyor, buradan da şunu anlıyoruz biz dosyadan okuma yazma yapacaksak hemen bir tane FileStream tanımlayacağınız. StreamReader ve StreamWriter sınıflarını burada anlatacağım Binary versiyonunu size bırakıyorum :),

StreamWriter sw = new StreamWriter(fs); bu şekilde tanımlama yaptığınız takdirde StreamWriter nesnesini, FileStream türünden tanımladığınız nesnenin tüm özellikleri ile erişebilirsiniz. StreamWriter adından da anlaşılacağı gibi dosyaya yazma yapan bir fonksiyon ve bunun için iki tane kullanışlı fonksiyonu var; .Write(…), .WriteLine(…), WriteLine dediğiniz takdirde “sw.NewLine” özelliğine belirtiğiniz karakteri sonuna ekler. (Hiçbirşey belirtmezseniz ‘\n’ vardır. Yani alt satıra geçer 😉 ).

.Write(…) fonksiyonu neredeyse bütün veri türlerini kabul ediyor ve dosyaya yazıyor. Bu fonksiyonu Console.Write(…) fonksiyonun aynısı olarak düşünebilirsiniz.

StreamReader sınıfını ise tahmin edeceğiniz gibi; StreamReader sr = new StreamReader(fs) şeklinde tanımlıyoruz. StreamReader’da bize dosyadan verileri okumakta yardımcı olan bir sınıf ve kullanışlı olan birkaç .Read fonksiyonu var; .Read(…), .ReadLine(…), .ReadToEnd(…).

.Read(…): Bu fonksiyonun iki türü var eğer .Read() olarak kullanırsanız size int türünden bir değer dönecektir. İkinci türü ise FileStream sınıfındaki .Read(…) ile aynı.

.ReadLine(…): Bu fonksiyon dosyadan sadece tek bir satır okur. Eğer satır satır okuma yapacaksanız bu fonksiyonu kullanabilirsiniz.

.ReadToEnd(…): Bu fonksiyon dosyanın başından sonuna kadar okur ve bunu bir string türünden geri döndürür.

Son olarak şunu da belirtmek istiyorum; FileStream sınıfının önemli bir fonksiyonuda .Seek(…) bu fonksiyonu kullanarak dosya imlecini istediğiniz yere set edebilirsiniz. Kullanımı ise fs.Seek(3, SeekOrigin.Begin) böyle dedikten sonra okuma yaparsanız eğer size (“eme Yazısı”) dönecektir.

Gördüğünüz gibi dosyadan okuma ve yazma işlemi .Net ile çok kolay. Umarım buradaki bilgiler sizlere faydalı olur,

Görüşmek üzere,

Hepinize kolay gelsin, iyi çalışmalar…

‘The ‘Microsoft.Jet.OLEDB.4.0′ provider is not registered on the local machine.’ Hatası!

Programı çalıştırdığınızda karşınıza şöyle bir hata çıkıyorsa;
‘The ‘Microsoft.Jet.OLEDB.4.0′ provider is not registered on the local machine.’ yapmanız gereken çok basit bir işlem. Projenize sağ tıklayıp ‘Properties->Build->Platform Targer->x86’ olarak derleyip tekrar çalıştırdığınızda probleminiz çözülmüş olacaktır. Sorunun çözümünden sonra nedeninide açıklayalım, projenizde Access veya Excel kullanıyorsanız 64bit işletim sistemlerinde karşınıza bu hata çıkacaktır şayet makinede Office uygulaması yüklü değilse. Jet Oledb uygulaması sistemde yüklü değilse, uygulama 64-Bit işletim sistemini desteklemiyorsa veya Access yada Excel uygulamamıza 64bit işletim sistemlerinde erişemiyorsak bu hata ile karşılaşabiliriz.

Kolay gelsin, İyi çalışmalar…

Gmail ile Mail Gönderimi!

Uygulamanızda teknik destek için, dosya gönderimi vb. ihtiyaçlar için mail gönderimi gerekebilir. Ben Gmail ile nasıl bu işlemi yapılacağını anlatacağım ama hangi mail servisiniz kullanıyorsanız onun port numarasını ve smtp adresini alarak gönderbilirsiniz, gmail olmak gibi bir zorunluluğu yok.

MailMessage MailYolla = new MailMessage();

MailYolla.From = new MailAddress("[mail adresiniz]@gmail.com");
MailYolla.To.Add("[mail adresiniz]@gmail.com");
MailYolla.Subject = "Deneme Maili";
MailYolla.Priority = MailPriority.High;
MailYolla.Body = "www.burakozkan.net deneme maili.";

SmtpClient Yolla = new SmtpClient();
Yolla.SendCompleted += new SendCompletedEventHandler(Yolla_SendCompleted);
Yolla.Credentials = new System.Net.NetworkCredential("[mail adresiniz]@gmail.com", "[mail adresinizin şifresi]");
Yolla.Host = "smtp.gmail.com";
Yolla.Timeout = 50000;
Yolla.Port = 587;
Yolla.EnableSsl = true;

string userState = "Mail Gönderiliyor";Yolla.SendAsync(MailYolla, userState);

private void Yolla_SendCompleted(object sender, AsyncCompletedEventArgs e)
{
   string Durum = (string)e.UserState;
   if (e.Cancelled == true)
   {
      MessageBox.Show("Mail Gönderimi İptal Edildi");
   }
   if (e.Error != null)
   {
      MessageBox.Show("Mail Gönderilemiyor: " + e.Error.ToString());
   }
   else
   { MessageBox.Show("Mail Gönderildi");   }
}

Burada kendi kendimize bir mail göndermiş oluyoruz. Textbox ile kullanıcının mail adresini alıp geri dönüş yapabiliriz. ‘Yolla_SendCompleted’ bu fonksiyonun altında başarılı ise kullanıcıya otomatik bir mesaj yollayabiliriz. Kod kısmını inceleyecek olursak, MailMessage türünden MailYolla sınıfı oluşturuyoruz, burada Mail’i kime göndereceğimizi, mesajımızı, eklenecek dosya varsa eklenecek dosyaları bu sınıfın özelliklerinden faydalanarak yapıyoruz. Ardından SMTP türünden Yolla adında bir sınıf değişkeni oluşturuyoruz. Bu sınıfın özelliklerine de port, mail adresi, mail şifresi vb. özellikleri giriyoruz ve en son olarak Yolla.SendAsync(…) fonksiyonu ile maili gönderiyoruz. ‘Yolla_SendCompleted’ isimli fonksiyon mail gönderme işlemi başlayınca tetiklenir ve işlemler yapılır. Umarı faydalı olur sizlere…

Kolay gelsin, iyi çalışmalar…

C# ile Windows Formununa Login Girişi!

Yaptığımız uygulamaların çalışması için önceden bir ‘Kullanıcı Adı’ ve ‘Şifre’ sorarak çalışmasını isteyebiliriz. Bunun için bir çok algoritma geliştirilebilir. Bu makalede benim izleyeceğim yol, ‘Kullanıcı Adı’ ve ‘Şifre’ bilgilerini bir veritabanında tutmak olacak, hatta kullanıcının ‘Yetki’lerini de veritabanında tutarak uygulamamızda kullanıcıya özel yetkiler verebiliriz. Aşağıdaki resimde kullanıcı ve yetki bilgilerinin veritabanı tasarımı SQL Server 2005’de yapılmış olarak gösterilmektedir.

Tasarımı incelersek; ‘Yetki’ tablosu bizim uygulamamıza özel yetkileri içeriyor. Mesela bir ürün takip otomasyon’u yapıyorsak, ‘Stok Gir’, ‘Stok Çık’ bunlar yetki olabilir ve depo bölümünü ilgilendiren yetkilerdir, aynı şekilde ‘Cihaz Üretime Hazırla’ gibi bir yetki’de üretim bölümünü ilgilendiren bir yetkidir. Uygulamamızda birde ‘Admin’ yetkisi olur bu yetki de yeni kullanıcı ekleyebilir, yetkileri değiştirebilir. Bunu yapması için de Yetkilerin adlarını da tutmamız Admin için daha anlaşılır yapar. ‘Kullanicilar’ tablosuda ‘KullaniciNo’, ‘KullaniciSifre’ ve ‘KullaniciAdi’ tutar bu tablo da ‘Kullanıcı Adı’ ve ‘Şifre’ bilgileri tutulur. ‘Kullanıcı No’ tek bir ‘Kullanıcı Adı’ ve ‘Şifre’ olacağı için primary key olarak tanımlanmışdır. Son olarak ‘Izin’ tablosu da ‘Kullanıcı No’, ‘Yetki No’ ve ‘ErisebilirMi’ sütunlarından oluşuyor. Bu tabloyu incelersek, Kullanıcı No’yu primary key yapamayız çünkü bir kullanıcının birden fazla yetki’si olabilir, yetki’yide primary key yapamayız çünkü bir yetki birden fazla kullanıcı için kullanılabilir, ‘ErisebilirMi’ sütunuda zaten primary key olması söz konusu değil, bu tablo KullanıcıNo ve Yetki tablosunun birbirine bağlayan bir tablodur. Veritabanı kısmı tasarımımız bittikden sonra şimdi uygulamamızı tasarlayalım.

‘Kullanıcı Adı’ ve ‘Şifre’ soran basit bir form tasarımı hazırladık. Tüm menüler deaktif, kullanıcı şifre girmeye başladığı zaman ‘Tamam’ butonuda aktif olacak şekilde hazırladık. Şimdi veritabanına birkaç kullanıcı, yetki ve izin ekleyelim.

Yukarıda bazı yetki’ler, kullanıcılar ve izin’ler belirledik, kullanıcıya göre yetki verdik. Şimdi farklı kullanıcılarla giriş yapalım ve bakalım uygulamamızda doğru yerler aktif oluyor mu. Murat kullanıcısının sadece ‘Stok Gir’ ve ‘Stok Çık’ yetkisi verdik, Burak kullanıcısına bu yetkileri vermedik, sadece ‘Admin’ ve ‘Ürün Hazırlama’ yetkisi verdik.

Formumuzdan ‘Murat Özkan’ kullanıcı adı ile giriş yapıldığında;

‘Burak Özkan’ kullanıcı adı ile giriş yaptığında;

Farklı kullanıcı girişlerinde farklı yerler aktif oldu, peki bunu nasıl yaptık? İşin kod kısmını biraz inceleyelim. Önce ‘Tamam’ butonunun ‘Click’ eventinde olanları yazalım;

private void button1_Click(object sender, EventArgs e)
{
   if (kullaniciAdi_tb.Text == "")
   {
      MessageBox.Show("Lütfen Kullanıcı Seçiniz.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return;
   } 

   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
   cnn.Open();
   DataSet ds = new DataSet();
   SqlDataAdapter sda = new SqlDataAdapter("select * from Kullanicilar where KullaniciAdi = '" + kullaniciAdi_tb.Text + "'", cnn);
   sda.Fill(ds); 

   if (ds.Tables.Count == 0)
   {
      MessageBox.Show("Geçersiz Kullanıcı.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return;
   }

   KullaniciAdi = ds.Tables[0].Rows[0][2].ToString();
   KullaniciNo = (int)ds.Tables[0].Rows[0][0];
   string sifre = ds.Tables[0].Rows[0][1].ToString();
   KullaniciSifre = sifre;

   if (sifre == sifre_tb.Text)
   {
      MessageBox.Show("Hoşgeldiniz ", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Information);
   }
   else
   {
      MessageBox.Show("Geçersiz Şifre", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return;
   }

   if (YetkileriniYukle() != true) { return; }

   stokCik_tsmi.Enabled = YetkiDizisi[3];
   stokGir_tsmi.Enabled = YetkiDizisi[2];
   urunHazirla_tsmi.Enabled = YetkiDizisi[5];
   yetkilendirmeAyarlari_tsmi.Enabled = YetkiDizisi[0];
   kullaniciEkle_tsmi.Enabled = YetkiDizisi[0];

   menuStrip1.Enabled = true;
}

Kod’u incelediğimizde veritabanı’nın ‘Kullanıcı’ tablosundan ‘Kullanıcı Adı’na göre şifresini alıyoruz ve girilen şifreyle karşılaştırıyoruz. Eğer şifre doğruysa yetkilerini yüklüyoruz aksi durumda hata verip hiçbir menüyü aktif etmeden fonksiyonu bitiriyoruz. Şimdi ‘YetkileriniYukle()’ fonksiyonunu inceleyelim;

private bool YetkileriniYukle()
{
   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString; cnn.Open();

   DataSet ds = new DataSet();
   SqlDataAdapter sda = new SqlDataAdapter("select YetkiNo, ErisebilirMi from Izin where KullaniciNo = '" + KullaniciNo + "'", cnn);
   sda.Fill(ds);

   if ((ds.Tables.Count == 0))
   {
      MessageBox.Show("Yetkiler Yüklenemiyor.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return false;
   }

   for (int i = 0; i < ds.Tables[0].Rows.Count; ++i)
   {
      int yetkiIndis = (int)ds.Tables[0].Rows[i][0];
      YetkiDizisi[yetkiIndis] = (bool)ds.Tables[0].Rows[i][1];
   }
   return true;
}

Bu fonksiyonda da KullaniciNo’ya göre Izin tablosundan yetkileri aldık, bir tane global YetkiDizi’miz var, veritabanından verdiğimiz yetkilere göre YetkiDizi’si dolduruluyor, yetkiIndis’de sıralı olmayacağı için Izın tablosundanki YetkiNo’ya göre dolduruluyor böylece programda ki indis’le veritabanında ki YetkiNo aynı olmuş oluyor. Son olarakda kullanıcı ekleme, silme, şifre değiştirme ve kullanıcının yetkilerini belirleme kısmını yapalım;

Yukarıdaki şekilde form’larımızı tasarladık, bu işlemleri yapmak için ‘Stored Procedure’ kullanacağız. Ilk olarak Kullanıcı Sil formunu inceleyelim;

Form’un Load kısmı ve button1_Click event’i şöyle;

private void KullaniciSil_Load(object sender, EventArgs e)
{
   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString;cnn.Open();

   DataSet ds = new DataSet();SqlDataAdapter sda = new SqlDataAdapter("select * from Kullanicilar", cnn);
   sda.Fill(ds);

   if (ds.Tables.Count == 0)
   {
      MessageBox.Show("Kullanıcılar Yüklenemiyor.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return;
   }

   for (int i = 0; i < ds.Tables[0].Rows.Count; ++i)
   { listBox1.Items.Add(ds.Tables[0].Rows[i][2].ToString()); }
}

private void button1_Click(object sender, EventArgs e)
{
   if (MessageBox.Show("Kullanıcı Kaydı Silinme İşlemini Onaylıyormusunuz?", "Otomasyon", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes)
   {
      MessageBox.Show("Silme İşlemi İptal Edildi", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Information);
      return;
   }

   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString;cnn.Open();
   SqlCommand cmd = new SqlCommand();

   cmd.Connection = cnn;
   cmd.CommandText = "[up_KullaniciSil]";
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("@KullaniciNo", listBox1.SelectedIndex + 1);
   try
   {
      cmd.ExecuteNonQuery();
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
      return;
   }
   MessageBox.Show("Kullanıcı Başarıyla Silindi", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Information);
   this.Close();
}

Form ilk açıldığında Kullanıcılar veritabanından yükleniyor, ‘Kullanıcı Sil’ butonunda SQL Serverda hazırladığımız ‘@KullanıcıNo’ parametresi alan stored procedure çağırıyoruz;

Stored Procedure;

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[up_KullaniciSil]@KullaniciNo intasbeginbegin tran

begin try delete from Izin where KullaniciNo = @KullaniciNo end try begin catch rollback tran return end catch

begin try delete from Kullanicilar where KullaniciNo = @KullaniciNo end try begin catch rollback tran return end catch

commit tran end

Yetkilendirme ayarları formunu belirlediğimiz yetkilerin isimlerine sahip olan checkBox ekliyoruz. FormLoad kısmında yine kullanıcıları yüklüyoruz, seçilen kullanıcıların yetkileri seçilmiş oluyor. FormLoad ve ‘UYGULA’ butonun kod kısmı aşağıdaki gibi;

private static CheckBox[] cbDizi = new CheckBox[7];
public string KullaniciAdi;
public int KullaniciNo;
private DataSet dsKullanicilar;

private void YetkilendirmeAyarlari_Load(object sender, EventArgs e)
{
   cbDizi[0] = Yetki0;
   cbDizi[1] = Yetki1;
   cbDizi[2] = Yetki2;
   cbDizi[3] = Yetki3;
   cbDizi[4] = Yetki5;
   cbDizi[5] = Yetki6;
   cbDizi[6] = Yetki13;

   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
   cnn.Open();

   dsKullanicilar = new DataSet();
   SqlDataAdapter sda = new SqlDataAdapter("select * from Kullanicilar", cnn);
   sda.Fill(dsKullanicilar);

   if (dsKullanicilar.Tables.Count == 0)
   {
      MessageBox.Show("Kullanıcılar Yüklenemiyor.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return;
   } 

   for (int i = 0; i < dsKullanicilar.Tables[0].Rows.Count; ++i)
   { comboBox1.Items.Add(dsKullanicilar.Tables[0].Rows[i][2].ToString()); }
}

private void button1_Click(object sender, EventArgs e)
{
   if (MessageBox.Show("Yetkileri Değiştirmek İstediğinize Eminmisiniz?", "Otomasyon", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes)
   { return; }

   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
   cnn.Open();
   SqlCommand cmd = new SqlCommand();

   cmd.Connection = cnn;
   cmd.CommandText = "up_KullaniciYetkiDegistir";
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("@KullaniciNo", KullaniciNo);
   cmd.Parameters.AddWithValue("@Yetki0",  Yetki0.Checked);
   cmd.Parameters.AddWithValue("@Yetki1",  Yetki1.Checked);
   cmd.Parameters.AddWithValue("@Yetki2",  Yetki2.Checked);
   cmd.Parameters.AddWithValue("@Yetki3",  Yetki3.Checked);
   cmd.Parameters.AddWithValue("@Yetki5",  Yetki5.Checked);
   cmd.Parameters.AddWithValue("@Yetki6",  Yetki6.Checked);
   cmd.Parameters.AddWithValue("@Yetki13", Yetki13.Checked);

   try
   {
      cmd.ExecuteNonQuery();
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
      return;
   }
   MessageBox.Show("Yetkiler Başarıyla Değiştirildi.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
   cnn.Open();

   for (int i = 0; i < dsKullanicilar.Tables[0].Rows.Count; ++i)
   {
      if ((string)dsKullanicilar.Tables[0].Rows[i][2] == comboBox1.Text)
      { KullaniciNo = (int)dsKullanicilar.Tables[0].Rows[i][0]; }
   }

   DataSet ds = new DataSet();
   SqlDataAdapter sda = new SqlDataAdapter("select YetkiNo, ErisebilirMi from Izin where KullaniciNo = '" + KullaniciNo + "'", cnn);
   sda.Fill(ds);

   if ((ds.Tables.Count == 0))
   {
      MessageBox.Show("Yetkiler Yüklenemiyor.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return;
   }

   for (int i = 0; i < ds.Tables[0].Rows.Count; ++i)
   {
      int yetkiIndis = (int)ds.Tables[0].Rows[i][0];
      cbDizi[yetkiIndis].Checked = (bool)ds.Tables[0].Rows[i][1];
   }
}

Her kullanıcı için cbDizi setleniyor. cbDizi, chechBox’lardan oluşan bir dizi ve veritabanımızdaki YetkiNo ile aynı indis’e sahip.

Stored Procedure;

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[up_KullaniciYetkiDegistir]
@KullaniciNo int,
@Yetki0 int,
@Yetki1 int,
@Yetki2 int,
@Yetki3 int,
@Yetki4 int,
@Yetki5 int,
@Yetki6 int,

as begin 

update Izin set ErisebilirMi = @Yetki0 where KullaniciNo = @KullaniciNo and YetkiNo = 0
update Izin set ErisebilirMi = @Yetki1 where KullaniciNo = @KullaniciNo and YetkiNo = 1
update Izin set ErisebilirMi = @Yetki2 where KullaniciNo = @KullaniciNo and YetkiNo = 2
update Izin set ErisebilirMi = @Yetki3 where KullaniciNo = @KullaniciNo and YetkiNo = 3
update Izin set ErisebilirMi = @Yetki4 where KullaniciNo = @KullaniciNo and YetkiNo = 4
update Izin set ErisebilirMi = @Yetki5 where KullaniciNo = @KullaniciNo and YetkiNo = 5
update Izin set ErisebilirMi = @Yetki6 where KullaniciNo = @KullaniciNo and YetkiNo = 6 
end

Kullanıcı şifresini değiştirmek isteyebilir, bunun için ana form’dan giriş yaptıkdan sonra aşağıdaki işlemle kendi şifresini değiştirebilir. ‘DEĞİŞTİR’ butonuna basıldıkdan sonra yapılan işlemler aşağıdaki gibi;

private void button1_Click(object sender, EventArgs e)
{
   if ((eskiSifre_tb.Text == "") || (yeniSifre_tb.Text == ""))
   {
      MessageBox.Show("Lütfen Eski ve Yeni Şifrenizi Giriniz", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return;
   }

   if (eskiSifre_tb.Text != KullaniciSifre)
   {
      MessageBox.Show("Eski Şifrenizi Lütfen Doğru Giriniz", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
      return;
   }

   if (MessageBox.Show("Şifre Değişikliğini Onaylıyormusunuz?", "Otomasyon", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes)
   { return; }

   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
   cnn.Open();
   SqlCommand cmd = new SqlCommand();

   cmd.Connection = cnn;
   cmd.CommandText = "up_KullaniciSifreDegistir";
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("@KullaniciAdi", KullaniciAdi);
   cmd.Parameters.AddWithValue("@KullaniciSifre", yeniSifre_tb.Text); 

   try
   {
      cmd.ExecuteNonQuery();
   }
   catch (Exception ex)
   { MessageBox.Show(ex.Message); return; }

   MessageBox.Show("Şifre Başarıyla Değiştirildi", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

Burada eski şifreyi nasıl karşılaştırdığımızı sorabilirsiniz, bu form’da bir tane string türünden public ‘KullaniciAdi’ ve ‘KullaniciSifre’ tanımlıyoruz. Bu form’u ilk ana form’da çağırdığımız için kullanıcının adını ve şifresini zaten biliyoruz.

Stored Procedure;

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO

ALTER proc [dbo].[up_KullaniciSifreDegistir]
@KullaniciAdi varchar(50),
@KullaniciSifre varchar(50)

as begin
update Kullanicilar set KullaniciSifre = @KullaniciSifre where KullaniciAdi = @KullaniciAdi
end

Son olarak admin yetkisine sahip olan kişinin kullanıcı ekleme işlemine geldi. Ben burada yeni kullanıcılar için şifreyi sabit ‘otomasyon’ olarak belirledim. Yeni kullanıcı ilk kez girdikden sonra şifresini değiştirebilir, admin de kullanıcının yetkilerini sonradan belirler.’Kullanıcı Ekle’ butonuna basılınca yapılan işlem;

private void button1_Click(object sender, EventArgs e)
{
   if (kullaniciAdi_tb.Text == "")
   { MessageBox.Show("Lütfen Bir Kullanıcı İsmi Giriniz!", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }

   if (MessageBox.Show("Yeni Kullanıcı Kaydını Onaylıyormusunuz?", "Otomasyon", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes)
   { return; }

   SqlConnection cnn = new SqlConnection();
   cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
   cnn.Open();
   SqlCommand cmd = new SqlCommand();

   cmd.Connection = cnn;
   cmd.CommandText = "up_KullaniciEkle";
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("@KullaniciAdi", kullaniciAdi_tb.Text);
   cmd.Parameters.AddWithValue("@KullaniciSifre", sifre_tb.Text); 

   try
   {
      cmd.ExecuteNonQuery();
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
      return;
   }
   MessageBox.Show("Yeni Kullanıcı Başarıyla Eklendi", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

Yine SQL Server’da tanımlamış olduğumuz bir stored procedure çağırarak kullanıcı ekliyoruz.

Stored Procedure;

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[up_KullaniciEkle]
@KullaniciAdi varchar(50),
@KullaniciSifre varchar(50)
as begin
   declare @KullaniciNo varchar(30);
   set @KullaniciNo = ((select Count(*) from Kullanicilar) + 1)
   insert into Kullanicilar values(@KullaniciNo, @KullaniciSifre, @KullaniciAdi)
end

Genel olarak Login form tasarımı bu şekilde elbette üstüne birkaç özellik daha koyarak geliştirilebilir. Umarım sizlere faydalı olur. Başka bir makalede görüşmek üzere.

Kolay gelsin iyi çalışmalar…

C#.Net’de ‘Stored Procedure’ çalıştırma

Okul, İş, Kurs derken sitemi çok boşladım. Şu anda C ve Sistem Programcıları derneğinde ‘MS-Sql Server ve Oracle’ Programlama dersi alıyorum. O kursla beraber güzel bir otomasyon programı çalışmalarımda sürüyor. Sizinlerinde işinize yarayacağını düşündüğüm ufak bir kod parcası vermek istedim. Aşağıdaki kod Ms-Sql Server’da yaptığım bir Stored Procedure çalıştırıyor. Stored Procedure nedir? diye soranlaırnız mutlaka vardır. Bu sorunun cevabını burada vermeyeceğim. Çok kısa bir zaman sonra Ms-Sql Server ile ilgili daha çok makale bulabileceksiniz.

SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Properties.Settings.Default.ZedBULLConnectionString;
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = “up_DistributorEkle”;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@DistributorNo”, 2);
cmd.Parameters.AddWithValue(“@DistributorAdi”,distributorAdi.Text);

try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}

Kod parçasını kısaca açıklamak gerekirse, SqlCommand’ın CommandText’ine yazdığımız stored procedure’un ismini cmd.Parameters.AddWithValue ile yazdığınız procedure’un adını ve ona verdiğiniz değeri giriyorsunuz. Son olarak da cmd.ExecuteNonQuery diyerek stored procedure çalıştırıyorsunuz.

Setup dosyası yapma!

Arkadaşlar, yaptığımız bir projenin setup dosyasını (.msi ve .exe) nasıl oluşturacağız? Bu makalede bu soruya cevap vereceğiz.

Piyasa birçok installer mevcut fakat biz bu makalede Visual Studio’nun kendi Setup Projesini kullanacağız. Başka bir makalede diğer installer’larıda inceleyeceğiz. Visual Studio’da setup dosyası oluşturmak için öncelikle Visual studio’dan Projenin ‘solution’ kısmına sağ tıklayıp ‘Add->New Project”e tıklıyoruz. Açılan pencerede Other Project Types->Setup and Deployment kısmından ‘Setup Project’i seçiyoruz. Aşağıdaki gibi bir pencere elde etmemiz lazım.
Şimdi açılan bu penceredeki özellikleri biraz tanıyalım.
Application Folder: Programın kurulan dizininde olması gereken dosyaları buraya ekliyoruz. Eğer uygulamanızda dll kullanıyorsanız, veritabanı işlemi yaptıysanız yani yazılımızda exe’nin yanında olmasını istediğiniz bir dosya varsa buraya eklemelisiniz aksi halde program açıldığı anda çöker. Programın exe’side bu bölümde olmak zorunda. Eklemek için sağ taraftaki kısıma sağ tıklayıp ‘Add->File’ deyip ardından programınızın exe’sini seçin. Eğer bir dll kullanıyorsanız otomatik olarak eklenecektir.
User’s Desktop: Bu klasör’e, masaüstünde programınızın kısayol’unu gözükmesini istiyorsanız koyabilirsiniz. Bunu yapmak için sağ taraftaki bölüme gelip sağ tıklayın ve ‘Create New Shortcut”a tıklayın ardından açılan pencereden ‘Application Folder’ da bulunan exe’yi seçin ve masaüstünde programınızın isminin nasıl gözükmesini istiyorsanız yazın.
User’s Programs Menu: Başlat menüsünde programınızın kısayolunu koymak için bu klasör’e de bir exe koymalısınız.
Setup dosyasının özelliklerini biraz inceleyelim şimdide. Setup projenizin özelliklerini aşağıdaki pencereden isteğinize göre değiştirebilirsiniz.
AddRemoveProgramsIcon: ‘Program Ekle veya Kaldır’ kısmında programızın yaptığınız bir icon ile gözükmesini istiyorsanız buraya bir icon ekleyebilirsiniz.
Author: Buraya kendi isminizi yazın :).
DetectNewerInstalledVersion: Kullanıcılarınız’ın, programınızın hem eski hem de yeni versiyonunu aynı anda kullanmasını istiyorsanız ‘false’ yapın.
Manufacturer: Programızın yapımcı’sının ismini buraya yazınız. Buraya yazdığınız isim aynı zaman’da Program Files klasörünün altında oluşturulacak klasör’ün de ismi.
ProductName: Programınızın ismini buraya yazın.
RemovePreviousVersiyon: Yeni versiyon çıkardığınız da, eskilerinin silinmesini isterseniz bu kısmı ‘true’ yapabilirsiniz.
Properties kısmını da inceledikten sonra ufak bir kaç detay verelim. Setup Projeniz’i bu haliyle derlerseniz Debug klasörünün altında iki tane (.msi ve .exe) dosyası bulacaksınız. Bu dosyalar framework kontrol’ü yapmazlar. Bildiğiniz gibi Visual Studio ile yazdığınız programlar’ı çalıştırmanız için, programı çalıştıran makinada framework olmak zorunda. Şimdi aşağıdaki adımları takip ederek setup dosyanızın framework kontrol’u yapmasını eğer kullanıcı da framework yoksa kurulmasını sağlayalım;
Setup Projesine sağ tıklayıp ‘Properties’ tıklayınız. Açılan pencerede ‘Prerequisite’ butonuna basın. Aşağıdaki gibi bir pencere karşınıza çıkmış olması lazım.

Resimde de gördüğünüz gibi burada, programımızda yüklü olmasını istediğimiz programların bir listesi çıktı. Biz buradan hangi framework versiyonunu kullanıyorsak onu seçmeliyiz. Derlediğimiz zaman setup projesinin yanına framework’unde eklendiğini göreceksiniz. Resimde dikkat çekmek istediğim bir diğer nokta, bu framework yoksa nereden sorgulatacağımız? Bunun için üç tane seçeneğimiz var;
1-)Web sitesinden. (Birinci seçenek)
2-)Setup dosyasının exe’sinin yanından. (İkinci seçenek)
3-)Belirlediğimiz bir dosya yolunda. (Üçüncü seçenek)

Buradan hangisi sizin için uygunsa seçebilirsiniz. Setup projemizi derleyip .msi ve .exe uzantılı dosyaları kullanıcılarımıza verip kullanabilirler.

Başka bir makalede görüşmek üzere.

Komut satırı argüman alan program nasıl debug edilir!

Arkadaşlar komut satırından argüman alan, dos ortamında çalışan bir programınız var ve sizin debug etmeniz gerekiyor. Malum diğer programlar gibi debug işlemini yapamıyoruz. Dos ekranında bir veri girmemiz lazım, debug işlemine başlayınca da direk Main fonksiyonundan başlıyor. Bu durum da ne yapacağız?

Tabi ki Visual Studio’nun nimetlerinden yararlanacağız :),

Project->Properties->Configuration Properties->Debugging->Command Argument

buraya komut satırı argümanımızı yazıp debug işlemini başlattığımız zaman, komut satırından girdiğimiz komut’la debug işlemine devam edebiliriz.

Başka bir makalede görüşmek üzere….

C#’da hex2string ve string2hex işlemleri!

C’den C#’a geçerken en çok ihtiyacım olan birşeydi bu converterlar. Çalışmalarımda sürekli hex bir sayıyı (0xFC) string’e (“FC”) çevirme ihtiyacı duyuyordum. C#’ın geniş kütüphanesi sayesinde, bu problem tek satırla çözülebiliyor.

Diyelimki elinizde hex bir sayi var.
byte temp = 0xFC; gibi.


Bunu string’e çevirmek için yapmamız gereken tek şey;
string tempS = temp.ToString(“X2”); //—>>> tempS = “FC”; oldu.

.ToString(“X2”); buradaki X string’e çevirilecek sayının hexadecimal olduğunu belirtiyor. Bu “X2” yazmasaydık tempS’de 0xFC’nin decimal karşılığı olan “252” olacaktı.

“X2” buradaki 2’nin anlamı eğer sayımız 0x8 ise string’e çevrilirken bu sayının başına sıfır koyuluyor. Yani;
string tempS = 0x8.ToString(“X2”); //—>>> tempS = “08”; oldu.
hex2string işlemi bu kadar.

Şimdide tam tersi olan string2hex işlemini gerçekleştirelim. Bu da C#’da veri türlerinin Parse fonksiyonları ile çok kolaylıkla yapılabilmektedir.

Şöyle ki;
uint temp = uint.Parse(“08FC3E”, System.Globalization.NumberStyles.HexNumber); //—>>> temp = 0x08fc3e oldu.

Görüldüğü gibi burada da string bir veriyi hex sayıya çevirebildik. Yine aynı şekilde Parse fonksiyonunun 2. parametresi NumberStyles.HexNumber’ NumberStyles property’sinden HexNumber seçilmelidir. Aksi halde string içinde “FC” gibi bir parametre gelirse Exception oluşur.

Başka bir makalede görüşmek üzere….

 Scroll to top