İçindekiler 22. BÖLÜM Veri Tabanı İşlemleri.....................................................................................527 SQL Server...............................................................................................527 Prosedür yazma.......................................................................................543 Temel TSQL Bilgileri.................................................................................548 Veritabanına bağlanma...........................................................................565 Insert işlemi.............................................................................................567 Update işlemi..........................................................................................568 Delete işlemi............................................................................................570 Değer döndüren Stored Procedure kullanma..........................................571 Arama yapma..........................................................................................572 Gridleri Kullanma.....................................................................................573 Otomatik WinForm yetenekleriyle işlem yapma.....................................580 Combobox doldurma...............................................................................586 Listbox doldurma.....................................................................................588 MySQL ile Çalışma...................................................................................590 22. BÖLÜM Veri Tabanı İşlemleri SQL SERVER Bu bölümde C# ile veritabanı programcılığı yapacağız. Eğer veritabanı yönetimini ve veritabanı sorgulamalarını bilmiyorsanız veritabanı programcılığı kısmını anlamanız çok zor olur. Bu yüzden SQL Server Jump Start yaparak SQL Server veritabanı yönetimine ve sorgulamalarına hızlı bir şekilde bahsedip sizi veritabanı programlamaya ısıtmış olacağız. Şu anda Microsoft’un kendi ürünü olan SQL Server veritabanı serisi .NET geliştiriciler için birincil veritabanı olmaktadır. C# programlama dilini kullanırken SQL Server sürümlerinden biri ile de geliştirme yapmaktadırlar. Baktığınız zaman C# programlama dili ile .NET platformu üstünde yazılım geliştirenler sadece SQL Server sürümleriyle sınırlı değiller. Aynı zaman da MySQL, MongoDB, MariaDB gibi bir çok veritabanı ile konuşabilirler. Microsoft’un kendi ürünü olan SQL Server Veritabanı ise .NET platformların çalışan ve çokca tercih edilen bir ürün olduğunu söylemeden geçemeyeceğim. Bunun sebeplerinden bazıları yanın Reporting Services, Analysis Server gibi ek araçlarla hem raporlama hem de analiz safhalarını daha kolay yönetmeye olanak tanır. SQL Profiler isimli uygulamasıyla adım adım veritabanında 527 C# 6.0 ne oluyor takip edebilirsiniz. Ücretsiz sürümü olan SQL Server Express edition’ı istediğiniz zaman indirebilirsiniz. 10GB’a kadar ücretsiz veritabanı alanıda sunmakta. Çoğu proje için bu alanın fazlasıyla yeterli olduğunu söylemeden geçemeyeceğim. Piyasada hala SQL Server 2008, SQL Server 2008 R2, SQL Server 2012 ve yeni sürüm SQL Server 2014 veritabanı sistemlerini görebilirsiniz. Bir veritabanı sunucusu aslında kendi başına bir engine’dir. Yani bir veritabanı motorudur. Arka planda bir servisle çalışır veri iletişimi gerçeklir. Biz bunları yönetmek için bir yönetim uygulamasına ihtiyaç duyarız. Bu yönetim uygulaması SQL Server için Management Studio’dur. MySQL için ise MySQL Workbench uygulamasıdır. SQL Server’ın doğuşuğu Wikipedia tanımıyla; “Versiyon 7.0’dan önce “kod tabanı” Sybase SQL Server tarafından Microsoft ’a satıldı, ve bu Microsoft ’un kurumsal seviyede veritabanı pazarına girişi oldu. Sybase SQL Server 3.0 ile esasen aynı olan ilk versiyon, SQL Server 1.0’ı yaratmak ve pazarlamak adına Microsoft, Sybase ve Ashton-Tate ile takım oluşturdu. 1992’de Microsoft SQL Server 4.2 sevkedildi. Daha sonra Windows NT 3.1 ile aynı zamanda Microsoft SQL Server 4.21 piyasaya sunuldu. Microsoft SQL Server 6.0 Windows NT için dizayn edilmiş ilk versiyon olmasıyla birlikte Sybase’den talimat alınmaksızın piyasaya çıkartıldı. SQL Server 7.0, miras Sybase kodu ile yazılan bir “rewrite” versiyonu oldu, ve yerine SQL Server 2000 çıkartıldı. SQL Server 2000, IA-64 mimarisinden farklı olarak yazılan ilk sürüm oldu. SQL Server 2000 sürümünden 10 yıl sonra performansta artışlar görüldü, IDE araçlarını ve tamamlayıcı başka sistemleri içeren SQL Server 2005 piyasaya sunuldu.” Şeklindedir. 528 Veri Tabanı İşlemleri Management studio’yu kurduktan sonra çalıştırdığımızda eğer express sürümü yüklemediysek ve kendi makinemiz üzerinden sunucuya erişeceksek (local) yazmamız yeterlidir. Eğer SQL Server express sürümünü veya bir den fazla veritabanı motoru kurduysak \ işareti ile kurduğumuz veritabanı sunucusu motor ismini yani instance’ını belirtmemiz gerekmektedir. Aynı zamanda kurulum yaparka SQL Server Authentication belirttiyseniz login isminiz sa olacaktır. Şifreyi belirlediğiniz şifre olarak girebilirsiniz. Diğer durumlarda eğer veritabanı kurulu bilgisayar üstünden admin yetkileri ile çalışıyorsanız Windows Authentication seçeneğiyle hiç bir şifre girmeden de login olabilirsiniz. 529 C# 6.0 SQL Server veritabanı sunucusuna bağlandığımız Object Explorer kısmında varsayılan ayarlarla gelen yapıyı görebilirsiniz. Veritabanı sunucuna yeni bir veritabanı eklemek için Database kısmına gelip sağ tıklayıp New Database diyebiliriz. İsmini belirleyip varsayılan ayarlarla bu veritabanını kullanmaya başlayabiliriz. Şu anda veritabanımızın ismini csharpkitap olarak belirliyoruz. 530 Veri Tabanı İşlemleri Eğer veritabanımız yoğun kullanılacak ve durmadan büyüyecekse ilk değer olarak gelen 5MB veritabanı boyutunu daha yüksek tutmakta fayda var. Ardından Autogrowth özelliğini yüzde olarak belirlememiz veritabanımız doldukça daha verimli çalışmasına olanak sağlar. Yoksa 1’er mb lık bir büyüme eğer veritabanına 1 dakikada onlarca resim atıyorsanız yavaşlamaya yol açacaktır. 531 C# 6.0 TEMEL BİLGİLER Veritabanımızı oluşturur oluşturmaz ilk yapacağımız işlem veritabanımıza tablo eklemek olmalıdır. Her bir veritabanın en az bir ve daha fazla tablosu olmak zorundadır. Bu sayede verileri tablolar üzerinde tutabilir. Bunun için veritabanımızı oluşturduktan sonra içinde bulunan Tables sekmesine gelip sağ tıklamamız gerekmektedir. Açılan pencerede new table sekmesini seçmeliyiz. Aynı zamanda bir veritabanın içinde hangi nesneler ve özellikler var buradan ayrıntılarıyla görebiliriz. Örneğin Database Diagrams, Biews, Programmability bunlardan bir kaçıdır. New table sekmesine tıklar tıklamaz karşımıza dizayn penceresi çıkacaktır. Bu pencere üzerinden int, nvarchar,datetime,bit ve char gibi veritiplerini kullanarak tablomuzu dizayn edelim. İnt bildiğiniz gibi tam sayı değerleri için datetime, tarih değerleri için tutulur. Aynı şekilde bit, bool değerler içindir. Char karakter ve string deperler içindir. Nvarchar string değerler içindir. 532 Veri Tabanı İşlemleri Tablomuzda ilk ID değerimiz primary key yani birincil ve uniq anahtardır. Bunun için üstünde sağ tıklayıp set primary key dememiz gerekmektedir. Primary key eklediğimiz anda null değer girilmeyecek şekilde otomatik ayarlama yapılacaktır. Yani allow nulls sekmesindeki tik kalakacaktır. Artık null karakter girilemez yani boş geçilemez durumdadır. Bundan sonra yapmamız gereken ikin ayar primary key değerimizin varsayılan olarak bir değerden başlayıp belirlediğimiz artış miktarı ile her kayıtta kendi kendine artmasıdır. Bunun için Identity Specification kısmından Is Identity özelliğine Yes dedikten sonra artım miktarını ve ilk alacağı değeri belirleyebiliyoruz. 533 C# 6.0 Bu ayarlarıda yaptıktan sonra tablo dizayn sekmesinin üstüne sağ tıklayıp save table dememiz gerekmektedir. Burada açılan pencere sayesinde tablomuzun belirlediğimiz ismini buraya yazabiliriz. 534 Veri Tabanı İşlemleri Tabloyu veya tabloları eklediğimizde her daim anında veritabanımızın tables kısmına yansımamakta. Bunun için veritabanımıza sağ tıklayıp refresh dememiz gerekmektedir. Aynı şekilde tablolar üzerinden oluşutrduğumuz okuyucular tablosuna tıkladığımızda columns sekmesine bastığımızda tüm kolonları veri tiplerini ve ayarlarını görebiliriz. 535 C# 6.0 Tablomuza sağ tıklayıp select top 1000 rows dediğimizde kayıtlı bilgilerin ilk 1000 tanesi gelecektir. 536 Veri Tabanı İşlemleri Şu anda herhangir bir kayıtlı bilgi olmadığından sadece kolon isimlerini resultsda görebilirsiniz. Aynı şekilde tabloya sağ tıklayıp edit top 200 rows dediğimizde varolan kolonlardaki kayıtları düzenlyebildiğiniz gibi görsel bir menü üzerinden yeni kayıtlar girebilirsiniz. 537 C# 6.0 Edit top 200 rows sekmesine tıkladıktan sonra tablomuza 4 adet kayıt girdik. Bu kayıtları tabloda görebilmekteyiz. Yeni ve özel bir sorgu yazmak istediğimiz zaman menüden new query sekmesini seçmemiz gerekmektedir. Bu sekmeyi seçtiğimizde yazdığımız queryler varsayılan olarak gelen master isimli sistem veritabanında çalışacaktır. Bunu önlemek için ya veritabanı kolonundan veritabanını seçmeniz gerekmektedir ya da use komutunu kullanarak hangi veritabanı üstünde sorgu yazacağınızı belirtmeniz gerekmektedir. Select * from okuyucular dediğimiz anda okuyucular tablosundaki tüm veriler listelenecektir. Use csharpkitap komutu ile csharpkitap veritabanını kullanacağımızı belirttik. 538 Veri Tabanı İşlemleri Veritabanına kayıt girmek için insert komutunu kullanacağız. Insert komutunun yapısı; Insert tablo_ismi(kolon isimleri) values(değerler) şeklindedir. Insert komutumuzla tablomuza sınırsız kayıt atabiliriz. Tabi bu C# ile programlama yaparken bilmemiz gereken özelliklerden biri. Tüm komutları C# programlama diliyle .NET platformunda veritabanına ulaşırkende kullanabiliriz. INSERT yani giriş işlemlerinin yanı sıra UPDATE işlemleride veritabanı tablolarında sık sık yapılmaktadır. Update komutunun yapısı şöyledir; 539 C# 6.0 Update tablo_ismi set tablonun_kolonu=yeni_değer Tablodaki kolon sayısı kadar set ifadesinden sonra kolon ismi ve yeni değer tanımlayabiliriz. Ama bu durumda tablodaki tüm değerler güncellenecektir. Bunu kontrollü yapmak için bir koşul koymamız gerekmektedir. Koşul komutumuz yani sorguları ve update’leri filtreden geçirmek için kullanacağımız anahtar kelime where anahtar kelimesidir. Burada aritmetik karşılaştırmalardan mantıksal karşılaştırmalara kadar tüm varyasyonları yapabiliriz. Tabloların yanı sıra veritabanımızda view dediğimiz veritabanı nesneleride vardır. Çağırımları, kullanımları ve sorgulamaları tablo yapısıyla aynı şekildedir. Bu tablolara sadece insert, update ve delete işlemlerini yapamayız. View oluşturmak için new view dedikten sonra açılan pencereden tablo veya eski yapılan viewlerden seçebilirsiniz. 540 Veri Tabanı İşlemleri Seçtiğiniz tabloların istediğiniz kolonun alarak where anahtar kelimesiyle çeşitli sorgularla kısıtlayabilirsiniz. View nesnesini kaydetmek tablo kaydetmek gibidir. Save view dediğiniz anda sorgusunu yazdığınız view kaydolacaktır. 541 C# 6.0 Burada view nesnemize kisiler ismini verdik. Bundan sonra nasıl önceki tablomuza okuyucular ismi ile ulaşabiliyorsak artık view’imize kisiler ismi ile ulaşabileceğiz. Yaptığımız bütün View’ler veritabanımızın içindeki views sekmesinde gözükecektir. Aynı şekilde sağ tıklayıp select top100 dediğimiz zaman oluşturduğumuz view’ın belirlediğimiz kolonları gelecektir. Where anahtar kelimesi ile koşullar ve sorgular rahatlıkla eklenebilir. 542 Veri Tabanı İşlemleri PROSEDÜR YAZMA SQL Server’ın program yazarken kullanacağımız en önemli özelliklerinden biride Stored Procedure’ler yani saklı yordamlardır. Bu prosedürler bir defa yazılım veritabanına tanımlandıktan sonra sınırsız sayıda çağırabilirler. İşlemler ve sorgular veritabanı uzayında yapıldığından uygulamamızdan bir prosedür çağırırsak bize daha hızlı bir sonuç döndürecektir. Stored prosedürler metotlar ve fonksiyonlar gibi parametre alabilirler ve parametre döndürebilirler. Bir prosedür oluşturmak için create procedure anahtar kelimesini kullanmaktayız. Genel yapısı şu şekildedir; 543 C# 6.0 Create procedure prosedür_ismi Alınan parametrelet ve dışarıya verilecek parametreler As Begin İşlemler End Şeklinde bir yapısı vardır. Create procedure anahtar kelimelerini kullandığımız gibi proc şeklinde kısaltma halini de kullanabiliriz. Eğer bir hata yaptık veya stored prosedürümüzü güncellemek istiyorsak alter anahtar kelimesini kullanarak içinde gerekli değişikleri yapıp tekrar execute etmemiz gerekmektedir. 544 Veri Tabanı İşlemleri Unutmayın query penceresinde yaptığınız herşeyi etkinleştirmek için execute butonuna mutlaka basmanız gerekmektedir. Bu visual studio’da build ve run yapmanızla eş değerdir. Stored prosedürlerimi execute anahtar kelimesi ile çağırarak çalıştırabilmekteyiz. Execute anahtar kelimesini kullanabildiğimiz gibi kısaltması olan exec anahtar kelimesinide kullanabiliriz. Bu şekilde stored prosedür içindeki işlem gerçekleşecektir. 545 C# 6.0 Bir başka stored prosedür olarak insert işlemimizi dışarıdan parametre alarak yapan bir prosedür tanımlayalım. Bu sayede her seferinde insert values anahtar kelimelerini kullanmamıza gerek kalmayacak. Stored Procedure deki parametrelerimiz @ işareti ile belirtilen parametrelerdir. Insert işleminin values kısmınada bu parametreler aktarılmaktadır. 546 Veri Tabanı İşlemleri Bir stored prosedüre parametre aktarabildiğimiz gibi geri dönüş parametresi de alabilmekteyiz. Bu metot ve fonksiyonlarda gördüğünüz return ile döndürğünüz işlemin bir benzeridir. Profesyonel bir veritabanı tasarımı birden fazla tablo barındırmaktadır. Aşağıda birden fazla tablo barındıran bir veritabanını görebilirsiniz. 547 C# 6.0 Örneğin bu veritabanın sadece üye ID’sine sahip olarak 4 kolonu birbirine join ile eklediğimizde bir üyenin ürünlerine ulaşabiliriz. Veritabanı tasarımını iyi yaptığınız sürece tüm işlemlerinizi kolaylıkla gerçekleştirebilirsiniz. TEMEL TSQL BİLGİLERİ Yukarıda dizayn penceresinde tablo oluşturabildiğimiz gibi kodla da tablo oluşturabiliriz. create table yazarlar ( ID int primary key identity(100,10), isim varchar(20), soyisim varchar(20), yas int, dogumtarihi datetime, evlimi bit, tckimlik char(11) ) Şimdi yazarlar tablomuz üzerinde SQL Sorgulamada kullanacağımız en önemli özelliklere bakalım. Bunun için yazarlar tablomuza belli miktar kayıt attım. Bu sayede bu kayıtlar üzerinden sorgulama yapabileceğiz. Yazarlar tablo kayıtlarımız; 548 Veri Tabanı İşlemleri Şimdi bu kayıtlarımızlar birlikte çeşitli sorgulamalarımızı ve bunların nasıl çalıştığını inceleyelim. Bu sorgumuzda = operatörüyle yaşı 30’a eşit olanları getiriyoruz. Bu sorgumuzda <= operatörüyle yaşı 30’a eşit ve 30’dann küçük olanları getiriyoruz. Bu sorgumuzda >= operatörüyle yaşı 30’a eşit ve 30’dan büyük olanları getiriyoruz. 549 C# 6.0 Bu sorgumuzda != operatörüyle yaşı 30’a eşit olmayanları getiriyoruz. 550 Veri Tabanı İşlemleri Bu sorgumuzda !< operatörüyle yaşı 31’den küçük olmayanları getiriyoruz. Bu sorgumuzda !> operatörüyle yaşı 30’dan büyük olmayanları getiriyoruz. Bu sorgumuzda between ve and operatörüyle 18 ve 40 yaş arasında olan kişileri çağırıyoruz. 551 C# 6.0 Bu sorgumuzda yaşı 20 ile 40 arasında olmayanları çağırıyoruz. Bu sorgumuzda and operatörünü kullanıyoruz. Bu mantıksal bir operatördür. İf deyimlerinde kullandığımız && operatörüyle aynı işleve sahiptir. Evli ve yaşı 35’ten küçük olanları listeliyoruz. 552 Veri Tabanı İşlemleri Bu sorgumuzda or operatörünü kullanıyoruz. Bu mantıksal bir operatördür. İf deyimlerinde kullandığımız || operatörüyle aynı işleve sahiptir. Evli veya yaşı 35’ten küçük olanları listeliyoruz. Bu sorgumuzda distinct anahtar kelimesini kullanıyoruz. Aynı soyisim birden fazla kullansada sadece tekil olarak tüm soyisimleri getirmektedir. 553 C# 6.0 Bu sorgumuzda kolon değerimizi aritmetik işleme sokuyoruz. Aynı zamanda as anahtar kelimesi ile kolon ismine takma bir isim veriyoruz. Bu sorguda metin işlemleri yapıyor iki kolonu arasında boşluk olacak şekilde birleştirip kolona as operatörüyle takma isim veriyoruz. 554 Veri Tabanı İşlemleri Bu sorguda isim ve soyisim arasına bir nokta koyup sonunada @ işareti ekleyip bir domain ekliyoruz. Bunu mail takma ismi ile görüntülüyoruz. Order by ve asc anahtar kelimesiyle isim kolonuna göre kayıtları a’dan z’ye sıralıyoruz. 555 C# 6.0 Order by anahtar kelimesiyle isim kolonuna göre kayıtları a’dan z’ye sıralıyoruz. Asc kullanmadığımız zaman da a’dan z’ye sıralama yapmaktadır. Order by ve desc anahtar kelimeleri ile isim kolonuna göre tersten sıralıyoruz. 556 Veri Tabanı İşlemleri Bu sorguda top anahtar kelimesi ile en üstteki 5 kaydı alıyoruz. Bu sorguda yaşı büyükten küçüğe doğru sıralıyoruz ve en üstteki ilk kaydı alıyoruz. Bu sayede en yaşlı yazarımızı bulmuş oluyoruz. 557 C# 6.0 % karakteri ve _ karakterleri özel karakterlerdir. Alt çizgi yani _ karakteri sadece tek bir karakter yerine joker olarak geçer. % özel karakteri ise önüne veya arkasına aldığı değerlere göre ne olursa olsun tüm karakterleri getirir ve boyut önemsemez. V% dediğimiz anda v ile başlayan ve sonra ne olursa olsun tüm kayıtları getir demek istemekteyiz. Burada ismi v ile başlayıp soyadı r ile biten kaydı veya kayıtları listeliyoruz. Bu sorguda _ karakteri ile isminin ilk karakteri ne olursa olsun ama mutlaka ikinci karakterde a olsun devam önemli değil şeklinde bir sorgu yazmış bulunmaktayız. Upper fonksiyonu parametre olarak verdiğimiz kolondaki karakterlerinin hepsini büyük harflerle görmemizi sağlar. 558 Veri Tabanı İşlemleri lower fonksiyonu parametre olarak verdiğimiz kolondaki karakterlerinin hepsini küçük harflerle görmemizi sağlar. 559 C# 6.0 Bu sorgudaki max fonksiyonu parametre olarak aldığı kolondaki en büyük değeri döndürür. Bu sorgudaki min fonksiyonu parametre olarak aldığı kolondaki en küçük değeri döndürür. Avg fonksiyonu parametre aldığı kolonlardaki değerlerin ortalamasını döndürmektedir. Bu sorguda yazarlar tablosundaki yasların ortalaması alınmıştır. Count(*) fonksiyonu o sorgunun geri döndüğü kayıt sayısını vermektedir. Sum fonksiyonu parametre olarak aldığı kolondaki değerlerin toplamını vermektedir. 560 Veri Tabanı İşlemleri Substring fonksiyonu belirtilen kolonun hangi karakterler arasında kesme yapılacağını parametre olarak aldıktan sonra bunları ekrana yansıtmaktadır. Bu sorgumuzda group by anahtar kelimesi ile evlimi değelerine göre gruplandırma yaptık. Evlimi bir bit değeri olduğundan ve true,false değerlerini aldığında bize otomatik olarak iki grup oluşturdu. Bu iki grubunda ortalama yaş ortalamasını avg fonksiyonu ile aldık. 561 C# 6.0 Group by ile kullanılan having anahtar kelimesinde bir koşul belirledik ve sum fonksiyonu ile yaş kolonlarının toplamını aldık. Bazen sadece tek tablo ile çalışmaktan daha çok iki veya daha fazla tabloyu birleştirme ihtiyacı duyarız. Bunun için join dediğimiz kavram bizi büyük zorluklardan kurtarmaktadır. Bu sayede iki veya daha fazla tabloyu belirlediğimiz kurallara göre birleştirebilmekteyiz. İlk bahsedeceğimiz kavram inner join kavramıdır. Otomatik birleştirme yapmaya kalktığınızda da sql server inner join kullanacaktır. Inner join kullanarak iki tabloyu nasıl birleştirdiğinizi INNER JOIN tablosunda görebilirsiniz. Aynı zamanda kullanımı şöyledir; select * from tablo1 tab1 inner join tablo2 tab2 on tab1.ID = tab2.ID 562 Veri Tabanı İşlemleri Left outer join kullanarak iki tabloyu nasıl birleştirdiğinizi LEFT OUTER JOIN tablosunda görebilirsiniz. Left outer join kullanımı şöyledir; select * from tablo1 tab1 left outer join tablo2 tab2 on tab1.ID = tab2.ID Right outer join kullanarak iki tabloyu nasıl birleştirdiğinizi RIGHT OUTER JOIN tablosunda görebilirsiniz. Rigiht outer join kullanımı şöyledir; select * from tablo1 tab1 right outer join tablo2 tab2 on tab1.ID = tab2.ID 563 C# 6.0 Left outer join where null kullanarak iki tabloyu nasıl birleştirdiğinizi LEFT OUTER JOIN Where Null tablosunda görebilirsiniz. Left outer join where null kullanımı şöyledir; SELECT tab1.*,tab2.* FROM tablo1 tab1 LEFT OUTER JOIN tablo2 tab2 ON tab1.ID = tab2.ID WHERE tab2.ID IS NULL Full outer join where null kullanarak iki tabloyu nasıl birleştirdiğinizi FULL OUTER JOIN Where Null tablosunda görebilirsiniz. Full outer join where null kullanımı şöyledir; SELECT t1.*,t2.* FROM Table1 t1 FULL OUTER JOIN Table2 t2 ON t1.ID = t2.ID WHERE t1.ID is NULL or t2.ID IS NULL 564 Veri Tabanı İşlemleri Veritabanına bağlanma Veri tabanına bağlanırken bağlantı cümlecikleri yazarlarız. Bu cümleciklerin isimleri connection stringlerdir. Öncelikle bu stringleri nasıl tanımlayabileceğimizi incelyeceğiz. Bu connection stringleri standar güvenlik veya farklı seçenekler sunarlar. Onlardan birini seçmemiz gerekecektir. Standart Güvenlik Data Source=Sunucu_Adresi;Initial Catalog=DataBase_İsmi;User Id=Kullanıcı_ ismi;Password=Şifre; Birden fazla SQL Server insatance’ı bulunun yani bir serverda birden fazla SQL Server Database Engine kurulu olan yerde Sunucu_Adresi kısmında Sunucu_Adresi\instanceİsmi şeklinde kullanın Eğer SQL Server 2008 Express kullanıyorsanız Sunucuisminden sonra Sunucuismi\ SQLEXPRESS şeklinde DATA Source’u belirtmeyi unutmayın. Standart Güvenlik ve alternaf yazım Bu Connection String’de bir önceki ile aynı etkiyi yapmaktadır. Birden fazla anahtar kelime olduğu için çeşitli şekillerde gösterilebilmektedir. Server=Sunucu_Adresi;Database=DataBase_İsmi;User ID=Kullanıcı_ İsmi;Password=Şifre;Trusted_Connection=False; Güvenli (Trusted) Bağlantı Data Source=Sunucu_İsmi;Initial Catalog=DataBase_İsmi;Integrated Security=SSPI; Güvenli (Trusted) Bağlantı ve alternaf yazım Bu Connection String’de bir önceki ile aynı etkiyi yapmaktadır. Birden fazla anahtar kelime olduğu için çeşitli şekillerde gösterilebilmektedir. Server=Sunucu_İsmi;Database=DataBase_İsmi;Trusted_Connection=True; SQL Server instance’ına bağlanmak Yukarıda belirtildiği gibi bir sunucuda birden fazla SQL Server DatabaseEngin yani insatance kurulumu varsa aşağıdaki gibi connection string’i düzenlemeniz gerekmektedir Server=Sunucuismi\Instance_ismi;Database=DataBase_ismi;Trusted_Connection=True; Windows CE kullanan aygıtlar için Trusted Bağlantı 565 C# 6.0 SSPI veya Trusted bağlantı kullanmanız gerekmektedir. Bunun için aşağıdaki cümleciği kullanın Data Source=Sunucu_Adresi;Initial Catalog=DataBase_İsmi;Integrated Security=SSPI;User ID=Domainİsmi\Kullanıcıİsmi;Password=Şifre; Bu cümlecik sadece CE aygıtları üstünde çalışacaktır. IP adresi bağlantı yolu ile Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=DataBase_İsmi;User ID=Kullanıcı_İsmi;Password=Şifre; DBMSSOCN=TCP/IP. SQL Server’ın varsayılan bağlantı portu 1433’dür Data source bu portu kullanır. MARS (multiple active result sets) Kullanımı Server=Sunucu_Adresi;Database=DataBase_İsmi;Trusted_Connection=True; MultipleActiveResultSets=true; Yerel SQL Server Express bağlantısınıda database’i ekleyerek bağlantı kurmak Server=.\SQLExpress;AttachDbFilename=c:\asd\qwe\mydbfile.mdf;Database=DataBase_ İsmi; Trusted_Connection=Yes; Niçin database parametrelerine ihtiyacımız var ? Eğer bu isimde bir database mevcutsa, bu database’i SQL Server tekrar attach etmeyecek. Database dosyasını attach etmek ve bunu ihtiva eden lokasyonu SQL Server Express kurulumuna göstermek Server=.\SQLExpress;AttachDbFilename=|DataDirectory|databasedosyaismi.mdf; Database=DataBase_İsmi;Trusted_Connection=Yes; Niçin database parametrelerine ihtiyacımız var ? Eğer bu isimde bir database mevcutsa, bu database’i SQL Server tekrar attach etmeyecek. Database mirroring yaparken kullanacağımız SQL Server bağlantı string’i Data Source=Sunucu_Adresi;Failover Partner=MirrorServer_Adesi;Initial Catalog=DataBase_İsmi;Integrated Security=True; Asenkron işlemlerde SQL Server bağlantısının asenkron isteklere cevap verebilmesi için aşağıdaki string’i kullanmalısınız. Server=Sunucu_Adresi;Database=DataBase_İsmi;Integrated Security=True;Asynchronous Processing=True; 566 Veri Tabanı İşlemleri Insert işlemi Veritabanı işlemleri yaparken öncelikle herhangi bir sql komutunu çalıştırabileceğimizi bilmenizi isterim. Bunun için öncelikle connection stringimizi belirledikten sonra SqlConeection sınıfımızda oluşturduğumuz nesneye bunu parametre olarak veriyoruz ardından sqlcommand sınıfımızdan nesne oluşturup bu nesnenin CommandText özelliğine çalıştırmak istediğimiz sorguyu string olarak tanımlıyoruz. String komutumuzda + ve string işlemleri ile birleştirme yapaibldiğimiz için dinamik sql cümlecikleri yazabiliyoruz. Bu işlemi tanımlamak içinde SqlCommand sınıfımızdan oluşturduğumuz nesnenin CommandType özelliğine CommandType.Text atamasını yapıyoruz. Ardından Connectionımızı Open metodu ile açtıktan sonra sqlcommand sınıfından oluşturduğumuz nesne üzerinden ExecuteNonQuery() metotunu çalıştırıyoruz. İsterseniz bir int türünden değişkene bu metodun geri dönüşünü atayabilirsiniz bu sayede kaç kolonun etkilendiğini görebilirsiniz. Burada cümleciğimiz inser işlemi olduğundan dolayı insert işlemini gerçekleştirmiş oluyoruz. public bool insert_islemi(string deger1, string deger2,string deger3) { string con = “Data Source=(local);Initial Catalog=database_ismi;User Id=sa;Password=sifre_buraya;”; SqlConnection sqlConnection1 = new SqlConnection(con); SqlCommand cmd = new SqlCommand(); Int32 rowsAffected; cmd.CommandText = “insert tablo_ismi(isim,soyisim,yas,sehir) values(‘” + deger1 + “’,”+deger2+”,’”+deger3+”’”; cmd.CommandType = CommandType.Text; cmd.Connection = sqlConnection1; try { sqlConnection1.Open(); rowsAffected = cmd.ExecuteNonQuery(); } catch (SqlException hata) { return false; } finally { sqlConnection1.Close(); } } return true; 567 C# 6.0 Aynı işlemi bu sefer storedprocedure çalıştırarak parametre aktarması yapacağız. Fakat bu sefer bazı metotlar ve nesneler değişiklik göstermektedir. Bu sefer SqlCommand sınıfından nesnemize stored procedure ismini veriyoruz. Aynı zamanda CommandType olarak StoredProcedure seçeneğini seçmekteyiz. SqlDataReader burada sorgudan dönen geri dönüşü almaktadır. public bool insert_with_sp(string deger) { SqlConnection conn = null; SqlDataReader rdr = null; string prm = deger; try { conn = new SqlConnection(“Data Source=(local);Initial Catalog=databas_ismi;User Id=sa;Password=sifre_buraya;”); conn.Open(); SqlCommand cmd = new SqlCommand(“insert_procedure “, conn); cmd.CommandType = CommandType.StoredProcedure; deger)); } cmd.Parameters.Add(new SqlParameter(“@parametre_ismi”, rdr = cmd.ExecuteReader(); } catch { return false; } return true; Update işlemi Insert cümlecğinide yaptığımız işlemin aynısını eğer sql cümleciği yazıyorsak update cümleciğinde de kullanabiliriz. Sadece update cümelciğinde değil herhangi bir sql cümleciğide kullanabiliriz. public bool update_islemi(string deger) { string con = “Data Source=(local);Initial Catalog=kisiler;User Id=sa;Password=sifreburaya;”; SqlConnection sqlConnection1 = new SqlConnection(con); SqlCommand cmd = new SqlCommand(); Int32 rowsAffected; cmd.CommandText = “UPDATE tablo_ismi set kolon_ismi=’” + deger + “’ WHERE ID=’5’”; 568 Veri Tabanı İşlemleri cmd.CommandType = CommandType.Text; cmd.Connection = sqlConnection1; try { sqlConnection1.Open(); rowsAffected = cmd.ExecuteNonQuery(); } catch (SqlException hata) { return false; } finally { sqlConnection1.Close(); } } return true; Insert prosedürümüzle aynı mantıkta çalışan update prosedürümüzün kod tarafında çağrımı aynı şekildedir. public bool update_with_sp(string deger,string kosul) { SqlConnection conn = null; SqlDataReader rdr = null; string prm = deger; string prm2 = kosul; try { conn = new SqlConnection(“Data Source=(local);Initial Catalog=databas_ismi;User Id=sa;Password=sifre_buraya;”); conn.Open(); SqlCommand cmd = new SqlCommand(“insertsp”, conn); cmd.CommandType = CommandType.StoredProcedure; ismi1”, prm)); ismi1”, prm2)); cmd.Parameters.Add(new SqlParameter(“@parametre_ cmd.Parameters.Add(new SqlParameter(“@parametre_ rdr = cmd.ExecuteReader(); } catch { return false; } } return true; 569 C# 6.0 Insert ve update işlemleriyle aynı şekilde çalıştırdığımız delete cümeleciği ile istediğimi kolonu silebiliriz. Delete işlemi public bool delete_islemi(string deger1, string deger2) { string con = “Data Source=(local);Initial Catalog=databas_ ismi;User Id=sa;Password=sifre_buraya;”; SqlConnection sqlConnection1 = new SqlConnection(con); SqlCommand cmd = new SqlCommand(); Int32 rowsAffected; cmd.CommandText =”delete from veri where isim=’” + deger1 + “’ and yas=”+deger2+””; cmd.CommandType = CommandType.Text; cmd.Connection = sqlConnection1; try { sqlConnection1.Open(); rowsAffected = cmd.ExecuteNonQuery(); } catch (SqlException hata) { return false; } finally { sqlConnection1.Close(); } } return true; Aynı şekilde parametre verdiğimiz bir delete prosedürü ile silme işleminide gerçekleştirebiliriz. public bool delete_with_sp(string deger,string kosul) { SqlConnection conn = null; SqlDataReader rdr = null; string prm = deger; string prm2 = kosul; try { conn = new SqlConnection(“Data Source=(local);Initial Catalog=databas_ismi;User Id=sa;Password=sifre_buraya;”); conn.Open(); SqlCommand cmd = new SqlCommand(“insertsp”, conn); 570 Veri Tabanı İşlemleri cmd.CommandType = CommandType.StoredProcedure; ismi1”, prm)); ismi1”, prm2)); cmd.Parameters.Add(new SqlParameter(“@parametre_ cmd.Parameters.Add(new SqlParameter(“@parametre_ rdr = cmd.ExecuteReader(); } catch { return false; } return true; } Değer döndüren Stored Procedure kullanma Bu bölümde değer döndüren yani output parametresi olan stored prosedürleri incelemiştik. Output parametreyi alabilmek için ParameterDirection.Outpur özelliğini kullanmamız gerekmektedir. Aynı zamanda SqlCommand sınfıından türetilmiş nesnemizin parametresinin direction özelliğine bunu atamamız gerekmektedir. Bu sayede integer, string, bool veya herhangi bir veri tipinden nesneyi kullanabilir duruma gelmekteyiz. private int get_id(string deger) { int idnum = 0; SqlConnection conn = new SqlConnection(“Data Source=(local);Initial Catalog=databas_ismi;User Id=sa;Password=sifre_ buraya;”); SqlCommand cmd = new SqlCommand(“cheopsmobile.get_id”, conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(“@ID”, SqlDbType.Int, 50); cmd.Parameters.Add(“@deger”, SqlDbType.NVarChar, 50); cmd.Parameters[“@ID”].Direction = ParameterDirection. Output; cmd.Parameters[“@deger”].Value = deger; cmd.Connection = conn; try { conn.Open(); cmd.ExecuteNonQuery(); idnum = Convert.ToInt32(cmd.Parameters[“@ID”].Value); } 571 C# 6.0 } catch { return 0; } conn.Close(); return idnum; Stored prosedürlerden sadece bir veri tipinden değişken dönmeyebilir aynı zamanda tüm tablo ve değişen aralıkta kolonu olan tablolar dönebilir. Bu tabloyu tutabilmek için DataTable sınıfından bir veri türü tanımlamamız gerekmektedir. DataTable tüm tabloyu kendi içinde tutabilir ve farklı türlerde bu veriyi ayrıştırabiliriz. public DataTable sehirleri_al() { DataTable dt = null; try { SqlConnection connection = new SqlConnection(connectionstr); SqlCommand command = new SqlCommand(“sehirgetir”, connection); command.CommandType = CommandType.StoredProcedure; dt = new DataTable(); SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(dt); } catch { return null; } return dt; } Arama yapma Arama yaparken yine bir tablo döndüre prosedür kullanmamız gerekmektedir. Aradığımız tek bir değişken değilse geriye tablo döndürmemiz gerekmekte. Prosedürümüzün sql cümleciğini T-SQL deki where, between and gibi anahtar kelimelerle yapılandırmalıyız. public DataTable tablodonduren_prosedur_parametreli(string MemberID) { DataTable dt=null; try { 572 Veri Tabanı İşlemleri SqlConnection connection = new SqlConnection(connectionstr); SqlCommand command = new SqlCommand(“tabloal”, connection); command.CommandType = CommandType.StoredProcedure; SqlParameter parametre = new SqlParameter(“@MemberID”, SqlDbType.Int); parametre.Value = MemberID; command.Parameters.Add(parametre); dt = new DataTable(); SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(dt); } catch { return null; } return dt; } Gridleri Kullanma Gridleri kullanmak için toolbox içinden DataGridView kontrolünü projemize eklememiz gerekmektedir. Ardından DataGridView için DataSoruce eklememiz gerekmektedir. Bu menüyü DataGridView kontrolünün üstündeki ok işaretine basarak bulabilirsiniz. 573 C# 6.0 Eğer projenize daha önce datasource eklememişseniz datasource kısmında none seçeneğini göreceksiniz. Add Project Data Source seçeneğiyle projenize data source ekleyebilirsiniz. Bu butona bastıktan sonra Data Source Configuration sihirbazı açılacaktır. Açılan pencerede Database seçeneğini seçmemiz gerekmektedir. 574 Veri Tabanı İşlemleri Ardından gelen pencerede DataSet sekmesine basmamız gerekmektedir. Daha sonra next butonu ile devam edelim. Gelen pencerede yeni bir connection oluşturmak için new connection butonuna basmamız gerekmektedir. 575 C# 6.0 Server ismi olarak SQL Server Engine’in kurulu olduğu IP adresini girebilirsiniz. Eğer o an bilgisayarınızda kurulu SQL Server Engine’ini kullanacaksanız (local) yazarak bu durumu belirlemeniz gerekmektedir. 576 Veri Tabanı İşlemleri Eğer SQL Server kurulumunda herhangi bir şifre belirlemediyseniz ve kurulumu Windows Authentication modunda yaptıysanız Windows Authetication seçmeniz yeterlidir. SQL Server kurulurken System Administrator için bir şifre belirlediyseniz SQL Server Authentication kullanmanız gerekmektedir. İlk kurulum şifreniz için kullanıcı ismi sa ve şifrede belirlediğiniz karakterlerdir. Farklı bir kullanıcı ve şifre tanımladıysanız onu da kullanabilirsiniz. Kullanacağınız veritabanınıda seçtikten sonra bağlantıyı test connection ile test etmeniz gerekmektedir. Ardından next butonuna basıyoruz. 577 C# 6.0 Açılan pencerede tablolar, viewler, stored prosedürler ve fonksiyonları görebilirsiniz. Bu sayede DataGridView kontrolüne gelecek verileri veya tabloları belirleyebilirsiniz. Örneğimiz bir tablo seçtik. Bu tablonun tüm kolonlarını seçtiğimiz için ID,urun_ismi ve urun_ tanimi kolonlarıda Grid’e eklenmiştir. 578 Veri Tabanı İşlemleri Formumuzun üstünde DataGridView kontrolüne eklenmiş ve çalışan bir tabloyu görebilirsiniz. Tablodaki tüm verileri gridde listeleyecektir. DataGridView kontrolü ile ilgili tüm özellikleri ve seçimleri properties penceresinden yapabilirsiniz. 579 C# 6.0 Otomatik WinForm yetenekleriyle işlem yapma Windows Formlarla işlem yaparken bir çok veritabanı kontrolünü projenize ekleyebilir bunlarla hem kod tarafından hem de kullanıcı arayüzü kısmında işlemler yapabilirsiniz. En sık kullanılan bileşenlerden biriside DataSet’tir. Toolbox’tan DataSet bileşinini formunuza sürükleyip bırakmanız yeterlidir. 580 Veri Tabanı İşlemleri DataSet’inizin tipini seçerek saklayacağı verileri düzenleyebilirsisniz. Dataset bileşenini formunuza sürüklediğinizde ilk defa sürüklediyseniz dataset1 ismiyle görebilirsiniz. Bu isim değiştirilebilir bir isimdir. 581 C# 6.0 Bir başka bileşinimizde BindingSoruce bileşenidir. BindinSource bileşeninin DataSource’unu belirleyebilir veya yeni DataSource kullanabilirsiniz. 582 Veri Tabanı İşlemleri Add Project Data Source seçeneğiyle bu seçimi yapabilirsiniz açılan pencereden yine Database ikonunu seçip next butonuna basmalısınız. 583 C# 6.0 DataSet seçiminide yaptıktan sonra diğer adımları DataGridView kontrolünde olduğu şekilde tekrar edebilirsiniz. BindingNavigator kontrolü oldukça başarılı bir kontroldür. Bağlı veritabanı kayıtları arasında gezinme yapabilirsiniz. 584 Veri Tabanı İşlemleri Bir çok profesyonel uygulama veritabanından aldığı verileri anlamlandıran çizelgelerden oluşur. Bu çizelgeler Pie Chart, Bar Chart gibi oldukça tercih edilen çizelgeler olabilmektedir. Araç kutumuzda veri tabanı kayıtları ile de bağlanabilecek chart kontrolüde bulunmaktadır. Bu kontrolüde uygulamanızda kullanabilirsiniz. 585 C# 6.0 Combobox doldurma Herhangi bir combobox’ı formunuza sürüklediğiniz daha önce oluşturduğunuz DataSource’lardan birini bu kontrole bağlayıp veritabanından beslenmesini sağlayabilirsiniz. Bunun için üzerindeki küçük ok sekmesine tıklamanız gerekmektedir. Açılan pencereden DataSource kısmını seçtikten sonra Display Member özelliği için dönen değerlerden herhangi birisini kullanabilirsiniz. Data source yoksa önceki kısımlarda anlattığımız şekilde datasource ekleyip bu kolonları ondan sonra seçebilirsiniz. 586 Veri Tabanı İşlemleri Combobox kontrolünde Display Member alanı olduğu gibi Value Member alanınada değer atayabilirsiniz. Bir tanesi görünen değer diğer ise o görünen string ifadenin anahtar değeri olarak kullanabilirsiniz. Bir formda çalışan ve veritabanından veri çeken combobox uygulamasının örneğini görebilirsiniz. 587 C# 6.0 Listbox doldurma Herhangi bir listbox’ı formunuza sürüklediğiniz daha önce oluşturduğunuz DataSource’lardan birini bu kontrole bağlayıp veritabanından beslenmesini sağlayabilirsiniz. Bunun için üzerindeki küçük ok sekmesine tıklamanız gerekmektedir. Açılan pencereden DataSource kısmını seçtikten sonra Display Member özelliği için dönen değerlerden herhangi birisini kullanabilirsiniz. Data source yoksa önceki kısımlarda anlattığımız şekilde datasource ekleyip bu kolonları ondan sonra seçebilirsiniz. 588 Veri Tabanı İşlemleri listbox kontrolünde Display Member alanı olduğu gibi Value Member alanınada değer atayabilirsiniz. Bir tanesi görünen değer diğer ise o görünen string ifadenin anahtar değeri olarak kullanabilirsiniz. Bir formda çalışan ve veritabanından veri çeken listbox uygulamasının örneğini görebilirsiniz. 589 C# 6.0 MySQL ile Çalışma MySQL, çok sayıda sistemde çalışan multi threaded ve çok kullanıcılı bir veritabanı yönetim sistemidir. SQL Server sürümlerine bir alternatif olarak düşünebiliriz. Gerçek düyna da SQL Server’a rakip olabilecek birden fazla Veritabanı Yönetim Sistemi bulunmaktadır. Oracle DB saymazsak MySQL en çok kullanılan alternatiflerden biridir. Aynı zamanda sadece Windows platformlarında değil UNIX, OS/2 ve Linux platformlarında da hızlı bir performans sergilemektedir. Açık kaynak kodlu bir sistem olduğu için diğer platformlarada port edilebilir durumdadır. ODBC sürücüleri olduğundan .NET üzerinde de kolaylıkla MySQL veritabanı yönetim sistemine erişerek MySQL tabanlı uygulamalar geliştirebiliriz. MySQL tarihçesi şöyledir (Wikipedia’dan alıntıdır); 1994 MySQL’in geliştirilmesine başlandı. 1995 MySQL ilk sürümü yayınlandı. 2001 yılında MySQL 3.23 yayınlandı. 2004 MySQL 4.1 beta sürümü, ve gerçek sürümü Ekim 2004 yılında yayınlandı. (R-trees and B-trees, subqueries, prepared statements) 2008: MySQL 5.1 sürümü yayınlandı. (event scheduler, partitioning, plugin API, row-based replication, server log tables) 2008 Ocak: Sun Microsystems, bir milyar dolara MySQL’i satın aldı. 2009 Nisan: Oracle, Sun Microsystems’i satın aldı. Oracle, MySQL’i geliştirmeye devam edeceğini duyurdu. MySQL Aşağıdaki yapıladı desteklemektedir; Tables (Tablo) Views (Görüntü) (Görüntüleme) Procedures (Prosedür) 590 Veri Tabanı İşlemleri Triggers Cursors MySQL veritabanı yönetim sistemini kurduktan sonra doğrudan .NET uygulamaları altında C# ile geliştirme yapamazsınız. Bunun için .NET Connector’a ihtiyacınız var. MySQL ADO.NET sürücüsünü mysql sitesinden indirebilirsiniz. MySQL sürücüsünü kurmak indirdikten sonra bilgisayarınıza şöyle kurabilirsiniz; Setup Type kısmında istediğiniz kurulum tipini seçeceksiniz. 591 C# 6.0 Complete seçeneğini seçerseniz tüm frameworkler ve compact framework gibi alternatif araçlarda sisteminize yüklenecektir. 592 Veri Tabanı İşlemleri MySQL veritabanı motorunun yönetimini yapacağınız uygulama MySQL Workbench uygulamasıdır. Bu uygulama SQL Server üstündeki Management Studio’ya denk gelmektedir. Workbench ekranı üstünden birden fazla connection ekleyebilir veya yerel sunucunuzdaki verilerle çalışıp yönetebilirsiniz. 593 C# 6.0 Workbenc üzerinde birden fazla araç barınmaktadır. 594 Veri Tabanı İşlemleri Tables, Views, Stored Procedures ve Functions kısmından işlevsel tüm özellikleri kullanabilirsiniz. Aynı SQL Server üzerinde kullandığımız sql cümleciklerini ufak bazı değişikliklerle MySQL üzerinde de kullanabilirsiniz. Select * from yapısı aynı şekilde MySQL içinde de geçerlidir. Farklı bir lokasyondaki veritabanına bağlanmak için aynı şekilde connect to database seçeneğini seçerek bağlantı sağlayabilirsiniz. 595 C# 6.0 .NET uygulamamızda C# ile MySQL bağlantılı yazılım yazmak için öncelikle referanslar kısmından yüklediğimiz mysql connector’un dll paketlerini eklememiz gerekmektedir. Kullanacağımız MySQL.Data referansı bize gerekli alt yapıyı sağlayacaktır. Aynı zamanda Entity Framework yapısı içinde destek bulunmaktadır. 596 Veri Tabanı İşlemleri Referanslara eklediğimizde MySql.Data başlığının projemize eklenmiş olduğunu görebiliriz. Uygulamamızı yazarken gerekli olan namespace’ler MySql.Data, MySql, MySql.Data. MySqlClient isim alanlarıdır. Sql Server kodlaması yaparken kullandığımız SqlConnection gibi sınıfların isimleri bu isim alanı altında MySqlConnection gibi ufak değişiklikler göstermiştir. Aynı şekilde SqlCommand MySql ile kodlama yaparken MySqlCommand ismini almıştır. 597 C# 6.0 SqlDataAdapter ismi ise MySqlDataAdapter olmuştur. Bu şekilde klasik Ado.NET kodlaması yapabilirsiniz. MySQL ile bağlanan ve işlemler yapan bir sınıf aşağıdaki şekilde tanımlanmış ve kodlanmıştır. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; using MySql.Data; using MySql; using MySql.Data.MySqlClient; namespace sample_db { public class dblayer { string connectionstr; public dblayer() { connectionstr = “Network Address=IP_Adresi;” + “Initial Catalog=’database_ismi’;” + “Persist Security Info=no;” + “User Name=’kullanıcı_ismi’;” + “Password=’parola’”; } public DataTable etkinlikleri_al() { DataTable dt = null; try { MySqlConnection connection = new MySqlConnection(connectionstr); string mysqlquery = “SELECT * FROM sample_db.etkinlik order by etkinlik.tarih desc”; MySqlCommand command = new MySqlCommand(mysqlquery, connection); connection.Open(); dt = new DataTable(); MySqlDataAdapter adapter = new MySqlDataAdapter(command); adapter.Fill(dt); } 598 Veri Tabanı İşlemleri } catch { return null; } return dt; public DataTable projeleri_al() { DataTable dt = null; try { MySqlConnection connection = new MySqlConnection(connectionstr); string mysqlquery = “SELECT * FROM sample_db.proje order by id desc”; MySqlCommand command = new MySqlCommand(mysqlquery, connection); connection.Open(); dt = new DataTable(); MySqlDataAdapter adapter = new MySqlDataAdapter(command); adapter.Fill(dt); } catch { return null; } return dt; } public DataTable haberleri_al(string baslangic, string bitis) { DataTable dt = null; try { MySqlConnection connection = new MySqlConnection(connectionstr); string mysqlquery = “SELECT * FROM sample_db.haber where yayin_tarihi between “ + baslangic + “ and “ + bitis + “order by haber.yayin_tarihi desc”; MySqlCommand command = new MySqlCommand(mysqlquery, connection); connection.Open(); dt = new DataTable(); MySqlDataAdapter adapter = new MySqlDataAdapter(command); adapter.Fill(dt); } catch { return null; } return dt; 599 C# 6.0 } public DataTable duyurulari_al(string baslangic, string bitis) { DataTable dt = null; try { MySqlConnection connection = new MySqlConnection(connectionstr); string mysqlquery = “SELECT * FROM sample_db.haber where yayin_tarihi between “+baslangic+” and “+bitis+” order by haber.yayin_tarihi desc”; MySqlCommand command = new MySqlCommand(mysqlquery, connection); connection.Open(); dt = new DataTable(); MySqlDataAdapter adapter = new MySqlDataAdapter(command); adapter.Fill(dt); } catch { return null; } return dt; } } } 600