SqlConnection Sınıfı

MSSQL Server üzerinde bağlantı açmak ve kapatmak için kullanılan sınıftır.

SqlConnection Sınıfı Özellikleri

                 1- ConnectionString: Projemize bağlantı kuracağımız SQL Server'ın bağlantı bilgilerini girmemizi sağlar.string veri tipinden get veya set edilebilir.

Bağlantı bilgilerini girmemiz için ise bağlantı cümlesi oluşturmamız gerek. Bağlantı cümlesi, veri kaynağına bağlanmak için gerekli bilgileri tutar. Bu cümle, veri kaynağına bağlantı kurmak için gerekli bağlantı parametrelerin birleşiminden oluşur.

Bu bağlantı parametre öğeler aşağıdaki gibidir:

                         1- Data Source veya Server : Bağlantı yapılacak SQL Server servisinin (instanceadını veya bilgisayarın adı veya IP adresini belirtiriz.

                         2- Initial Catalog veya Database : Bağlanılacak veritabanı adı.

                         3- User Id veya uid : SQL Server login (giriş) adı.

                         4- Password veya pwd : SQL Server login (giriş) parolası.

NOT: Yukarıdaki dört bağlantı parametrelerini kullanarak SQL Server Authentication / SQL Server Kimlik Doğrulamasıyöntemi ile bağlantı cümlesi oluşturup veritabanımıza bağlantı oluşturabiliriz.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Data Source = USER; Initial Catalog = DBUrunler; User Id = mertertugrul; Password = 123456;"// SQL Server Authentication ile bağlanıyoruz.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Data Source = USER; Database = DBUrunler; User Id = mertertugrul; Password = 123456;"// SQL Server Authentication ile bağlanıyoruz.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Server = USER; Initial Catalog = DBUrunler; User Id = mertertugrul; Password = 123456;"// SQL Server Authentication ile bağlanıyoruz.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Server = USER; Database = DBUrunler; User Id = mertertugrul; Password = 123456;";// SQL Server Authentication ile bağlanıyoruz.

NOT: Yukarıdaki örneklerde Data Source / Server kısmına bağlantı yapılacak SQL Server servisinin adını yazdık (USER).

localhost yazsak yine USER adlı SQL Server servisine bağlanacaktır.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Data Source = localhost; Database = DBUrunler; User Id = mertertugrul; Password = 123456;"// SQL Server Authentication ile bağlanıyoruz.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Server = localhost; Database = DBUrunler; User Id = mertertugrul; Password = 123456;"// SQL Server Authentication ile bağlanıyoruz.

NOT: Yukarıdaki örneklerde Data Source / Server kısmına bağlantı yapılacak SQL Server servisinin adını yazdık (USER / localhost.). Sadece nokta (.) işareti koyarsak da yine USER adlı SQL Server servisine bağlanacaktır.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Data Source = .; Database = USER; User Id = mertertugrul; Password = 123456;"// SQL Server Authentication ile bağlanıyoruz.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Server = .; Database = USER; User Id = mertertugrul; Password = 123456;"// SQL Server Authentication ile bağlanıyoruz.

                         5- Integrated Security veya Trusted_Connection SQL sunucusuna Windows Hesabı ile bağlantı yapılacağını belirtir. Integrated Security seçeneğini kullanacaksak truefalse veya SSPI değerleri girilebilir. SSPI ,true ile eş anlamlıdır. Trusted_Connection seçeneğini kullanacaksak ise bu kez de ya YES ya da NO değerleri girilebilir ve bu durumda Windows Hesabı kullanılır.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Data Source = USER; Initial Catalog = exampleDB; Integrated Security = true;"// Windows Authentication ile bağlanıyoruz.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Data Source = localhost; Initial Catalog = exampleDB; Integrated Security = SSPI;";// Windows Authentication ile bağlanıyoruz.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Data Source = localhost; Initial Catalog = exampleDB; Trusted_Connection = YES;";// Windows Authentication ile bağlanıyoruz.

                         6- Connection TimOut : Veritabanına bağlanırken zaman zaman server taraflı, zaman zaman client taraflı ya da diğer iletişim problemleri nedeniyle bağlantının sağlanamadığı durumlar gerçekleşir. Bu durumlar, programımızın ne kadar süre içinde veritabanına bağlanması gerektiğini hatta daha açık bir cümleyle… "Ne kadar sürede veritabanına bağlanamazsa hata verecegini " belirleriz. Varsayılan olarak değeri 15 saniye'dir. EğerConnectionString'de belirtmezsek 15 saniye olarak kabul edilir.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection();

                         sqlConn.ConnectionString = "Data Source = localhost; Initial Catalog = exampleDB; Trusted_Connection = YES; Connection TimeOut = 60"// Eğer veritabanı sunucusundan 60 saniye içinde cevap alınamazsa bağlantı iptal ediliyor.

                         7- Connection Lifetime: Açmış olduğumuz Connection’ın ne kadar süre aktif olacağını bu özellikle belirleriz.

                         8- Persist Secuirty Info : SQL Server’ın güvenlik bilgilerini uygulama tarafına geriye göndermesidir. Varsayılan olarak false değerine sahiptir.

                         9- Pooling: Database'e birkere bağlanıp verileri okuduktan ya da yazdıktan sonra database ile olan bağlantıyı ya biz sonlandırırız ya imleç connection nesnesinin etki alanindan çikinca otomatik olarak sonlandirilir ya da database ile belli bir süre işlem yapmayinca devreye garbage collectors girerek bağlantının sonlanmasını sağlar. Bu tip durumlarda aynı veritabanından aynı ya da daha fazla veriyi alırken kullanıcı performansın üst düzeyde olmasini hatta sanki bellekten okunuyormuş gibi olmasını ister. Pooling bu noktada devreye girer ve daha önce database’den alınmış olan verileri çok daha hızlı olarak tekrar istemciye gönderilmesini sağlar. İki farklı değer alabilir. true olursa aktif, false olursa pasiftir.

Dikkat etmemiz gereken nokta pooling yapısı aynı ConnectionString ile oluşan bağlantılar için geçerlidir.

ÖRN:

                         SqlConnection sqlConn = newSqlConnection("Server=.;Database=exampleDB;Integrated Security=SSPI;Pooling=true;");

                         9- Max Pool Size: Aynı bağlantı cümleleri için açılan havuzda, maksimum kaç tane bağlantının bulunabileceğini belirtir.

                         10- Min Pool Size: Aynı bağlantı cümleleri için açılan havuzda, minimum kaç tane bağlantının bulunabileceğini belirtir.

                         11- Packet Size: Performans açısından çok önemli bir kriter olan Packet Size, bağlantının kaç byte'lık paketler halinde veri iletişimi sağlayacağını belirtir. Default olarak değeri 8192 byte olup minimum değeri 512, maximum değeri: 32767 byte yani 32 kb’dir. Alacağımız verinin büyüklügüne göre seçecegimiz bu değer genellikle resim ya da benzeri büyük boyutlu içerikler için 32767 Text içerikler içinse daha düşük değerleri içermelidir.

ÖRN:

SqlConnection sqlConn = newSqlConnection("Data Source = USER; Database = exampleDB; Integrated Security = true; Packet Size = 15000;");

                                                  1.png

NOT: ConnectionString özelliğini kullanarak veritabanını projemize bağlayabildiğimiz gibi Visual Studio IDE'sini kullanarak da projemize veritabanımızı bağlayabiliriz.

İlk önce DataSources penceresini kullanarak yeni bir DataSource oluşturalım. Eğer DataSources penceresi görüntülenmiyorsa, View / Other Windows / Data Sources seçenekleri ile görüntüleyebilirsiniz. Bu pencerede kiAdd New DataSource simgesini tıklıyoruz.

                                                                     2.png

Gelen pencerede Database seçeneğini seçip Next button'una basalım.

                                                  3.png

Sonra DataSet simgesini seçerek Next button'unu tıklayalım.

                                              4.png

Aşağıdaki pencerede Microsoft SQL Server Database File seçeneğini seçerek Continue / OK buttonu'na tıklarız.

                                                 5.png

Gelen Add Connection penceresinde daha önce oluşturmuş olduğumuz exampleDB.accdb isimli SQL Server veritabanımızı seçiyoruz.

Eğer veritabanı için Kullanıcı Adı ve Şifre belirlemişsek; User name isimli metin kutusuna kullanıcı adı, Passwordisimli metin kutusuna ise veritabanı şifremizi bu bölümde gireriz. Girmemiz için ama SQL Server Authenticationyöntemini seçmemiz lazım.

                            

                                   6.png

Gelen pencerede daha önce oluşturmuş olduğumuz SQL Server veritabanımızın ismi hazır olarak eklenmiş olacaktır. Bu pencerede ConnectionString'in (veritabanı bağlantı cümlesi) otomatik olarak oluşturulduğunu görebilirsiniz.

                                              7.png   

Next button'unu tıkladığımızda veritabanının bir kopyasının local olarak projemize kopyalanıp kopyalanmamasına dair bir soru gelecektir. Evet button'una tıklayarak veritabanını projemize ekliyoruz.

                                                                                  8.png

Gelen pencerede ConnectionString ismini belirliyoruz.

                                               9.png

Gerekli ismi verip Next button'una tıkladığımızda, karşımıza DataSet içerisinde hangi tablo ve alanların kullanılacağının seçildiği bir pencere gelir. Burada kullanmak istediğimiz tablo ve alanları seçip, DataSet ismini belirleyerek Finish button'una basarak, veritabanı bağlama işlemini bitirmiş oluruz.

                                                                       

                                           10.png

Data Sources penceresi içerisine baktığımızda seçtiğimiz tabloların eklendiğini görebiliriz.

                                                                 11.png

NOT: Eğer veritabanı dosyası (.mdf vs....) elimizde varsa bilgisayarımızda da MSSQL yoksa (ya da başka veritabanı dosyasını açan herhangi bir veritabanı yönetim sistemi) o elimizde bulunan veritabanı dosyalarını projemizin bin/Debug kısmına atıyoruz. Daha sonra ise SqlConnection parametremize şu alttaki string parametreyi kodluyoruz:

@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename="+Application.StartupPath+"\\veritabanıIsmi.mdf;Integrated Security=True;Connect Timeout=30"

Application.StartupPath burada ki projemizin kısmını yol olarak belirtir. Daha sonra da \\veritabanıIsmi.mdf; diyerek veritabanımızın ismini ve dosya türünü belirterek geriye kalan yol parametresini de girmiş olduk.Application.StartupPath yerine elimizle de veritabanımınız bulunduğu parametre yolunu girebiliriz yani.

ÖRN:

              SqlConnection sqlConn = newSqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename="+Application.StartupPath+"\\exampleDB.mdf;Integrated Security=True;Connect Timeout=30");

sqlConn.Open();

Ama mutlaka veritabanı dosyalarımızı projemizin bin/Debug kısmına atmamız lazım. Atmazsak hata çıkacaktır.

                 2- ConnectionTimeout: Veritabanına bağlanırken zaman zaman server taraflı, zaman zaman client taraflı ya da diğer iletişim problemleri nedeniyle bağlantının sağlanamadığı durumlar gerçekleşir. Bu durumlar, programımızın ne kadar süre içinde veritabanına bağlanması gerektiğini hatta daha açık bir cümleyle… "Ne kadar sürede veritabanına bağlanamazsa hata verecegini " belirleriz. Varsayılan olarak değeri 15 saniye'dir. Eğer ConnectionString'de belirtmezsek 15 saniye olarak kabul edilir.

İşte bu belirlediğimiz süreyi öğrenmek istiyorsak bu özelliği kullanıcaz. int veri tipinden sadece get edilebilir.

ÖRN

                 SqlConnection sqlConn = newSqlConnection("Server = .; Database = exampleDB; Integrated Security = true; Pooling = true; Connection Timeout = 30; ");

                 privatevoid btnUygula_Click(object sender, EventArgs e)

                 {

                       int deger = sqlConn.ConnectionTimeout;

                       MessageBox.Show(deger.ToString());

                 }

Ekran Çıktısı:  12.png

Yukarıda da görüldüğü gibi bağlantı cümlesinde Connection Timeout'un 30 olduğunu belirttik ve bunuConnectionTimeout özelliği ile kontrol ettiğimizde 30 değerine ulaştık.

                 3CredentialVeritabanına bağlanmak için kurduğumuz bağlantı cümlesinde ki Kullanıcı Adı ve Şifre'nin ne olduğunu öğrenmek için kullanılan bir özelliktir. Yani bağlantı kuracağımız veritabanı'mızın kimlik bilgilerine bu özellik ile ulaşabiliriz. Aynı zaman da da Kullanıcı Adı ve Şifre'yi de belirleyebiliriz.

SqlCredential veri tipinden get veya set edilebilir.

Bu metodun User Id ve Password özellikleri string veri tipinden get edilebilir.

                                          13.png

ÖRN:

                 privatevoid btnUygula_Click(object sender, EventArgs e)

                 {

                        SqlConnection sqlConn = newSqlConnection("Data Source = USER; Database = exampleDB; User Id = mertertugrul; Password = 123456; ");

                       SqlCredential x = sqlConn.Credential;

                       MessageBox.Show("Veritabanın Kullanıcı Adı = " + x.UserId + " Şifre = " + x.Password);

                 }

                 4- Database: Bağlanacağımız database'nin adını string veri tipinden geriye döndürür. Sadece get edilebilir.

ÖRN:

                 SqlConnection sqlConn = newSqlConnection("Server = .; Database = exampleDB; Integrated Security = true; Pooling = true; Connection Timeout = 30; Persist Security Info = true; ");

                 privatevoid btnUygula_Click(object sender, EventArgs e)

                 {

                       MessageBox.Show(sqlConn.Database);

                 }

Ekran Çıktısı: 14.png

Yukarıda da görüldüğü gibi bağlantı cümlesinde Database'nin exampleDB olduğunu belirtmiştik ve bunu Databaseözelliği ile kontrol ettiğimizde exampleDB olduğuna ulaştık yine.

                 5- Data Source: Bağlanacağımız sunucu ismin (Data Source / Server) adını string veri tipinden geriye döndürürsadece get edilebilir.

ÖRN:

                 SqlConnection sqlConn = newSqlConnection("Data Source = USER; Database = exampleDB; Integrated Security = true; Pooling = true; Connection Timeout = 30; Persist Security Info = true; ");

                 privatevoid btnUygula_Click(object sender, EventArgs e)

                 {

                      MessageBox.Show(sqlConn.DataSource);

                 }

Ekran Çıktısı:   15.png

                 6- PacketSize: Bağlantı cümlesinde Packet Size' a verdiğimiz değeri öğrenmek için kullanılan bir özelliktir. intveri tipinden sadece get edilebilir.

ÖRN:

                 SqlConnection sqlConn = newSqlConnection("Data Source = USER; Database = exampleDB; Integrated Security = true; Packet Size = 15000;");

                 privatevoid btnUygula_Click(object sender, EventArgs e)

                 {

                        int deger = sqlConn.PacketSize;

                        MessageBox.Show(deger.ToString());

                 }

Ekran Çıktısı: 16.png

                 7- ServerVersion: Çalıştığımız database'nin versiyon'unu ögrenmemizi sağlar. Ama öğrenebilmek için veritaban'ına bağlanılıp bağlanılmadığı önemlidir. Ancak veritaban'ına bağlanılırsa öğrenebiliriz Database'nin versiyon bilgisini. string veri tipinden geriye döndürür sadece (sadece get edilebilir).

ÖRN:

                 SqlConnection sqlConn = newSqlConnection("Data Source = USER; Database = exampleDB; Integrated Security = true; Packet Size = 15000;");

                 privatevoid Form1_Load(object sender, EventArgs e)

                 {

                        sqlConn.Open(); // veritaban'a bağlan.

                 }

                 privatevoid btnUygula_Click(object sender, EventArgs e)

                 {

                        if(sqlConn.State == ConnectionState.Open)

                              MessageBox.Show("Database versiyon = " + sqlConn.ServerVersion);

                 }

Ekran Çıktısı:   17.png

                 8- State: Bağlantının durumunu öğrenebiliriz bu özellik ile. ConnectionState veri tipinden sadece getedilebilir.

ConnectionState veri tipinin de aldığı değerler vardır:

                                                            18.png

                                1- Broken: Belirtilen bağlantı daha önce Closed olmuş ve daha sonra tekrar açılmıştır.
                                2- Closed: Bağlantı kapalı durumdadır.
                                3- Connecting: Bağlantı kurulma aşamasındadır.

                                4- Executing: Bağlantı üzerinde o anda bir komut işlem görmektedir.
                                5- Fetching: Veri alışverişi yapılmaktadır.
                                6- Open: Bağlantı açıktır.

ÖRN:

                SqlConnection sqlConn = newSqlConnection("Data Source = USER; Database = exampleDB; Integrated Security = true; Pooling = true; ");

                privatevoid btnAç_Click(object sender, EventArgs e)

                {

                     if (sqlConn.State == ConnectionState.Closed)

                            sqlConn.Open(); // Veritabanını aç.

                }

                privatevoid btnKapat_Click(object sender, EventArgs e)

                {

                     sqlConn.Close(); // Veritabanını kapat.

                }

                privatevoid btnDurum_Click(object sender, EventArgs e)

                {

                       if (sqlConn.State == ConnectionState.Open)

                             MessageBox.Show("Bağlantı açıktır.");

                      else

                             MessageBox.Show("Bağlantı kapalı.");

                }

Ekran Çıktısı: 19.png

                 9- WorkstationId: WorkStation veya Client(İstemci) adını sadece string eri tipinden geri döndürür.

ÖRN:

                 SqlConnection sqlConn = newSqlConnection("Data Source = USER; Database = exampleDB; Integrated Security = true; Pooling = true; ");

                 privatevoid Form1_Load(object sender, EventArgs e)

                 {

                       MessageBox.Show(sqlConn.WorkstationId);

                 }

Ekran Çıktısı:  20.png

SqlConnection Sınıfı Metotları

               1- ChangeDatabase():Veritabanı'nı değiştirmek için kullanılır. Geriye herhangi bir değer döndürmez.

                                                              21.png

               2- Close(): Açık olan veritabanı'nı kapatır.

               3- CreateCommand(): Hangi SqlCommand hangi SqlConnection ile ilişkilendirildiğini belirtmemiz gerekir. GeriyeSqlCommand veri tipinden bir değer döndürür.

               4- Open():Veritabanı'nın bağlantısı açar.

 
 

SqlCommand Sınıfı

SQL veritabanı işlemleri ile ilgili kullanılan sorguları çalıştırmak için kullanılır. Kısacası veritabanı işlemlerinin yapılabilmesini sağlar. Yani veritabanından kayıt getirmek, veritabanındaki kayıtları silme, güncelleme, veritabanına kayıt girme işlemlerde bize aracılık yapar.

ADO.NET dahilinde iki tane Command nesnesi bulunmaktadır. Bunlardan birisi olan SqlCommandMS-SQL Server için hazırlanmış Command nesnesidir. Diğer veritabanları için OleDbommand nesnesi kullanılır. Bu yüzden MS-SQL Server açısından performans üst düzeydedir.

System.Data.SqlClient; namespace' i altında bulunmaktadır.

1.png,

SqlCommand Sınıfı Özellikleri

                       1- Connection: Çalıştırılacak SQL cümlesinin hangi veritabanı bağlantısını kullanacağını gösterir.SqlConnection veri tipinden get veya setedilebilir. Mutlaka belirtilmesi gerek. Yoksa komutlar çalışmaz.

ÖRN:

                       SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

                       SqlCommand sqlComm = newSqlCommand();

                       sqlComm.Connection = sqlConn;

                       2- CommandText: Çalıştırılacak olan sorgu cümlesi yazılmaktadır. stringveri tipinden getveyasetedilebilir.

ÖRN:

                       SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

                       sqlConn.Open();

                       SqlCommand sqlComm = newSqlCommand();

                       sqlComm.Connection = sqlConn;

                       sqlComm.CommandText = "SELECT* FROM exampleTB1";

                       3- CommandType: Çalıştırılacak olan SQL cümlesinin tipini belirlemek için kullanılmaktadır. Yani bu özellik ile komutun ne şekilde oluşturulacağı bildirilir. 3 farklı değer alır:

2.png

                                 1- Text: SQL cümlesinin çıplak olarak kullanıldığı özelliktir.


ÖRN:

                       SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

                       sqlConn.Open();

                       SqlCommand sqlComm = newSqlCommand();

                       sqlComm.Connection = sqlConn;

                       sqlComm.CommandText = "SELECT* FROM exampleTB1";

                       sqlComm.CommandType = CommandType.Text;


                       2- StoredProcedure: SQL cümlesinin Stored Procedure olarak kullanıldığı özelliktir. Veritabanındaki Stored Procedure yordamlarına parametre göndermek için SqlCommand sınıfının Parameters özelliğinin Add()metodu kullanıabilir.


                       3- TableDirect: SQL cümlesi yerine direk olarak tablo ismi verilerek kullanıldığı özellik. Birden fazla tablo kullanılacak ise, tablo isimleri ',' işareti ile ayrılır. Bu özellik seçilir ise tablonun tamamı elde edilir.

ÖRN:

                       SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

                       sqlConn.Open();

                       SqlCommand sqlComm = newSqlCommand("Uyeler",sqlConn);

                       sqlComm.CommandType = CommandType.TableDirect;

ÖRN:

                       SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

                       sqlConn.Open();

                       SqlCommand sqlComm = newSqlCommand();

                       sqlComm.Connection = sqlConn;

                       sqlComm.CommandText = "exampleTB1";

                       sqlComm.CommandType = CommandType.TableDirect;

CommandType özelliği varsayılan olarak Text değerine sahiptir. Bu özelliğin Text olması, komutun bir SQL cümleciği olduğunu göstermektedir.
 

                       4- CommandTimeout: SQL cümlesinin çalıştırılması ve cevap dönme süresi için bekleme zamanını int veri tipinden belirtir.

Varsayılan değeri 30’dur. Süre saniye cinsinden verilir.

                       5- Parameters:T-SQL cümlesi ya da Stored Procedure içerisinde kullanılan parametreleri (değişken vs......) setlemek için kullanılmaktadır.

Yani Command nesnesinin CommandText komutuna dışarıdandeğeralmak veya komuttan geriye değer döndürmekiçin kullanılır.

Parameters özelliği Collection olduğu için bir veya birden çok değer alabilir veya gönderebilir.

3.png

Add()AddRange()AddWithValue() gibi metotları ile programımız ile veritabanımıza bilgiler aktarabiliriz. BizAddWithValue() metodunu kullanarak parametrelere bir veri ekleyelim.

ÖRN:

                       private void btnEkle_Click(object sender, EventArgs e)

                       {

                               string ad = txtAd.Text;

                               string soyad = txtSoyad.Text;

                               string bulunduguİl = txtBulunduguİl.Text;

                               SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

                               sqlConn.Open();

                               SqlCommand sqlComm = newSqlCommand();

                               sqlComm.Connection = sqlConn;

                               sqlComm.CommandText = "INSERT INTO exampleTB1(Ad,Soyad,Bulundugu_İL) VALUES(@Ad, @Soyad, @Bulundugu_İL)";

                               sqlComm.Parameters.AddWithValue("@Ad", ad);

                               sqlComm.Parameters.AddWithValue("@Soyad", soyad);

                               sqlComm.Parameters.AddWithValue("@Bulundugu_İL", bulunduguİl);

                               sqlComm.ExecuteNonQuery();

                               sqlComm.Dispose(); //Komutları ortadan kaldırıyoruzki yer işgal etmesin.

                               sqlConn.Close(); //Bağlantımızı kapatıyoruz.

                       }

Ekran Çıktısı:  4.png         5.png

Yukarıdaki örnekte de görüldüğü gibi AddWithValue() metoduna 1 tane parametre ve 1 tane de value değeri girdirdik.

                       5- Transaction: Çalıştırılan SQL cümlesine, oluşturulan Transaction nesnesi bağlanılarak, ADO.NET düzeyinde kontrol yapılması sağlanabilir. Bu uygulamanın bize sağladığı fayda, çalıştırılan SQL cümlesinin, çalıştırılması sonucu oluşan hatalarda geriye dönüş yapılabilmesine imkan vermesidir.

SqlCommand Sınıfı Metotları

SqlComamnd üzerinden bir komutu çalıştırmak için 4 ayrı metot kullanılabilir. Bu metotlar aşağıdaki gibidir:

                   1- ExecuteNonQuery(): Bu metodu genellikle bir veritabanındaki kayıtları değiştirmek, silmek ya da yeni bir kayıt eklemek istediğimizde kullanırız.

Bu metodun geri dönüş değeri (int) komutun çalıştırıldıktan sonra etkilediği kayıt sayısıdır.

ÖRN:

        private void btnSqlCommand_Click(object sender, EventArgs e)

        {

             SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

             sqlConn.Open();

             SqlCommand sqlComm = newSqlCommand();

             sqlComm.Connection = sqlConn;

             sqlComm.CommandText = @"INSERT INTO exampleTB1(Ad,Soyad,Bulundugu_İL) VALUES('Ali','Yıkık','Adana')";

             sqlComm.ExecuteNonQuery();

             sqlComm.Dispose(); //Komutları ortadan kaldırıyoruzki yer işgal etmesin.

             sqlConn.Close(); //Bağlantımızı kapatıyoruz.

        }

Ekran Çıktısı:  6.png

ÖRN:

    privatevoid btnSqlCommand_Click(object sender, EventArgs e)

    {

        SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

        sqlConn.Open();

        SqlCommand sqlComm = newSqlCommand();

        sqlComm.Connection = sqlConn;

        sqlComm.CommandText = "INSERT INTO exampleTB1(Ad,Soyad,Bulundugu_İL)"VALUES('Sinem','Özkale','İstanbul')";

        sqlComm.ExecuteNonQuery();

        sqlComm.Dispose(); //Komutları ortadan kaldırıyoruzki yer işgal etmesin.

        sqlConn.Close(); //Bağlantımızı kapatıyoruz.

    }

Ekran Çıktısı:   7.png

ÖRN:

    privatevoid btnSqlCommand_Click(object sender, EventArgs e)

    {

        SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

        sqlConn.Open();

        SqlCommand sqlComm = newSqlCommand();

        sqlComm.Connection = sqlConn;

        sqlComm.CommandText = "INSERT INTO exampleTB1(Ad,Soyad,Bulundugu_İL)" + "VALUES('Faruk','Dilek','Muğla')";

        sqlComm.ExecuteNonQuery();

        sqlComm.Dispose(); //Komutları ortadan kaldırıyoruzki yer işgal etmesin.

        sqlConn.Close(); //Bağlantımızı kapatıyoruz.

    }

Ekran Çıktısı:  8.png

ÖRN:

    privatevoid btnEkle_Click(object sender, EventArgs e)

    {

           string ad = txtAd.Text;

           string soyad = txtSoyad.Text;

           string bulunduguİl = txtBulunduguİl.Text;

           SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

           sqlConn.Open();

           SqlCommand sqlComm = newSqlCommand();

           sqlComm.Connection = sqlConn;

           sqlComm.CommandText = " INSERT INTO exampleTB1(Ad,Soyad,Bulundugu_İL) VALUES('"+ad+"' , '"+soyad+"' , '"+bulunduguİl+"') ";

           sqlComm.ExecuteNonQuery();

           sqlComm.Dispose(); //Komutları ortadan kaldırıyoruzki yer işgal etmesin.

           sqlConn.Close(); //Bağlantımızı kapatıyoruz.

    }

Ekran Çıktısı:  9.png

Yukarıdaki örnekte de görüldüğü gibi TextBox'lar'a girilen bilgileri veritabanımıza aktardık. Burada dikkat edilmesi gereken parametre girişlerine nasıl veri girileceği ile ilgilidir. TextBox gibi nesneleri parametre olarak göstereceksek '"+nesneAdi+"' şeklinde bir parametre belirtmeliyiz.

NOT: ExecuteNonQuery() metodunun geri dönüş değeri komutun çalıştırılması sonucu elde edilen kayıt sayısı, silinen kayıt sayısı ya da değiştirilen kayıt sayısı olabilir.

                   2- ExecuteScalar(): Bu metot, geriye tek bir değer döndüren sorgular için kullanılır. Bu değerkayıt sayısı, bir alanın değeri gibi değerler olabilir.

Geriye object veri tipinden bir değer döndürür.

ÖRN:

     privatevoid btnSqlCommand_Click(object sender, EventArgs e)

     {

          SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

          sqlConn.Open();

          SqlCommand sqlComm = newSqlCommand();

          sqlComm.Connection = sqlConn;

          sqlComm.CommandText = "SELECT COUNT(*) FROM exampleTB1";

          int toplamKayitSayisi = (int) sqlComm.ExecuteScalar(); //Unboxing işlemi yaptık.

          MessageBox.Show(toplamKayitSayisi.ToString());

          sqlConn.Close();

     }

Ekran Çıktısı: 10.png

                   3- ExecuteReader(): Geriye SqlDataReader veri tipinden bir değer döndürür.

Bu metodun SQL cümleciğinin SELECT komutu içerdiği durumlarda kullanıldığı sıklıkla görülür. SELECT komutu ile bir veritabanından bir sorgu yapılarak bir kayıt kümesi elde edilir.

Elde edilen bu kayıt kümesi SqlDataReader nesnesine aktarılır. SqlDataReader ile bu kayıt kümesinden çeşitli yollardan veriler elde edilebilir.

İlk önce örneklere geçmeden önce SqlDataReader sınıfını inceleyelim:

SqlDataReader Sınıfı

Çalıştırılan Stored Procedure ya da SQL cümlesi, geriye birden çok değer veya kayıt kümesi döndürülebilir. Bu tür durumlar için DataReader veya DataAdapter nesneleri kullanılır. Bu nesnelerin genel farkı, DataReader bağlantılı,DataAdapter bağlantısız veri ortamları için kullanılır.

SqlCommand nesnesi ile geriye kayıt döndürmek için, ExecuteReader() metodu kullanılır. ExecuteReader() ile dönen kayıtlar SqlDataReader nesnesine aktarılır.

Bu nesne örneği, uygulamalarda yazılan SQL cümlesine bağlı olarak gelen sonuç kümesini (Result Set) sadece ileri yönlü (Forward-Only) ve Yalnız Okunabilir(Read-Only) formatta kullanma şansı verir. Bu durum, verinin daha hızlı bir şekilde uygulama ortamına alınmasını sağlar.

DataAdaptersınıfına göre daha hızlı çalışır.

SqlDataReader kullanımında dikkat edilmesi gereken noktalar;


Bir SqlDataReader, bir SqlConnection nesnesini kendine bağlar ve kayıtlar üzerindeki işin sonuna gelinmeden bağlantı nesnsini serbest bırakmaz. Ayrıca bir SqlDataReader, üzerinden veri taşıdığı bağlantı nesnesini tamamen kendi kullanımına alır ve kapatılmadan önce bağlantı nesnesini serbest bırakmaz. Ancak bu soruna .NET 2.0’dan itibaren, MARS (Multiple Active Result Sets) adı verilen teknoloji ile çözüm bulunmuştur. Ne var ki, bu teknolojinin kullanılabilmesi için ilgili veri tabanı sisteminin MARS’a destek veriyor olması gerekmektedir. Örneğin, MS SQL Server 2005 ve sonraki sürümlerin doğrudan MARS desteği varken; bu durum MS SQL Server 2000 ve önceki sürümleri için geçerli değildir.

SqlDataReader, sadece okunabilir olarak kullanılmaktadır. Satır satır okuma işlemi yapılmaktadır. SqlDataReaderkullanımı boyunca veritabanı bağlantısı açık olacaktır. Çünkü SqlDataReader veritabanı ile bağlantılı olarak çalışmaktadır. Okuma işlemi sona erdiğinde SqlDataReader bağlantısınında kapatılması gerekmektedir.

SqlDataReader Sınıfı Özellikleri

          1- FieldCount: DataReader içinde tutulan sütun sayısını belirtir. int veri tipinden sadece get edilebilir.

          2- HasRows: DataReader içinde satır'ların boş olup olmadığını sadece bool veri tipinden geriye döndürür.

          3- IsClosed: DataReader bağlantısının durumunu belirtir. Bağlantı açık ise false , kapalı ise true döndürür.

          4- RecordsAffected: DataReader ile gelen kayıt sayısını int veri tipinden verir.

SqlDataReader Sınıfı Metotları

              1- Close(): DataReader nesnesini kapatılır ve hafızadan kaldırır.

              2- GetBoolean(): Belirli bir kolonun değerini boolean olarak geri döndürür.

              3- GetByte(): Belirli bir kolonun değerini byte olarak geri döndürür.

              4- GetBytes():Belirli bir kolonun değerini byte dizisi olarak geri döndürür.

              5- GetChar(): Belirli bir kolonun değerini char olarak geri döndürür.

              6- GetChars(): Belirli bir kolonun değerini karakter dizisi olarak geri döndürür.

              7- GetDataTypeName(): Belirli bir kolonun veri türünü verir.

              8- GetDateTime():Belirli bir kolonun değerini DateTime olarak geri döndürür.

              9- GetDecimal():Belirli bir kolonun değerini decimal olarak geri döndürür.

              10- GetDouble(): Belirli bir kolonun değerini double olarak geri döndürür.

              11- GetFieldType():Belirli bir kolonun veri türünü geri döndürür.

              12- GetFloat(): Belirli bir kolonun değerini float olarak geri döndürür. 
 

              13- GetGuid():Belirli bir kolonun değerini Globally-unique identifier (GUID) olarak geri döndürür. 
 

              14- GetInt16():Belirli bir kolonun değerini 16-bit tamsayı (Short) olarak geri döndürür. 
 

              15- GetInt32():Belirli bir kolonun değerini 32-bit tamsayı (Integer) olarak geri döndürür.

              16- GetInt64(): Belirli bir kolonun değerini 64-bit tamsayı(Long) olarak geri döndürür.

              17- GetName():Belirli bir kolonun ismini geri döndürür.

              18- GetOrdinal(): Belirli bir kolonun sıra numarasını geri döndürür.

              19- GetSchemaTable(): DataReader nesnesinin şema bilgilerini gösterir. Tablo hakkındaki detay bilgilerini gösterir.

              20- GetString(): Belirli bir kolonun değerini string olarak geri döndürür. 
 

              21- GetTimeSpan():Belirli bir kolonun değerini TimeSpan nesnesi olarak geri döndürür.

              22- GetValue():Belirli bir kolonun değerini geri döndürür.

              23- GetValues(): Belirli bir kaydın tüm kolon değerlerini geri döndürür.

              24- NextResult():Komut metninde birden fazla SELECT ifade varsa, sonuçlar bu metot kullanılarak farklı veri kümeleri gibi alınabilir.bool veri tipinden geriye değer döndürür.

              25- Read(): DataReader nesnesinde okunacak kayıt olduğu sürece okuma yapar. Kayıt varsa trueyoksa falsedeğeri geri döndürür.
 

Bu metod bir while döngüsünde etkin bir şekilde kullanılabilir. Böylece bir sonuç kümesi üzerindeki tüm satırlar tek tek dolaşılıp değerlendirilebilir.

              while (sqlDtRdr.Read())

              {

                   rdr["kolonAdi"].ToString();

              }

              //yada

              while (sqlDtRdr.Read())

              {

                   rdr[kolonIndexNumarası].ToString();

              }
 

NOT: SqlDataReader sınıfında bildirilen iki indeksleyici ile sorgu sonucu elde edilen kayıt kümesindeki her sütunailişkin veriler elde edilebilir. Bu indeksleyicilerin kullanımı aşağıda verilmiştir:


 

              sqlDtRdr[2]

              sqlDtRdr["Bulundugu_İL"]


ÖRN:

              private void btnEkle_Click(object sender, EventArgs e)

              {

                    int sayac = 0;

                    SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

                    sqlConn.Open();

                    SqlCommand sqlComm = newSqlCommand();

                    sqlComm.Connection = sqlConn;

                    sqlComm.CommandText = "SELECT* FROM exampleTB1";

                    SqlDataReader sqlDtRdr = sqlComm.ExecuteReader();

                    while (sqlDtRdr.Read())

                    {

                           listView1.Items.Add(sqlDtRdr["Ad"].ToString());

                           listView1.Items[sayac].SubItems.Add(sqlDtRdr["Soyad"].ToString());

                           listView1.Items[sayac].SubItems.Add(sqlDtRdr["Bulundugu_İL"].ToString());

                           sayac++;

                    }

                    sqlComm.Dispose();

                    sqlConn.Close();

              }

Ekran Çıktısı:   11.png

Yukarıdaki örnekte de görüldüğü gibi veritabanımızda ki verileri ListView'e aktardık.


 

Peki DataGridView'e verileri SqlDataReader sınıfını kullanarak aktarmak istersek nasıl olacak? Onun için DataTableveya DataSet'e sınıfını kullanarak SqlDataReader'da ki verileri DataTableveya DataSet'e aktarmamız lazım. Onu da DataTable'ın Load(SqlDataReader dtRdr); metodunu kullanarak olur. Load() metodu kendi parametresine verilenSqlDataReader nesnesi içindeki verileri DataTable'a aktarır. Sonra DataTable'da ki verileri de DataGridView'ınDataSource özelliğine set ediyoruz ve işlemler tamamlanıyor.

                                               12.png


 


 

                   

                   4- ExecuteXMLReader(): Yürütülen komut sonrasında geriye XmlReader nesnesini döndürür.

                   5- Cancel(): SqlCommand nesnesinin çalışmasını durdurur.

                   6- Dispose(): SqlCommand nesnesini ortadan kaldırır.
 

ÖRN:

                   privatevoid btnEkle_Click(object sender, EventArgs e)

                   {

                 int urunID = Convert.ToInt32(txtUrunID.Text);

                 int urunMiktari = Convert.ToInt32(txtUrunMiktari.Text);

                 SqlConnection sqlConn = newSqlConnection(

                          @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename="+Application.StartupPath+"\\exampleDB.mdf;Integrated Security=True;Connect Timeout=30");

                 sqlConn.Open();

                 SqlCommand sqlComm = newSqlCommand();

                 sqlComm.Connection = sqlConn;

                 sqlComm.CommandTimeout = 60;

                 sqlComm.CommandText = @"INSERT INTO Urunler(U_ID,UrunAdi,UrunTuru,UrunMiktari) VALUES(@U_ID,@UrunAdi,@UrunTuru,@UrunMiktari)";

                 sqlComm.Parameters.AddWithValue("@U_ID", urunID);

                 sqlComm.Parameters.AddWithValue("@UrunAdi", txtUrunAdi.Text);

                 sqlComm.Parameters.AddWithValue("@UrunTuru", txtUrunTuru.Text);

                 sqlComm.Parameters.AddWithValue("@UrunMiktari", urunMiktari);

                 sqlComm.ExecuteNonQuery();

                 sqlComm.Dispose();

                 sqlComm = newSqlCommand("SELECT* FROM Urunler", sqlConn);

                 SqlDataReader sqlDtRdr = sqlComm.ExecuteReader();

                 DataTable dtTb = newDataTable();

                 dtTb.Load(sqlDtRdr);

                 dataGridView1.DataSource = dtTb;

                 MessageBox.Show("Başarılı şekilde eklendi.");

                 sqlConn.Close();

                 sqlConn.Dispose();

                 sqlComm.Dispose();

                   }

Ekran Çıktısı: 13.png

Yukarıdaki örnekte ise veritabanına localhost olarak değil de bin/Debug içinde bulunan veritabanına bağlanıp ve o veritabanının içindeki Urunler adındaki tabloya veriler ekledik ve verileri DataGridView'de görüntüledik.

 
 

SqlDataAdapter Sınıfı

SqlDataAdaptersınıfı ile veritabanı bağlantısı olmasa bile veriler üzerinde işlemler gerçekleştirilebilir. Veritabanına bağlanıp veriler çekilir. Daha sonra bağlantı kesilse bile daha önceden çekilmiş veriler üzerinde işlem yapılmaktadır. Üzerinde değişiklik yapılmış veriler daha sonra veritabanına gönderilir.

Örneğin uygulama arasında bir köprümüz var. Bu köprüdeki alışverişi yapan DataAdapter'dür. DataAdapter yapısı gereği otomatik olarak bağlantıyı açar, istenilen sorguyu veritabanına sorar, cevabı alır uygulamaya taşır ve bağlantıyı kapatır. DataAdapter'ün başlıca görevi budur.

Peki o halde SqlDataReader'ı ile SqlDataAdapter arasındaki fark nedir?

Yani biz bu SqlDataAdapter nesnesini veritabanımız üzerinde çevrimdışı olarak işlemler yapmak istiyorsak kullanıyoruz. SqlDataReader'ı ise veritabanımız üzerinde çevrimiçi olarak işlemler yapmak istiyorsak kullanıyoruz. İki arasında ki fark budur yani.

SqlDataAdapternesnesini kodumuzda kullanabilmek için öncelikle System.Data ve System.Data.SqlClient sınıflarını projemizde dahil etmemiz gerekmektedir.

Bir SqlDataAdapter nesnesi, mutlaka SELECT sorgusu içermelidir. SELECT sorgusu ile ortaya çıkan veri kümesi iseDataSet veya DataTable nesnelerine aktarılır. DataSet ve DataTable veritabanından alınan bir tablo örneğini,bellekte temsil eden nesnelerdir.

DataTable sınıfı bellekteki tabloların satırlarını DataRow nesnesi ile, sütunlarını ise DataColumn nesnesi ile temsil eder. Yani DataTableDataColumn ve DataRow nesnelerinden oluşur.

DataSet ise, DataTableDataColumnDataRowDataRelation nesnelerinden oluşur.

DataSet,sanal veritabanı oluştururken, DataTable ise sanal tablo oluşturur.

DataSet ile DataTable arasındaki genel fark kısaca; DataSet içerisinde "n" adet DataTable barındırabilir. DataTableiçerisinde 1 tablo barındırır. Yapılan sorgulardan dönen sonuç genel olarak 1 tablo olursa DataTable kullanmak bizim yararmıza olur. DataSet birden fazla tablolarda kullandıgı için performans düşüklüğüne neden olur.

1.png

DataSet veya DataTable üzerinde meydana getirilen değişiklikler, veritabanına etki yapmaz. Nedeni ise, veri kümesini çektikten sonra veritabanı bağlantısının kapatılması ve bundan sonraki işlemlerin çevrimdışı gerçekleştirilmesidir.

Son kez özetlersek;

DataAdapter nesnesinin kullanılma amacı, bağlantısız katman nesnesini veri kaynağındaki veriler ile doldurmaktır. Bu her DataAdapter sınıfı içinde öncelikli hedeftir. Bu nedenle her DataAdapter nesnesinin mutlaka sahip olması gereken bir SELECT sorgu ifadesi dolayısıyla var olan bir SelectCommand özelliğine ihtiyacı vardır. Ayrıca diğer önemli gereklilik, geçerli bir bağlantının yani bir Connection nesnesinin olmasıdır.

İşin aslını da örnekleyecek olursak;

Mesela bir eviniz var. Bu evin içindeki eşyalarla oynayabilmeniz için, evinizde eşya olması şarttır. (SELECT)

Ki beğenmediğinizi atın (DELETE), veya değiştirin (UPDATE) veya yeni bir eşya almaya karar verin. (INSERT)

Bu yüzden öncelikle SELECT sorgusuna ihtiyaç vardır. SELECT ile evin içerisinde eşyaları doldururuz. Ondan sonraInsertCommandUpdateCommand ya da DeleteCommand ile bunların üzerinde oynama yapabiliriz.

Bir de bilişim üzerinden bir örnek verelim. Bir de onunla örneklendirmeye çalışalım.

Farzedin ki; bilgisayarınızın kasasına ek olarak RAM takmak istiyorsunuz diyelim.

Evin ortasına oturacaksınız, kasayı önünüze getireceksiniz, içini açacaksınız ve yeni aldığınız RAM’i takacaksınız.

Bu örnekte DataAdapter’de siz oluyorsunuz.

Kasanın önünüze getirilmesi SelectCommand ve yeni RAM’i takma işlemi de InsertCommand.

Kasa önünüze gelmeden InsertCommand’ı çalıştırabilir misiniz? Nereye takacaksınız? Kasa henüz önünüzde değil ki?? Eğer bu durumda InsertCommand ’a devam ederseniz, RAM’i oturduğunuz halıya takmaya benzetmek yanlış olmayacaktır.

Bu yüzden öncelikli olarak SELECT’e ihtiyaç vardır.

SqlDataAdapternesnesini SqlComamnd sınıfı ile birlikte kullanarak 4 farklı komut biçimi ile seçme, ekleme, güncelleme ve silme işlemlerini gerçekleştirebiliriz.

1- SelectCommand özelliği: Kayıtları listelemek amacı ile kullanılır.

2- InsertCommand özelliği: Kayıt eklemek amacı ile kullanılır. Bu özelliğin çalışması için SqlCommandBuilder sınıfını kullanmamız lazımdır.

3- UpdateCommand özelliği: Kayıtları güncellemek amacı ile kullanılır. Bu özelliğin çalışması için SqlCommandBuilder sınıfını kullanmamız lazımdır.

4- DeleteCommand özelliği: Kayıt silmek amacı ile kullanılır. Bu özelliğin çalışması için SqlCommandBuilder sınıfını kullanmamız lazımdır.

                                                                                                    2.png

ÖRN:

       private void btnGöster_Click(object sender, EventArgs e)

       {

              SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

              SqlCommand sqlComm = newSqlCommand("SELECT* FROM exampleTB1" , sqlConn); //SqlDataAdapter mutlaka bir SELECT içermesi gerek idi.

              SqlDataAdapter sqlDtAdp = newSqlDataAdapter();

              sqlDtAdp.SelectCommand = sqlComm; //Kayıtları listeliyoruz SelectCommand özelliği ile.

              DataTable dtTb = newDataTable(); //Verileri doldurmak için DataTable'a ihtiyacımız var.

              sqlDtAdp.Fill(dtTb); //DataTable'a verileri ise SqlDataAdapter sınıfının Fill() metodu ile dolduruyoruz.

              dataGridView1.DataSource = dtTb; //dataGridView nesnemize DataTable'ın içine doldurduğumuz verileri bağlıyoruz dataGridView'ın Data Source özelliği ile.

       }

Ekran Çıktısı:  3.png

Yukarıdaki örnekte de görüldüğü gibi DataTable'ımızın içine doldurduğumuz verileri DataGridView kontrolümüze aktardık veritabanı bağlantısı çevrimdışı olduğu halde SqlDataAdapter ile. DataGridView kontrolümüzü aynı ListView kontrolü gibi düşünebiliriz. Tek farkları DataGridView daha çok veritabanındaki verileri göstermek, vs..... için kullanılması.

Bizim yukarıdaki örnekte gördüğümüz DataGridView üzerinde tablo aslında DataTable tablosudur. DataGridViewkontrolü sadece tabloları gösterir. Haliyle uygulamamızı çalıştırdıktan sonra tablo'nun üzerinde yapacağımız değişiklikler bizim fiziksel (ana) veritabanımızı değiştirmez.

Son olarak bir de bizim DataGridView'de ki tablomuz aslında DataTable tablosudur bunu da unutmayalım.

NOT: Dikkat edilmesi gereken en önemli noktalardan bir tanesi SqlConnection nesnesinin Open() ve Close()metotları kullanılmamıştır. Bunun nedeni SqlDataAdapter nesnesinin bu işlemi kendi içerisinde gerçekleştiriyor olmasıdır. SqlDataAdapter ile veri çekme işlemlerinde ayrıca bağlantıyı açma ve kapatma işlemlerini yapmak gerekmemektedir.

Aynı örneği bir de DataSet ile yapalım.

ÖRN:

      privatevoid btnGöster_Click(object sender, EventArgs e)

      {

              SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

              SqlDataAdapter sqlDtAdp = newSqlDataAdapter("SELECT* FROM exampleTB1",sqlConn);

              DataSet dtSt = newDataSet();

              sqlDtAdp.Fill(dtSt,"new_exampleTB1"); // SqlDataAdapter'ın içindeki listelenmiş olan verileri 2. parametre de "new_exampleTB1" yazarak yeni bir tabloya (sahte tablo da diyebiliriz) gönderiyoruz.

              dataGridView1.DataSource = dtSt.Tables["new_exampleTB1"]; //DataSet, içinde birden fazla tablo barındırdığı için Tables özelliğine sahiptir. Biz Tables özelliğini indeks operatörüne alıp SqlDataAdapter'ın Fill metodunda oluşturduğumuz yeni bir tablonun (sahte tablo) ismini veriyoruz 2. parametreye. Eğer tablo adı ya da index no'su yazmaz isek DataGridView'da görünmez veriler. Demin ki cümlemizde de belirttiğimiz gibi o tablomuzun index no'sunu da verebiliriz (ÖRN:dtSt.Tables[0]) .

      }

Şimdi ise yeni bir kayıt eklemek için INSERT sorgusunu bir SqlCommand nesnesi ile tanımlayarak oluşturacağımız bir SqlDataAdapter nesnesinin SelectCommand özelliğine aktarıyoruz.

ÖRN:

      privatevoid btnEkle_Click(object sender, EventArgs e)

      {

                 SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

             SqlDataAdapter sqlDtAdp = newSqlDataAdapter();

             DataTable dtTb = newDataTable();

             SqlCommand sqlComm = newSqlCommand("INSERT INTO exampleTB1(Ad,Soyad,Bulundugu_İL) VALUES('İshak','Tunç','Malatya')", sqlConn);

             sqlDtAdp.SelectCommand = sqlComm;

             sqlDtAdp.Fill(dtTb);

      }

Ekran Çıktısı: 4.png

Aynı örneğin başka bir yöntem ile de yapabiliriz.

ÖRN:

       SqlDataAdapter adapter = null;

       DataTable data = null;

       privatevoid GridDoldur()

       {

              string sqlserver = ""// Burası Doldurulacak

              string sqldatabase = ""// Burası Doldurulacak

              string sqlkullaniciadi = ""// Burası Doldurulacak

              string sqlkullanicisifresi = ""// Burası Doldurulacak

              string BaglantiCumlesi = "Data Source=" + sqlserver + "; Initial Catalog=" + sqldatabase + "; User ID=" + sqlkullaniciadi + "; Password = " + sqlkullanicisifresi + "";

              SqlConnection baglanti = new SqlConnection(BaglantiCumlesi);

              try

              {

                     baglanti.Open();

                     string tabloismi = ""// Burası Doldurulacak

                     string sqlsorgu = "SELECT * FROM " + tabloismi;

                     adapter = new SqlDataAdapter(sqlsorgu, baglanti);

                     data = new DataTable();

                     adapter.Fill(data);

                     dataGridView1.DataSource = data;

              }

              catch (Exception ex)

              {

                     MessageBox.Show(ex.Message.ToString());

              }

              finally

              {

                     baglanti.Close();

                     baglanti.Dispose();

              }

       }

       privatevoid Form1_Load(object sender, EventArgs e)

       {

            GridDoldur();

       }

       privatevoid btnİslem_Click(object sender, EventArgs e)

       {

              string sqlserver = ""// Burası Doldurulacak

              string sqldatabase = ""// Burası Doldurulacak

              string sqlkullaniciadi = ""// Burası Doldurulacak

              string sqlkullanicisifresi = ""// Burası Doldurulacak

              string BaglantiCumlesi = "Data Source=" + sqlserver + "; Initial Catalog=" + sqldatabase + "; User ID=" + sqlkullaniciadi + "; Password = " +        sqlkullanicisifresi + "";

              SqlConnection baglanti = new SqlConnection(BaglantiCumlesi);

              SqlCommand baglanti_komut = new SqlCommand();

              baglanti_komut.Connection = baglanti;

              

              try

              {

                     baglanti.Open();

                     baglanti_komut.CommandText = "INSERT INTO MUSTERI (ADI, SOYADI, TEL) VALUES (@adi, @soyadi, @tel)";

                     baglanti_komut.Parameters.Add("@adi", SqlDbType.NVarChar);

                     baglanti_komut.Parameters["@adi"].Value = textBox1.Text;

                     baglanti_komut.Parameters.Add("@soyadi", SqlDbType.NVarChar);

                     baglanti_komut.Parameters["@soyadi"].Value = textBox2.Text;

                     baglanti_komut.Parameters.Add("@tel", SqlDbType.NVarChar);

                     baglanti_komut.Parameters["@tel"].Value = textBox3.Text;

                     baglanti_komut.ExecuteNonQuery();

                     VerileriYenile();

                     textBox1.ResetText();

                     textBox2.ResetText();

                     textBox3.ResetText();

                     textBox1.Focus();

              }

              catch (Exception ex)

              {

                    MessageBox.Show(ex.Message.ToString());

              }

              finally

              {

                     baglanti.Close();

                     baglanti.Dispose();

                  baglanti_komut.Dispose();

              }

       }

       privatevoid VerileriYenile()

       {

            GridDoldur();

       }

Yukarıdaki örneklere benzer bir şekilde veritabanında güncelleme ve silme işlemleri yapabiliriz.

NOT: Eğer DataGridView üzerinde ekleme, güncelleme, silme vs. gibi işlemler de yapabiliriz. Bu işlemleri yapmak için SqlCommandBuilder nesnesini ve SqlDataAdapter'ın Update() metodunu kullanmamız lazımdır.

ÖRN:

            SqlConnection sqlConn = newSqlConnection("Server = localhost; Database = exampleDB; Integrated Security = true; Pooling = true;");

            SqlDataAdapter sqlDtAdp;

            DataTable dtTb = newDataTable();

            privatevoid button1_Click(object sender, EventArgs e)

            {

                   sqlDtAdp = newSqlDataAdapter("SELECT* FROM exampleTB1", sqlConn);

                   SqlCommandBuilder scb = newSqlCommandBuilder(sqlDtAdp); //Parametreye SqlDataAdatpter nesnesini vererek SqlDataAdapter nesnesindeki Insert, Update ve Delete özelikler SqlCommandBuilder'e veriliyor otomatik olarak. Böylece bu nesnemiz ile yaptığımız değişiklikleri fiziksel tablomuza yansıtabiliriz.

                   sqlDtAdp.Fill(dtTb);

                   dataGridView1.DataSource = dtTb;

            }

            privatevoid dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

            {

                   sqlDtAdp.Update(dtTb); //RAM'de ki tabloya yapılan değişikleri (DataTable, DataSet) orjinal veritabanımıza/fiziksel tablo aktarıyoruz.

            }

SqlDataAdapter Sınıfı Metotları

                     1- Fill(): SqlDataAdapter'da ki verileri DataTable veya DataSet gibi tablolara doldurmayı sağlar.

                    2- Update(): Veriabanında bir ekleme, güncelleme, silme vs.... gibi işlemler yapmışsak verilerimizin son halini RAM'de ki DataTableDataSet gibi tablolarımıza güncelleyip gönderir.

Okul Zil Programı

yilsoftzil

9786059223690
logo5

Esma-ül Hüsna

Ziyaretçi İstatistikleri

Bugün178
Dün366
Bu hafta1755
Bu ay7264
Hepsi810482