Hayırlı günler,
SQL Server ile ilgili ilk dökümanım, bu dökümanda SQL Server ile C# bağlantısı nasıl yapılır ona göstereceğim. Ayırca DataSet gibi hantal bir yapıdan nasıl kurtulucaz onu da göstereceğim inş
Üzerinde çalışacağımız SQL Server örnek veritabanını buradan (Veritabanı yedeğidir, SQL Server Management Studio 2008 ile aldığım yedektir.) indiriniz. [projeyi yazının altından indirebilirsiniz.]
MakaleUygulama adında veritabanına sahip olduğunuzu varsayıyorum;
Amacımız veritabanında Kategoriler tablosunda bulunan tüm kategorileri getirmek olsun.
Form’un Load olayında bağlantımızı gerçekleştiriyoruz;
// bu iki fieldi dışarda tanımlamamız gerekiyor, ileride ikisine ulaşmak zorunda kalabiliriz.
SqlConnection con;
SqlCommand cmd;
private void Form1_Load(object sender, EventArgs e)
{
//yerel pc de çalıştığımız için Integrated Security i true yapmamız gerekiyor, eğer uzak pc e bağlansaydık bunun yerine K.adı ve şifre girmek zorunda kalacaktık.
con = new SqlConnection("Data Source=localhost;Initial Catalog=MakaleUygulama;Integrated Security=true");
cmd = new SqlCommand("Select KatID,KatAdi from Kategoriler", con);
}
Sql Server connection stringine göz atalım, Data Source localhost dedik çünkü yerel bilgisayarda çalışıyoruz, Initial Catalog yerine veritabanı adını yazıyoruz. Integrated Security de üst tarafta yazdığım gibidir.
DataSet’ten kurtulmaktan bahsettim, nasıl kurtulacağımızı görelim şimdi ;
Önce şöyle bir class oluşturalım ;
using System;
namespace OrnekUygulama
{
class KategoriInfo
{
int katID;
public int KatID
{
get { return katID; }
set { katID = value; }
}
string katAdi;
public string KatAdi
{
get { return katAdi; }
set { katAdi = value; }
}
public KategoriInfo(int katIDs,string katAdi)
{
this.KatAdi = katAdi;
this.KatID = katID;
}
}
}
DataSet kullansaydık tüm bilgilerimizi DataSet yapısında kaydedicektik, ama biz o hantal yapıyı değil, kendi oluşturduğumuz bir class da bize gerekli tüm bilgileri saklayacağız. Ufa çaplı projelerde göze çarpmaz ancak büyük çaplı projelerde DataSet performanslı değildir.
Daha sonra Kategorileri Getir butonunu click olayına şu kodları yazalım ;
private void btnGetCat_Click(object sender, EventArgs e)
{
con.Open();
List<KategoriInfo> listem = new List<KategoriInfo>();
SqlDataReader dr=cmd.ExecuteReader();
while (dr.Read())
{
KategoriInfo info = new KategoriInfo(dr.GetInt32(0), dr.GetString(1));
listem.Add(info);
}
listBoxKategori.DataSource = listem;
listBoxKategori.DisplayMember = "KatAdi";
listBoxKategori.ValueMember = "KatID";
con.Close();
}
con.Open(); ile bağlantımızı açtık.
5.Satırda ise List de KategoriInfo cinsinden değerlerin saklanabileceğini belirttik. (bunun nedenini hemen altta öğrenecekcesiniz)
7. Satırda DataReader’e hangi command nesnesini çalıştıracağını belirttik.
Döngü açtık, neden ?
Çünkü DataReader, DataSet gibi tüm bilgileri saklı tutmaz, satır satır çalıştığı için, tek seferde tek satır getirebilir. Kaç kategorimiz var ? 2 o zaman bu döngü 2 defa dönecek, peki nasıl ?
Veritabanından çekilecek bir kayıt varsa Read metodu true değerini döndürür, eğer yoksa false değerini döndürür, yani her seferinde bir kontrol gerçekleşiyor.
10.satırda ne yaptık ?
Burada dr nesnesiyle mevcut satırda (datareader in satır satır çalıştığını söylemiştik) bulunan değerlerini alıp, oluşturduğumuz sınıfın property lerine atıyoruz, constructor da.
dr.GetValue ile de bütün değerleri alabiliyoruz ancak object türünde değer döndürdüğü için casting işlemine tabi tutulması gerekiyor, bu da performans kaybı olacağından biz gelecek verinin türünü belirtip veriyi çekiyoruz.
dr.GetInt32(0); ile gelecek verinin int32 türünde olduğunu belirtiyor ve aldığı 0 parametresi nedir peki ? O da gelecek tabloda 0.kolondaki veriyi belirtiyor. Biz sorgumuzda select KatID,KatAdi from Kategoriler diye oluşturduk. 0.kolon nedir? KatId.
dr.GetString(1); ile gelecek verinin string türünde olduğunu belirttik ve 1. kolondaki veriyi almasını istedik.
11.satır
Biz oluşturduğumuz List ile sadece KategoriInfo türünde değerleri almasını söyledik. Burada da Add metodu ile info nesnemizi List e ekliyoruz. (List Nedir ?)
Döngüden çıktık, verilerimizin hepsi nerede saklandı ? Oluşturduğumuz List olan listem de verilerimizin tümü saklı durumda.
dr nesnemizde ne saklı peki ? Hiçbirşey saklı değil, çünkü dataset gibi çalışmaz sadece, satır satır veri çeker veritabanından.
14.satır
Biz bir datatable i datasource olarak tanımlayabiliyorduk, peki 14.satırda nasıl olurda bir List i datasource olarak tanımlayabiliyoruz ?
Cevabı şurda ; List in üzerine sağ tuşla basıp “Go to defination” diyip metadata sına bakalım. IList interface inden türemiş, IList arayüzünden türeyen herşey datasource olarak kullanılabilir.
Yani şöyle diyebiliriz; Biz dataset kullanmayarak, kendi ihtiyaçlarımızı karşılayan bir dataset yazdık. (Tabi ki dataset yazmadık, çünkü bizim oluşturuduğumuz yapı ile dataset karşılaştırılırsa, KategoriInfo sınıfı datatable ile özdeşleştirilebilir, çünkü dataset yapısı datatable ıda içine alan bir yapıdır.)
15 & 16.satırda
DisplayMember olarak “KatAdi”, ValueMember olarak “KatID” i tanılmadık.
Biz kendi kendi datatable mizi oluşturmuştuk zaten, Burada da oluşturduğumuz List de bulunan; KatAdi property sinin gösterilecek öğe olarak, KatID property sinin ise value(değer) elemanı olarak algılanmasını belirttik.
Programı çalıştırıp Kategoriyi göster butonuna bastığımızda kategorilerimizin geldiğini görüyoruz.
Döküman ağır gelmiş olabilir arkadaşlar, anlamadıysanız 2 defa okumanızı tavsiye ederim. Karmaşık gelebilir ama basit bir yapı. Bol bol pratik yapmanızı öneririm.
C# Sql Server Örnek Proje
asp.nette c# kullanarak sql server bağlantısı oluşturmam lazım ama yapamıyorum yardımcı olursanız cok sevinirim
Asp.NET’de basit
< %
%>
Blokları arasına bağlantı kodlarınızı yazıp aynı bağlantıyı yapabiliyorsunuz. (Source bölümünde)
Diğer türlü ise page_load eventi içerisine yukarıdaki kodu gene kullanabilirsiniz.
Bu değerli paylaşımınız ve aynı değerde ki emeğiniz için çok teşekkür ederim henüz bu bağlantıları görmedik ama ödevim vardı hazırlık amaçlı çok iyi oldu faydasını gördüm teşekkürler.
Teşekkür ederim.
Teşekkürler anlatım için…
“Sql Server connection stringine göz atalım, Data Source localhost dedik çünkü yerel bilgisayarda çalışıyoruz” demişsiniz ya ben başka bir bilgisayarın içindeki veri tabanından bilgi çekmek istersem Data Source kısmına IP adresini yazmam yeterli midir?
IP adresi ile beraber kullanıcı adı ve şifreyide girmek zorundasınız. Yoksa bağlantı sağlayamazsınız. Alttaki connection stringi kullanabilirsiniz.
Data Source=IPAdresi;Initial Catalog=MakaleUygulama; ID=KullaniciAdi; Password=Sifre; Integrated Security=true;