burak selim Şenyurt - c# makaleleri

782

Click here to load reader

Upload: kemal-uncu

Post on 22-Jan-2016

494 views

Category:

Documents


217 download

DESCRIPTION

C# Makaleleri

TRANSCRIPT

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 1/782

    indekiler

    Konu Tarih Kategori Sayfa

    Stored Procedure Yardmyla Yeni Bir Kayt Eklemek 08.11.2003 Ado.Net 4 Web Sayfalarnda Stored Procedure Kullanm 12.11.2003 Asp.Net 9 Stored Procedure Yardmyla Tablodan Kayt Silmek 12.11.2003 Ado.Net 16 Overload Metodlarn Gc 13.11.2003 C# 24 Transaction Kavram 17.11.2003 Ado.Net 31 Distributed Transactions 19.11.2003 Ado.Net 39 Bir Form ve Kontrollerinin Elle Programlanmas 21.11.2003 C# 52 Params Anahtar Szcnn Kullanm 30.11.2003 C# 59 DataSet ve WriteXml Metodunun Kullanm 30.11.2003 Ado.Net 65 Enumerators 01.12.2003 C# 68 Basit Bir Web Service Uygulamas 01.12.2003 Web Servis 72 DataTable Snfn Kullanarak Programatik Olarak Tablolar Oluturmak-1 04.12.2003 Ado.Net 83 Struct (Yap) Kavram ve Class (Snf) ile Struct (Yap) Arasndaki Farklar 04.12.2003 C# 88 DataTable Snfn Kullanarak Programatik Olarak Tablolar Oluturmak-2 05.12.2003 Ado.Net 95 DataColumn.Expression zellii le Hesaplanm Alanlarn Oluturulmas 06.12.2003 Ado.Net 99 likili Tablolar DataSet le Kullanmak - 1 09.12.2003 Ado.Net 102 likili Tablolar DataSet le Kullanmak - 2 10.12.2003 Ado.Net 106 SQL_DMO lemleri 12.12.2003 Ado.Net 111 DataView Snf ve Faydalar 15.12.2003 Ado.Net 118 DataGrid Denetimi zerinde Sayfalama(Paging) lemi 16.12.2003 Ado.Net 124 DataGrid Denetimi zerinde Sralama(Sorting) lemi 17.12.2003 C# 128 HashTable Koleksiyon Snf 18.12.2003 C# 132 Stack ve Queue Koleksiyon Snf 19.12.2003 C# 135 Reflection Snf le Tiplerin Srr Ortaya kyor 22.12.2003 C# 140 Bir Snf Yazalm 23.12.2003 C# 148 Virtual(Sanal) Metodlar 25.12.2003 C# 155 Kaltm (Inheritance) Kavramna Ksa Bir Bak 25.12.2003 C# 160 SqlDataReader Snf 1 28.12.2003 Ado.Net 167 SqlDataReader Snf 2 29.12.2003 Ado.Net 172 Boxing (Kutulamak) ve Unboxing (Kutuyu Kaldrmak) 30.12.2003 Ado.Net 178 XmlDataDocument Yardmyla Xml Verilerini DataSete Aktarmak 30.12.2003 C# ok Kanall(Multithread) Uygulamalar 01.01.2004 C# 184 StreamReader Snf Yardmyla Dosya Okumak 01.01.2004 Ado.Net 189 Thread'leri Belli Sreler Boyunca Uyutmak ve Yoketmek 02.01.2004 C# 192 Thread'lerde ncelik(Priority) Durumlar 05.01.2004 C# 198 e Yarar Bir MultiThreading(ok Kanall) Uygulama rnei 06.01.2004 C# 206 ArrayList Koleksiyonu ve DataGrid 07.01.2004 C# 211 Interface (Arayz) Kullanmna Giri 08.01.2004 C# 219 Arayz(Interface), Snf(Class) ve oklu Kaltm 09.01.2004 C# 225 Arayzler'de is ve as Anahtar Szcklerinin Kullanm 12.01.2004 C# 229 Bir Arayz, Bir Snf ve Bir Tablo 14.01.2004 C# 233 Checked, Unchecked Anahtar Kelimeleri ve OverFlow Hatas 15.01.2004 C# 241 Temsilciler (Delegates) Kavramna Giri 20.01.2004 C# 246 Net Data Providers(Veri Salayclar) 22.01.2004 Ado.Net 252 Sql Tablolarna Resim Eklemek 23.01.2004 Ado.Net 255 Sql Tablolarndaki Binary Resimlere Bakmak ve Dosya Olarak Kaydetmek 24.01.2004 Ado.Net 259 Indeksleyiciler (Indexers) 27.01.2004 C# 264 Tablo Deiikliklerini GetChanges ile zlemek 29.01.2004 Ado.Net 270 Stored Procedureler ve ParameterDirection Numaralandrcs 31.01.2004 Ado.Net 276 Strongly Typed DataSet - 1 (Kuvvetle Trlendirilmi Veri Kmeleri) 04.02.2004 Ado.Net 283

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 2/782

    Strongly Typed DataSet - 2 (Kuvvetle Trlendirilmi Veri Kmeleri) 05.02.2004 Ado.Net 292 Data Form Wizard Yardmyla likili Tablo Uygulamalarnn Hazrlanmas 09.02.2004 Ado.Net 300 GetOleDbSchemaTable Metodu le Veritabanmzda Ne Var Ne Yok 12.02.2004 Ado.Net 316 Connection (Balant) Kavram ve OleDbConnection Snf 13.02.2004 Ado.Net 322 Batch Queries (Toplu Sorgular) ve SqlDataReader 17.02.2004 Ado.Net 335 Command Kavram ve OleDbCommand Snf 23.02.2004 Ado.Net 339 DataAdapter Kavram ve OleDbDataAdapter Snfna Giri 27.02.2004 Ado.Net 354 OleDbDataAdapter Snf - 2 02.03.2004 Ado.Net 369 OleDbDataAdapter Snf ve Update Metodu. 14.03.2004 Ado.Net 384 OleDbDataAdapter Snf Olaylar 18.03.2004 Ado.Net 391 DataTable.Compute Metodu 29.03.2004 Ado.Net 401 DataRelation Snf ve oa-ok (Many-to-many) likiler 01.04.2004 Ado.Net 406 likiler ve Hesaplanm Alanlarn Bir Arada Kulllanlmas 08.04.2004 Ado.Net 415 Private Assembly ve Shared Assembly Kavram 22.04.2004 Framework 418 Single File Assembly ve Multiple-File Assembly Kavramlar 27.04.2004 Framework 426 Windows Servislerine Giri 29.04.2004 Win Servis 437 Windows Servislerinin Kontrol -1 05.05.2004 Win Servis 449 Windows Servislerinin Kontrol - 2 ( Sistemdeki Servislerin Kontrol Edilmesi ) 12.05.2004 Win Servis 460 .NET Remoting'i Kavramak 22.05.2004 Remoting 470 XML Rapor Web Servisleri 10.06.2004 Web Servis 476 Transaction' larda SavePoint Kullanm 15.06.2004 Ado.Net 481 Transaction' larda Izolasyon Seviyeleri (Isolation Level) - 1 19.06.2004 Ado.Net 488 Transaction' larda Izolasyon Seviyeleri -2 (IsolationLevel Numaralandrcs) 28.06.2004 Ado.Net 497 NET Remoting' i Kavramak - 2 03.07.2004 Remoting 506 Transaction' larda DeadLock Kavram 07.07.2004 Ado.Net 512 NET Remoting' i Kavramak - 3 22.07.2004 Remoting 517 CurrencyManager ile Navigasyon ve Temel Satr lemleri 27.07.2004 Ado.Net 523 Identity Deerlerinin alma Zamannda Elde Edilmesi 29.07.2004 Ado.Net 530 Localization (Yerelletirme) - 1 05.08.2004 C# 537 Localization (Yerelletirme) 2 - Dil Destei 07.08.2004 C# 544 Asp.Net 2.0 ile Cross-Page Posting 31.08.2004 Asp.Net 550 Asp.Net 2.0 ve Code Klasr 01.09.2004 Asp.Net 557 Asp.Net 2.0 ile Veri Kmelerinde Sayfalama lemleri 01.09.2004 Asp.Net 564 Asp.Net 2.0 iin Site Map Kullanm 03.09.2004 Asp.Net 568 Asp.Net 2.0 ve Temalar (Themes) 03.09.2004 Asp.Net 575 Asp.Net 2.0 ve TreeView Kontrol 06.09.2004 Asp.Net 581 Asp.Net 2.0 GridView Kontrolnde Update,Delete lemleri 07.09.2004 Asp.Net 589 Asp.Net 2.0 DetailsView Kontrol ile Insert,Update,Delete 08.09.2004 Asp.Net 598 Asp.Net 2.0 ve Master Page Kavram 10.09.2004 Asp.Net 603 Asp.Net 2.0 ve ObjectDataSource Kontrol 14.09.2004 Asp.Net 612 Ado.Net 2.0 ve Bulk-Data Kopyalama Mekanizmas 17.09.2004 Ado.Net 620 Ado.Net 2.0 ve Toplu Gncelleme lemleri (Batch-Updates) 18.09.2004 Ado.Net 632 Ado.Net 2.0 ile Mars' a Ayak Basyoruz 20.09.2004 Ado.Net 637 Ado.Net 2.0 ve Sql Komutlarn Asenkron Olarak Yrtmek - 1 23.09.2004 Ado.Net 646 Ado.Net 2.0 ve Sql Komutlarn Asenkron Olarak Yrtmek - 2 25.09.2004 Ado.Net 654 Xml Web Servislerine Giri - 1 29.09.2004 Web Servis 658 Xml Web Servislerine Giri - 2 30.09.2004 Web Servis 667 Xml Web Servisleri - 3 ( Mimarinin Temelleri - SOAP) 01.10.2004 Web Servis 677 Xml Web Servisleri - 4 ( Mimarinin Temelleri - WSDL) 02.10.2004 Web Servis 687 Xml Web Servisleri - 5 (Mimarinin Temelleri - DISCO) 07.10.2004 Web Servis 700 Ado.Net 2.0 ve Sql Komutlarn Asenkron Olarak Yrtmek - 3 22.10.2004 Ado.Net 704 Ado.Net 2.0 ve SqlDependency Snf Yardmyla Query Notification 26.10.2004 Ado.Net 708 Oyun Programlamaya Giri (arpma Teknikleri - 1) 06.11.2004 C# 713 Oyun Programlamaya Giri (arpma Teknikleri - 2) 12.11.2004 C# 720 Oyun Programlamaya Giri (arpma Teknikleri - 3) 19.11.2004 C# 726

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 3/782

    Oyun Programlamaya Giri (Matrisler Yardmyla arpma Kontrol) 04.12.2004 C# 733 Ado.Net ile Sql Server Full-Text Searching (Tm Metinde Arama) Kullanm 18.12.2004 Ado.Net 744 Derinlemesine Session Kullanm 1 31.12.2004 Asp.Net 756 Derinlemesine Session Kullanm 2 08.01.2005 Asp.Net 764 Caching Mekanizmasn Anlamak - 1 21.01.2005 Asp.Net 777

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 4/782

    Stored Procedure Yardmyla Yeni Bir Kayt Eklemek

    Bu yazmzda Sql Server zerinde, kendi yazdmz bir Sakl Yordam (Sakl Yordam) ile , veritabanndaki ilgili tabloya nasl kayt

    ekleyeceimizi incelemeye alacaz.

    ncelikle, Sakl Yordamlar hakknda ksa bir bilgi vererek hzl bir giri yapalm. Sakl yordamlar derlenmi sql cmlecikleridir. Bunlar

    birer veritaban nesnesi olduklar iin, dorudan veritaban yneticisi olan programda (rnein Sql Server) yer alrlar. Bu nedenle

    veritabannz bir yere tadnzda otomatik olarak, sakl yordamlarnzda tam olursunuz. Bu Sakl Yordam'lerin tercih edilme

    nedenlerinden sadece birisidir. Dier yandan, derlenmi olmalar aslnda bu sql cmleciklerinin dorudan makine diline

    dntrld anlamna gelmez. Aslnda , altrmak istediimiz sql cmleciklerini bir Sakl Yordam iine yerletirerek, bunun bir

    veritaban nesnesi haline gelmesini ve altrldnda dorudan, veritaban yneticisini zerinde barndran sunucu makinede

    ilemesini salarz. Bu doal olarak, istemci makinelerdeki i ykn azaltr ve performans arttrr. Nitekim bir program iinde

    altrlan sql cmleleri, Sakl Yordam lardan ok daha yava sonu dndrr. Dolaysyla Sakl Yordamlar zellikle ok katl

    mimariyi uygulamak isteimiz projelerde faydaldr. Sakl Yordamlarn faydalarn genel hatlar ile zetlemek gerekirse ;

    ekil 1. Sakl Yordam Kullanmann Avantajlar.

    te bizim bugnk uygulamamzda yapacamz ilemde budur. Bu uygulamamzda basit bir Sakl Yordam yaratacak, SqlCommand

    nesnesinin CommandType zelliini, SqlParameters koleksiyonunu vb. kullanarak geni bir bilgi sahibi olucaz. ncelikle zerinde

    alacamz tablodan bahsetmek istiyorum. Basit ve konuyu hzl renebilmemiz asndan ok detayl bir kodlama teknii

    uygulamyacam. Amacmz Sakl Yordammza parametreler gndererek dorudan veritabanna kaydetmek olucak. Dilerseniz

    tablomuzu inceleyelim ve oluturalm.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 5/782

    ekil 2. Tablonun Yaps.

    ekil 2' de tablomuzda yer alan alanlar grlmekte. Bu tabloda arkadalarmzn doum gnlerini, ilerini , isim ve soyisim bilgilerini

    tutmay planlyoruz. Tablomuzda FriendsID isminde Primary Key olan ve otomatik olarak artan bir alanda yer alyor. imdi ise insert

    sql deyimini kullandmz Sakl Yordammza bir gze atalm.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 6/782

    ekil 3. Insert Friend Sakl Yordamnn Kodlar.

    ekil 3 kullanacamz Sakl Yordamn T-SQL(Transact SQL) deyimlerini gsteriyor. Burada grld gibi Sql ifademizin 4

    parametresi var. Bu parametrelerimiz;

    Parametre Ad Veri Tipi Veri Uzunluu Aklama

    @fn Nvarchar 50 First Name alan iin kullanlacak.

    @ln Nvarchar 50 Last Name alan iin kullanlacak.

    @bd Datetime - BirthDay alan iin kullanlacak.

    @j Nvarchar 50 Job alan iin kullanlacak.

    Tablo 1. Sakl Yordammzda Kullanlan Giri Parametreleri.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 7/782

    Insert Into Base (FirstName,LastName,BirthDay,Job) values (@fn,@ln,@bd,@j)

    cmlecii ile standart bir kayt ekleme ilemi yapyoruz. Tek nemli nokta values(deerler) olarak, parametre deerlerini gnderiyor

    olmamz. Bylece, Sakl Yordammz, .net uygulamamzdan alaca parametre deerlerini bu sql cmleciine alarak, tablomuz

    zerinde yeni bir satr oluturulmasn salyor. Peki bu parametre deerlerini .net uygumlamamzdan nasl vereceiz? Bunun iin

    uygulamamzda bu Sakl Yordam kullanan bir SqlCommand nesnesi oluturacaz. Daha sonra, Sakl Yordammzda yer alan

    parametreleri, bu SqlCommand nesnesi iin oluturacak ve Parameters koleksiyonuna ekleyeceiz. Bu ilemin tamamlanamasnn

    ardndan tek yapacamz Sakl Yordama geicek parametre deerlerinin, SqlCommand nesnesindeki uygun SqlParameter

    nesnelerine aktarlmas ve Sakl Yordamn altrlmas olucak.

    ncelikle C# iin yeni bir Windows Application oluturalm ve formumuzu aadaki ekilde dzenleyelim. Burada 3 adet textBox

    nesnemiz ve tarih bilgisini girmek iinde bir adet DateTimePicker nesnemiz yer alyor. Elbette insert ilemi iinde bir Button kontrol

    koymay ihmal etmedik. Ksaca formun ileyiinden bahsetmek istiyorum. Kullanc olarak biz gerekli bilgileri girdikten sonra insert

    balkl Button kontrolne bastmzda, girdiimiz bilgiler Sakl Yordam daki parametre deerleri olucak. Ardndan Sakl Yordammz

    altrlacak ve girdiimiz bu parametre deerleri ile, sql sunucumuzda yer alan veritabanmzdaki Base isimli tablomuzda yeni bir

    satr oluturulacak.

    ekil 4. Formun Tasarm Zamanndaki Grnts.

    imdide kodumuzu inceleyelim. Her zaman olduu gibi SQLClient snfna ait nesneleri kullanacamz iin bu snf using ile

    projemizin en bana ekliyoruz.

    using System;

    using System.Drawing;

    using System.Collections;

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 8/782

    using System.ComponentModel;

    using System.Windows.Forms;

    using System.Data;

    using System.Data.SqlClient;

    Srada veritabanna olan balantmz referans edicek olan SQLConnection nesnemiz var.

    SqlConnection conFriends = new SqlConnection("initial catalog=Friends;data source=localhost;integrated security=sspi;packet

    size=4096");

    Ksaca anlatmak gerekirse, SQL Sunucumuz' daki Friends isimli Database e balant salyacak bir SqlConnection nesnesi

    tanmladk. Burada SqlConnection snfnn prototipi aada verilen Constructor(yapc metodunu) metodunu kullandk.

    Bildiiniz gibi SqlConnection nesnesi, Sql Sunucusu ile ado.net nesneleri arasnda iletiimin salanabilmesi iin bir balant hatt

    tesis etmektedir.

    public SqlConnection(string connectionString);

    imdi btnInsert isimli butonumuzun click olay procedure' ndeki kodumuzu yazalm.

    private void btnInsert_Click(object sender, System.EventArgs e)

    {

    conFriends.Open();/* Baglanti ailiyor. SqlCommand nesnesi ile ilgili ayarlamalara geiliyor. Komut SQL Server da Friends

    databaseinde yazili olan "Insert Friend" isimli Sakl Yordam alistiracak. Bu Procedure n ismini, CommandText parametresine

    geirdikten sonar ikinci parameter olarak SqlConnection nesnemizi belirtiyoruz.*/

    SqlCommand cmdInsert = new SqlCommand("Insert Friend",conFriends);

    /* SqlCommand nesnesinin CommandType degerinide CommandType.StoredProcedure yapiyoruz. Bu sayede CommandTexte

    girilen deerin bir Sakl Yordame iaret ettiini belirtmi oluyoruz.*/

    cmdInsert.CommandType=CommandType.StoredProcedure;

    /* imdi bu Sakl Yordam iin gerekli parametreleri olusturacagiz. Bunun iin SqlCommand nesnesininin parameters

    koleksiyonunun Add metodunu kullaniyoruz. Parametreleri eklerken, parametre isimlerinin SQL Serverda yer alan Sakl

    Yordamlardaki parametre isimleri ile ayni olmasina ve baslarina @ isareti gelmesine dikkat ediyoruz. Bu Add metodunun ilk

    parametresinde belirtiliyor. Add metodu ikinci parametre olarak bu parametrenin veri tipini alyor. nc parametresi ise bu

    parametrik degiskenin boyutu oluyor.*/

    SqlParameter paramFirstName=cmdInsert.Parameters.Add("@fn",SqlDbType.NVarChar,50);

    /* Burada SqlCommand nesnesine @fn isimli nvarchar tipinde ve uzunluu 50 karaketerden olusan bir parametre ekleniyor.

    Ayn ekilde dier parametrelerimizi de belirtiyoruz.*/

    SqlParameter paramLastName=cmdInsert.Parameters.Add("@ln",SqlDbType.NVarChar,50);

    SqlParameter paramBirthDay=cmdInsert.Parameters.Add("@bd",SqlDbType.DateTime);

    SqlParameter paramJob=cmdInsert.Parameters.Add("@j",SqlDbType.NVarChar,50);

    // imdide paremetrelerimize degerlerini verelim.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 9/782

    paramFirstName.Value=txtFirstName.Text;

    paramLastName.Value=txtLastName.Text;

    paramBirthDay.Value=dtBirthDay.Text;

    paramJob.Value=txtJob.Text;

    // Bylece ilgili paremetrelere degerleri geirilmis oldu. simdi komutu alistiralim.

    cmdInsert.ExecuteNonQuery();

    /* Bylece Sakl Yordamimiz, paremetrelerine atanan yeni degerler ile alisitirlir. Bunun sonucu olarak SQL Server daki Sakl

    Yordama burada belirttiimiz parametre deerleri gider ve insert cmlecii altrlarak yeni bir kayit eklenmis olur.*/

    conFriends.Close(); // Son olarak SqlConnection mz kapatyoruz.

    }

    imdi bir deneme yapalm.

    ekil 5. Programn almas.

    ekil 6. Sakl Yordam'n ilemesinin Sonucu.

    Grld gibi Sakl Yordamlar yardmyla tablolarmza veri eklemek son derece kolay, hzl ve etkili. Bununla birlikte Sakl

    Yordamlar saladklar gvenlik kazanmlar nedeni ilede tercih edilirler. Sakl Yordamlar gelitirmek son derece kolaydr. stediini

    sql ilemini gerekletirebilirisiniz. Satr silmek, satr aramak gibi. Sakl Yordamlar ile ilgili bir sonraki makalemizde, tablolardan nasl

    satr silebileceimizi incelemeye alacaz. Bylece geldik bir makalemizin daha sonuna. Bir sonraki makalemizde grmek

    dileiyle hepinize mutlu gnler dilerim.

    Web Sayfalarnda Stored Procedure Kullanm

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 10/782

    Bugnk makalemde sizlere bir Web Sayfas zerinde, bir tablonun belli bir satrna ait detayl bilgilerin, bir Stored Procedure

    yardmyla nasl gsterileceini anlatmaya alacam. Uygulamamzda rnek olmas asndan, Kitap bilgileri barndran bir Sql

    tablosu kullanacam. Tablomuzun yapsn aadaki ekil 1 de grebilirsiniz. Temel olarak, kitap isimlerini, kitaplarn

    kategorilerini, yazar isimlerini , basm evi bilgilerini vb barndran bir tablomuz var. Bu tablonun rnek verilerini de ekil2 de

    grebilirsiniz.

    ekil 1. Kitaplar tablosunun alan yaps.

    ekil 2. Kitaplar tablosunun rnek verileri.

    imdi projemizin en nemli unsuru olan Stored Procedure nesnemizi Sql Server zerinde oluturalm. Bu Stored Procedure ile

    kullancnn, web sayfasnda listbox nesnesi iinden setii kitaba ait tm verileri dndrecek olan bir Sql cmlecii yazcaz.

    Burada aranan satr belirleyecek olan deerimiz ID isimli ayn zamanda Primary Key olan alann deeri olucaktr. Kullanc listBox

    nesnesinde yer alan bir kitab setiinde (yani listBox nesnesine ait lstKitaplar_SelectedIndexChanged olay procedure

    altrldnda) seili olan eye ait id numaras Stored Proceduremze parametre olarak gnderilicek. Elde edilen sonu

    kmesine ait alanlar dataGrid nesnemizde gsterilerek kitabmza ait detayl bilgilerin grntlenmesi salanm olucak. Dilerseniz

    Kitap Bul isimli Stored Proceduremz oluturarak devam edelim. ekil 3 yazdmz Stored Procedure nesnesini gstermekte.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 11/782

    ekil 3. Stored Procedure nesnemiz ve Sql ifadesi.

    Sra geldi uygulamamzda yer alan WebFormumuzu oluturmaya. Uygulamamz C# dili ile oluturmay tercih ettiimden New

    Project ksmnda Visual C# Proejct blmn setim. Dikkat edicek olursanz, uygulmamz bir Web Application dr. Oluturulduu

    yer http://localhost/kitap adl adrestir.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 12/782

    ekil 4. Web Application

    Evet gelelim WebFormun tasrmna. Ben aadaki gibi bir tasarm oluturdum. Sizlerde buna yakn bir tasarm oluturabilirsiniz

    veya aynsn kullanamay tercih edebilirsiniz.

    ekil 5. Web Form tasarm.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 13/782

    Sra geldi kodlarmz yazmaya. nce sayfa yklenirken neler olucan belirleyeceimiz kodlarmz yazmaya balayalm. zet olarak

    Page_Load olay procedurende Sql Server a balanp, Kitaplar tablosundan yanlzca ID ve Adi alanna ait deerleri alyoruz ve

    bunlar bir SqlDataReader nesnesi vastasyla, lstKitaplar isimli listBox nesnemize yklyoruz. Gelin kodumuzu yazalm, hem de

    inceleyelim.

    /* nce gerekli SqlConnection nesnemizi oluturuyor ve gerekli ayarlarmz yapyoruz.*/

    SqlConnection conFriends=new SqlConnection("initial catalog=Friends;Data Source=localhost;integrated security=sspi");

    private void Page_Load(object sender, System.EventArgs e)

    {

    if (Page.IsPostBack==false)

    {

    /* SqlCommand nesnemizi yaratyoruz. Bu nesne Select sorgusu ile Kitaplar tablosundan ID ve Adi alanlarnn deerlerini

    alcak. Alnan bu veri kmesi Adi alanna gre A'dan Z'ye sralanm olucak. Bunu salayan sql cmleciindeki, "Order By Adi"

    ifadesidir. Tersten sralamak istersek "Order By Adi Asc" yazmamz gerekir. */

    SqlCommand cmdKitaplar=new SqlCommand("Select ID,Adi From Kitaplar Order By Adi",conFriends);

    cmdKitaplar.CommandType=CommandType.Text; // SqlCommand'in command String'inin bir Sql cmleciine iaret ettiini

    belirtiyoruz.

    SqlDataReader dr; // Bir SqlDataReader nesnesi oluturuyoruz.

    /* SqlDataReader nesnesi ileri ynl ve sadece okunabilir bir veri ak salar. (Forward and Readonly) Bu da nesneden veri

    aktarmlarnn (rnein bir listboxa veya datagride) hzl almasna bir nedendir. Uygulamalarmzda, listeleme gibi sadece verilere

    bakmak amacyla altracamz sorgulamalar iin, SqlDataReader nesnesini kullanmak, performans asndan olumlu etkiler yapar.

    Ancak SqlDataReader nesnesi alt sre boyunca sunucuya olan balantnnda srekli olarak ak olmasn gerektirir.

    Yukardaki kod satrnda dikkat ekici dier bir unsur ise, bir new yaplandrcs kullanlmaydr. SqlDataReader snfnn bir

    yapc metodu ( Constructor ) bulunmamaktadr. O nedenle bir deiken tanmlanyormu gibi bildirilir. Bu nesneyi asl ykleyen,

    SqlCommand nesnesinin ExecuteReader metodudur. */

    conFriends.Open(); // Balantmz ayoruz.

    dr=cmdKitaplar.ExecuteReader(CommandBehavior.CloseConnection); /* Burada ExecuteReader metodu , SqlCommand

    nesnesine yle bir seslenite bulunuyor. " SqlCommand'cm, sana verilen Sql Cmleciini (Select sorgusu) altr ve sonularn

    bir zahmet eitliin sol tarafnda yer alan SqlDataReader nesnesinin bellekte referans ettii alana ykle. Sonrada sana belirttiim,

    samdaki CommandBehavior.CloseConnection parametresi nedeni ile, SqlDataReader nesnesi Close metodu ile kapatldnda, yine

    bir zahmet SqlConnection nesnesininde otomatik olarak kapanmasn salayver". */

    lstKitaplar.DataSource=dr; // Elde edilen veri kmesi SqlDataReader nesnesi yardmyla ListBox nesnesine veri kayna

    olarak gsteriliyor.

    lstKitaplar.DataTextField="Adi"; // ListBox nesnesinde Text olarak Adi alannn deerleri grncek.

    lstKitaplar.DataValueField="ID"; // Grnen Adi deerlerinin sahip olduu ID deerleri de ValueField olarak belirleniyor.

    Bylece "Kitap Bul" isimli Stored Procedure'mze ID parametresinin deeri olarak bu alann deeri gitmi olucak. Ksacas grnen

    yaz kitabn ad olurken, bu yaznn deeri ID alannn deeri olmu oluyor.

    lstKitaplar.DataBind(); // Web Sayfalarnda , verileri nesnelere balarken DataBind metodu kullanlr.

    dr.Close(); // SqlDataReader nesnemiz kapatlyor. Tabiki SqlConnection nesnemizde otomatik olarak kapatlyor.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 14/782

    }

    }

    imdi oluturduumuz projeyi altrrsak aadaki gibi bir sonu elde ederiz. Grld gibi Kitaplar tablosundaki tm kitaplara

    ait Adi alanlarnn deerleri listBox nesnemize yklenmitir.

    ekil 6. Page_Load sonras.

    imdi ise listBoxta bir eyi setiimizde neler olucana bakalm. Temel olarak, seilen eye ait ID deeri Kitap Bul isimli

    Stored Proceduree gidicek ve dnen sonular dataGrid nesnesinde gsterceiz.

    ListBox nesnesine tkland zaman, alcak olan lstKitaplar_ SelectedIndexChanged olay procedurende gerekli kodlar yazmadan

    once ListBox nesnesinin AutoPostBack zelliine True deerini atamamz gerekiyor. Bylece kullanc sayfa zerinde listbox

    iindeki bir nesneye tkladnda lstKitaplar_SelectedIndexChanged olay procedurenn almasn salam oluyoruz. Nevarki

    byle bir durumda sayfann Page_Load olay procedrnn de tekrar almasn engellemek yada baka bir deyile bir kere

    almasn garantilemek iin if (Page.IsPostBack==false) kontroln Page_Load olay procedurene ekliyoruz.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 15/782

    ekil 7. AutoPostBack zellii

    private void lstKitaplar_SelectedIndexChanged(object sender, System.EventArgs e)

    {

    SqlCommand cmdKitapBul=new SqlCommand("Kitap Bul",conFriends); /* SqlCommand nesnemizi oluturuyoruz ve

    commandString parametresine Stored Procedure'n ismini yazyoruz.*/

    cmdKitapBul.CommandType=CommandType.StoredProcedure; /* Bu kez SqlCommand'in bir Stored Procedure altracana

    iaret ediyoruz.*/

    cmdKitapBul.Parameters.Add("@id",SqlDbType.Int); /* "Kitap Bul" isimli Stored Procedure'de yer alan @id isimli parametreyi

    komut nesnemize bildirmek iin SqlCommand nesnemizin, Parameters koleksiyonuna ekliyoruz.*/

    cmdKitapBul.Parameters[0].Value=lstKitaplar.SelectedValue; /* listBox nesnesinde seilen enin deerini (ki bu deer ID

    deeridir) SelectedValue zellii ile alyor ve SqlCommand nesnesinin 0 indexli parametresi olan @id SqlParameter nesnesine

    atyoruz. Artk SqlCommand nesnemizi altrdmzda , @id paramteresinin deeri olarak seili listBox esinin deeri gnderilicek

    ve bu deere gre alan Select sorgusunun dndrd sonular SqlDataReader nesnemize yklenecek.*/

    SqlDataReader dr;

    conFriends.Open(); // Balantmz alyor.

    dr=cmdKitapBul.ExecuteReader(CommandBehavior.CloseConnection); // Komut altrlyor.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 16/782

    dgDetaylar.DataSource=dr; // dataGrid nesnesine veri kayna olarak SqlDataReader nesnemiz gsteriliyor.

    dgDetaylar.DataBind(); // dataGrid verilere balanyor.

    dr.Close(); // SqlDataReader nesnemiz ve sonrada SqlConnection nesnemiz ( otomatik olarak ) kapatlyor.

    }

    ekil 8. Sonu.

    Geldik bir makalemizin daha sonuna. Yeni makalelerimizde grmek dileiyle, hepinizi mutlu gnler.

    Stored Procedure Yardmyla Tablodan Kayt Silmek

    Bugn ki makalemde Stored Procedure yardmyla bir veritaban tablosundan, bizim setiimiz herhangi bir satr nasl sileceimizi

    sizlere anlatmaya alacam.Her zaman olduu gibi rneimizi gelitirmek iin, SQL Server zerinde yer alan Northwind

    veritabann kullanmak istiyorum. SQL Server zerinde alan rnekler gelitirmek istememin en byk nedeni, bir veritaban

    ynetim sistemi (Database Management System;DBMS) zerinde .NET ile projeler gelitirmenin gerekiliidir. Gncel yaantmzda

    a zerinde alan uygulamalar ounlukla , iyi bir veritaban ynetim sistemi zerinde yazlm programlar ile

    gerekletirilmektedir. ok katl mimari olarak hepimizin kulana bir ekilde gelmi olan bu sistemde, aslnda yazm olduumuz

    programlar, birer arayz nitelii tamakta olup kullanc ile veritaban arasndaki iletiimi grsel anlamda kolaylatran birer ara

    haline gelmitir. te bu sunum katman (presantation layer) denen yerdir. Burada veri tablolarn ve veritabanlarn zerinde

    barndran yer olarak veritaban katman (Database Layer) byk nem kazanmaktadr.

    te bir nceki makalemde belirttiim gibi Stored Procedure' leri kulanmamn en byk amac performans, hz ve gvenlik

    kriterlerinin nemidir. Dolaysyla, rneklerimizi bu ekilde gerek uygulamalara yakn tutarak, alrsak daha baarl olucamz

    inancndaym.Evet bu kadar laf kalabalndan sonra dilerseniz uygulamamza geelim.Uygulamamzn kolay ve anlalr olmas

    amacyla az satrl bir tablo zerinde ilemlerimizi yapmak istiyorum. Bu amala Categories tablosunu kullanacam.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 17/782

    ekil 1. Categories tablosunda yer alan veriler.

    Tablomuzun yapsn da ksaca incelersek ;

    ekil 2. Categories tablosunun alan yaps.

    Burada CategoryID alan bizim iin nemlidir. Nitekim silme ilemi iin kullanacamz Stored Procedure ierisinde , belirleyici alan

    olarak bir parametreye dnecektir. imdi dilerseniz, Stored Proceduremz yazalm.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 18/782

    ekil 3. Stored Procedure Kodlari

    CREATE PROCEDURE [Delete Category]

    @kid int

    AS

    DELETE FROM Categories WHERE CategoryID=@kid

    GO

    Grld gibi burada son derece kolay bir T-SQL( Transact SQL ) cmlecii var. Burada yaplan ilem aslnda @kid parametresine

    geilen deeri CategoryID alan ile eletirmek. Eer bu parametre deerine karlk gelen bir CategoryID deeri varsa; bu deeri

    tayan satr Categories isimli tablodan silinecektir.

    Evet imdi de .NET ortamnda formumuzu tasarlayalm. New Project ile yeni bir C# projesi aarak ie balyoruz. Formumuzun

    tasarmn ben aadaki ekilde yaptm. Sizde buna uygun bir form tasarlayabilir yada ayn tasarm kullanabilirsiniz. Visual

    Studio.NET ile program gelitirmenin belkide en zevkli ve gzel yan form tasarmlar. Burada gerekten de iimizdeki sanat

    ruhunu ortaya kartma imkanna sahibiz. Ve doruyu sylemek gerekirse Microsoft firmasda artk iimizdeki sanat ocuu

    zellikle bu tarz uygulamalarda, daha kolay aa kartabilmemiz iin elinden geleni yapyor. Doal olarakta ok da gzel sonular

    ortaya kyor. Birde o eski bankalardaki ( halen daha varya ) siyah ekranlarda, incecik, kargack, burgack tasarmlar ve arayzleri

    dnn. F12 ye bas geri dn. Tab yap. imdi F4 kodu gir.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 19/782

    ekil 4. Formun Ilk Yapisi

    Formumuzda bir adet dataGrid nesnesi ve bir adetde button nesnesi yer alyor. DataGrid nesnesini Categories tablosu iersinde yer

    alan bilgileri gstermek iin kullanacaz. Datagrid verileri gsterirken kullancnn kayt eklmek, dzenlemek, ve setii satr

    buradan silmesini egellemek istediimden ReadOnly zelliine True deerini aktardm. rneimizin amac gerei silme ilemini Sil

    textine sahip btnSil button nesnesinin Click olay procedurenden yapcaz. Elbette burada databasedeki bilgileri dataGrid

    iersinde gstermek amacyla bir SqlDataAdapter nesnesi kullanacam. Bu sadece Categories isimli tablo ierisindeki tm satrlar

    seicek bir Select sorgusuna sahip olucak ve bunlar dataGrid ile ilikili olan bir DataTable nesnesine aktarcak.

    Dilerseniz kodlarmz yazmaya balayalm. nceliklie SqlConnection nesnemiz yardmyla, Northwind veritabanna bir balant

    ayoruz. Daha sonra SqlDataAdapter nesnemizi oluturuyoruz. SqlDataAdapter nesnesini yaratmak iin new anahtar szc ile

    kullanabileceimiz 4 adet overload constructor var. Overload constructor, ayn isme sahip yapc metodlar anlamna geliyor. Yani bir

    SqlDataAdapter nesnesini yaratabileceimiz 4 kurucu( constructor) metod var ve bunlarn hepside ayn isme sahip(Overload;ar

    yklenmi) metodlar. Yeri gelmiken bunlardan da bahsederek bilgilerimizi hem tazeleyelim hem de arttrm olalm. te bu yapc

    metodlarn prototipleri.

    public SqlDataAdapter();

    public SqlDataAdapter(string selectCommandText,string connectionString);

    public SqlDataAdapter(string selectCommandText,SqlConnection selectConnection);

    public SqlDataAdapter(SqlCommadn selectCommand);

    Ben uygulamamda ilk yapc metodu baz almak istiyorum. Evet artk kodlarmz yazalm.

    NOT: Her zaman olduu gibi projemizin bana

    System.Data.SqlClient namespace ini eklemeyi unutmayalm.

    using System;

    using System.Drawing;

    using System.Collections;

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 20/782

    using System.ComponentModel;

    using System.Windows.Forms;

    using System.Data;

    using System.Data.SqlClient;

    /* nce SqlConnection nesnesi yardimiyla SQL Server zerinde yer alan, Northwind isimli veritabanina bir baglanti nesnesi

    tanimliyoruz. Ilk parametre yani initial catalog, veritabaninin ismini temsil ediyor. u anda SQL Server in zerinde yer alan

    makinede alisitigimizdan Data Source parametresine localhost degerini aktardik. */

    SqlConnection conNorthwind=new SqlConnection("initial catalog=Northwind;Data Source=localhost;integrated

    security=sspi;packet size=4096");

    /* imdi Categories tablosunu bellekte temsil edicek olan DataTable nesnemizi yaratiyoruz. Dikkat edersek bellekte dedik.

    DataTable nesnesi Categories tablosundaki verileri programin alistigi bilgisayar zerindeki bellekte sakliyacaktir. Bu durumda

    SqlConnection nesnemizin aik kalmasina gerek yoktur. Bu da elbetteki sunucu zerindeki yk azaltan bir etkendir.*/

    DataTable dtbCategories=new DataTable("Kategoriler");

    private void Form1_Load(object sender, System.EventArgs e)

    {

    conNorthwind.Open();//Balantmz ayoruz.

    SqlDataAdapter da=new SqlDataAdapter();//Bir SqlDataAdapter nesnesi tanimladik.

    /* Asagidaki satir ile yarattigimiz SqlDataAdapter nesnesine bir Select sorgusu eklemis oluyoruz. Bu sorgu sonucu dnen deger

    kmesi, SqlDataAdapter nesnesinin Fill metodunu kullandigimizda DataTable' in ierisini hangi veriler ile dolduracagimizi belirtecek

    nemli bir zelliktir. Bir SqlDataAdapter nesnesi yaratildiginda, SelectCommand zelligine SqlCommand trnden bir nesne

    atanarak bu islem gereklestirilir. Burada aslinda, SelectCommand zelliginin prototipinden dolayi new anahtar szcg kullanilarak

    bir SqlCommand nesnesi parametre olarak verilen select cmlecigi ile olusturulmus ve SelectCommand zelligine atanmistir.

    *

    * public new SqlCommand SelectCommand

    * {

    * get;

    * set;

    * }

    * Prototipten de grldg gibi SelectCommand zelliginin tipi SqlCommand nesnesi trndendir. Bu yzden new

    SqlCommand("....") ifadesi kullanilmistir.

    * */

    da.SelectCommand=new SqlCommand("SELECT * FROM Categories");

    da.SelectCommand.Connection=conNorthwind; /* Select sorgusunun alistirilacagi baglanti belirlenir.*/

    da.FillSchema(dtbCategories,SchemaType.Mapped);/* Burada dataTable nesnemize, veritabannda yer alan Categories isimli

    tablonun Schema bilgilerinide yklyoruz. Yani primaryKey bilgileri, alanlarn bilgileri ykleniyor. Bunu yapmamzn sebebi, Stored

    Procedure ile veritabanndaki Categories tablosundan silme ilemini yapmadan nce , bellekteli tablodan da ayn satr silip dataGrid

    iindeki grntnn ve DataTable nesnesinin gncel olarak kalmasn salamak. Nitekim silme ileminde DataTable nesnesinden

    seili satr silmek iim kullanacamz Remove metodu PrimaryKey alannn deerini istemektedir. Bunu verebilmek iin tablonun

    PrimaryKey bilgisininde bellee yani bellekteki DataTable nesnesine yklenmi olmas gerekir. te bu amala Schema bilgilerinide

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 21/782

    alyoruz*/

    da.Fill(dtbCategories);/* Burada SqlDataAdapter nesnesinin Fill metodu agirilir. Fill metodu ncelikle

    SelectCommand.CommandText in degeri olan Select sorgusunu alistirir ve dnen veri kmesini dtbCategories isimli DataTable

    nesnesinin bellekte referans ettigi alana ykler. Artik baglantiyida kapatabiliriz.*/

    conNorthwind.Close();

    /* Simdi dataGrid nesnemize veri kaynagi olarak DataTable nesnemizi gsterecegiz. Bylece DataGrid, Categories tablosundaki

    veriler ile dolucak. */

    dgCategories.DataSource=dtbCategories;

    }

    private void btnDelete_Click(object sender, System.EventArgs e)

    {

    /* mdi silme ilemini gerekletireceimiz Stored Procedure'e DataGrid nesnesi zerinde kullancnn semi olduu satrn

    CategoryID stununun deerini gndereceiz. Bunun iin kullancnn setii satrn numarasn CurrentCell.RowNumber zellii ile

    alyoruz. Daha sonra, CategoryID stunu dataGrid'in 0 indexli stunu olduundan CategoryID deerini elde ederken

    dgCategories[currentRow,0] metodunu kullanyoruz.*/

    int currentRow;

    int selectedCategoryID;

    currentRow=dgCategories.CurrentCell.RowNumber;

    selectedCategoryID=(int)dgCategories[currentRow,0]; /* Burada dgCategories[currentRow,0] aslnda object tipinden bir deer

    dndrr. Bu yzden ak olarak dntrme dediimiz (Explicit) bir Parse(dntrme) ilemi yapyoruz. */

    /* imdi de Stored Procedure'mz altracak olan SqlCommand nesnesini tanmlayalm*/

    SqlCommand cmdDelete=new SqlCommand();

    cmdDelete.CommandText="Delete Category";/* Stored Procedure'n ad CommandText zelliine atanyor. Ve bu stringin bir

    Stored Procedure'e iaret ettiini belirtmek iin CommandType deerini CommandType.StoredProcedure olarak belirliyoruz.*/

    cmdDelete.CommandType=CommandType.StoredProcedure;

    cmdDelete.Connection=conNorthwind;//Komutun altrlaca balant belirleniyor.

    /* imdi ise @id isimli parametremizi oluturacaz ve kullancnn semi olduu satrn CategoryID deerini bu parametre ile

    Stored Proecedure'mze gndereceiz.*/

    cmdDelete.Parameters.Add("@kid",SqlDbType.Int);

    cmdDelete.Parameters["@kid"].Value=selectedCategoryID;

    /* Ve nemli bir nokta. Kullancy uyarmalyz. Gerekten setii satr silmek istiyor mu?* Bunun iin MessageBox nesnesni ve

    Show metodunu kullanacaz. Bu metodun dn deerini DialogResult tipinde bir deikenle kontrol ettiimize dikkat edin.*/

    DialogResult result;

    result=MessageBox.Show("CategoryID : "+selectedCategoryID.ToString()+". Bu satr silmek istediinizden emin

    misiniz?","Sil",MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

    if (result==DialogResult.Yes ) /*Eer kullancnn cevab evet ise aadaki kod bloundaki kodlar altrlr ve satr once

    DataTable nesnesinden sonrada kalc olarak databaseden silinir.*/

    {

    conNorthwind.Open();// Balantmz ayoruz.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 22/782

    /* Elbette veritabanndan dorudan sildiimiz satr bellekteki DataTable nesnesinin referans ettii yerdende siliyoruz ki

    datagrid nesnemiz gncelliini korusun. Bunun iin seili olan dataTable satrnu bir DataRow nesnesine aktaryoruz. Bunu

    yaparkende seili kayd Find metodu ile CategoryID isimli Primary Key alan zerinden arama yapyoruz. Kayt bulunduunda tm

    satrbilgisi bir DataRow tr olarak geri dnyor ve bunu DataRow nesnemize atyoruz. Remove metodu silinmek istenen satr

    bilgisini parameter olarak alr. Ve bu parameter DataRow tipinden bir parametredir.*/

    DataRow drSelectedRow;

    drSelectedRow=dtbCategories.Rows.Find(selectedCategoryID);

    dtbCategories.Rows.Remove(drSelectedRow);

    cmdDelete.ExecuteNonQuery();/ * Artk Stored Procedure de altrlyor ve slime ilemi dorudan veritabanndaki tablo

    zerinden gerekletiriliyor. ExecuteNonQuery bu Stored Procedure' altracak olan metoddur. Delete,Update,Insert gibi kayt

    dndrmesi beklenmeyen (Select sorgular gibi) sql cmlecikleri iin ExecuteNonQuery metodu kullanlr.*/

    conNorthwind.Close();

    }

    }

    imdi dilerseniz programmz altrp sonularna bir bakalm. ncelikle Categories isimli tabloya dorudan SQL Server zerinden

    rnek olmas asndan bir ka kayt ekleyelim.

    ekil 5. Categories tablosuna 3 yeni kayt ekledik.

    imdi uygulamamz altralm. Bu durumda ekran grnts aadaki gibi olucaktr. u anda dataGrid iindeki bilgiler

    veritabanndan alnp , bellekteki dataTable nesnesinin referans ettii blgedeki verilerden olumaktadr. Dolaysyla Sql Servera

    olan balantmz ak olmad halde verileri izleyebilmekteyiz. Hatta bunlarn zerinde deiiklilkler yapp normal tablo ilemlerinide

    (silme,kayt ekleme,gncelleme vb... gibi) gerekletirebiliriz. Bu balantsz katman olarak adlandrdmz olaydr. Bu konuya

    ilerliyen makalelerimizide daha detayl olarak inceleyeceiz.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 23/782

    ekil 6. Load Procedurenn altrlmasndan sonraki grnm.

    imdi setiimiz 17 CategoryID satrn silelim. Ekrana bir soru kacaktr.

    ekil 7. MessageBox.Show(.....) metodunun sonucu.

    imdi Yes butonuna basalm. Bu durumda 17 CategoryID li satr dataTabledan dolaysyla dataGridden silinir. Ayn zamanda

    altrdmz Stored Procedure ile veritabanndan da dorudan silinmitir.

    ekil 8. Silme ilemi sonras.

    imdi SQL Servera geri dnp tablonun ieriini kontrol edicek olursak aadaki sonucu elde ederiz.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 24/782

    ekil 9. Sonu.

    Grld gibi CategoryID=17 olan satr veritabanndaki tablodanda silinmitir. Bir sonraki makalemizde grmek dileiyle.

    Overload Metodlarn Gc

    Deerli Okurlarm, Merhabalar.

    Bu makalemde sizlere overload kavramndan bahsetmek istiyorum. Konunun daha iyi anlalabilmesi asndan, ilerliyen ksmlarda

    basit bir rnek zerinde de alacaz.

    ncelikle Overload ne demek bundan bahsedelim. Overload kelime anlam olarak Ar Ykleme anlamna gelmektedir. C#

    programlama dilinde overload dendiinde, ayn isme sahip birden fazla metod akla gelir. Bu metodlar ayn isimde olmalarna

    ramen, farkl imzalara sahiptirler. Bu metodlarn imzalarn belirleyen unsurlar, parametre saylar ve parametre tipleridir. Overload

    edilmi metodlar kullandmz snflarda, bu snflara ait nesne rnekleri iin ayn isme sahip fakat farkl grevleri yerine getirebilen

    ( veya ayn grevi farkl say veya tipte parametre ile yerine getirebilen ) fonksiyonellikler kazanm oluruz.

    rnein;

    ekil 1 : Overload metodlar.

    ekil 1 de MetodA isminde 3 adet metod tanm gryoruz. Bu metodlar ayn isime sahip olmasna ramen imzalar nedeni ile

    birbirlerinden tamamyla farkl metodlar olarak alglanrlar. Bize salad avantaj ise, bu metodlar barndran bir snf nesnesi

    yarattmzda ayn isme sahip metodlar farkl parametreler ile arabilmemizdir. Bu bir anlamda her metoda farkl isim vermek

    gibi bir karklnda bir nebze nne geer. Peki imza dediimiz olay nedir? Bir metodun imzas u unsurlardan oluur.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 25/782

    Metod mzas Kabul Edilen Unsurlar Metod mzas Kabul Edilmeyen Unsurlar

    Parametre Says

    Parametrenin Tipleri Metodun Geri Dn Tipi

    Tablo 1. Kullanm Kurallar

    Yukardaki unsurlara dikkat ettiimiz srece dilediimiz sayda ar yklenmi ( overload edilmi) metod yazabiliriz. imdi dilerseniz

    kk bir Console uygulamas ile , overload metod oluumuna engel tekil eden duruma bir gz atalm.ncelikle metodun geri

    dn tipinin metodun imzas olarak kabul edilemiyeceininden bahsediyoruz. Adaki rneimizi inceleyelim.

    using System;

    namespace Overloading1

    {

    class Class1

    {

    public int Islem(int a)

    {

    return a*a;

    }

    public string Islem(int a)

    {

    string b=System.Convert.ToString(a);

    return "Yam:"+b;

    }

    [STAThread]

    static void Main(string[] args)

    {

    }

    }

    }

    rnein yukardaki uygulamada, Islem isimli iki metod tanmlanmtr. Ayn parametre tipi ve saysna sahip olan bu metodlarn geri

    dn deerlerinin farkl olmas nedeni ile derleyici tarafndan farkl metodlar olarak alglanm olmas gerektii dnlebilir. Ancak

    byle olmamaktadr. Uygulamay derlemeye altmzda aadaki hata mesaj ile karlarz.

    Overloading1.Class1' already defines a member called 'Islem' with the same parameter types

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 26/782

    Yapc metodlarda overload edebiliriz. Bu da olduka nemli bir noktadr. Bunu zaten .NET ile program gelitirirken ska kullanrz.

    rnein SqlConnection snfndan bir nesne rnei yaratmak istediimizde, bunu yapabileceimiz 2 overload edilmi yapc metod

    olduunu grrz. Bunlardan birisi ada grnmektedir.

    ekil 2. rnek bir Overload Constructor(Ar Yklenmi Yapc) metod.

    Dolaysyla bizde yazdmz snflara ait constructorlar overload edebiliriz. imdi dilerseniz overload ile ilgili olaraktan ksa bir

    uygulama gelitirelim. Bu uygulamada yazdmz bir snfa ait constructor metodlar overload ederek deiik tipte fonksiyonellikler

    edinmeye alacaz.

    Bu uygulamada KolayVeri isminde bir snfmz olucak. Bu snfn adet yapcs olucak. Yani iki adet overload constructor yazcaz.

    ki tane diyorum nk C# zaten default constructoru biz yazmasak bile uygulamaya ekliyor. Bu default constructorlar parametre

    almayan constructorlardr. Overload ettiimiz constructor metodlardan birisi ile, setiimiz bir veritabanna balanyoruz. Dier

    overload metod ise, parametre olarak veritaban adndan baka, veritabanna balanmak iin kullanc ad ve parola

    parametrelerinide alyor. Nitekim ou zaman veritabanlarmzda yer alan baz tablolara eriim yetkisi snrlamalar ile karlaabiliriz.

    Bu durumda bu tablolara balant aabilmek iin yetkili kullanc ad ve parolay kullanmamz gerekir. Byle bir olay canlandrmaya

    altm. Elbetteki asl amacmz overload constructor metodlarn nasl yazldn, nasl kullanldn gstermek. rnek gelimeye

    ok, hemde ok ak. imdi uygulamamzn bu ilk ksmna bir gzatalm. Adakine benzer bir form tasarm yapalm.

    imdi sra geldi kodlarmz yazmaya. ncelikle uygulamamza KolayVeri adnda bir class ekliyoruz. Bu classn kodlar aadaki

    gibidir. Aslnda uygulamaya bu aamada baktmzda SqlConnection nesnemizin bir balant oluturmasn zelletirmi gibi

    oluyoruz. Gerektende ayn ilemleri zaten SqlConnection nesnesini overload constructorlari ile yapabiliyoruz. Ancak temel

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 27/782

    amacmz ar yklemeyi anlamak olduu iin programn alma amacnn ok nemli olmad dncesindeyim. Umuyorum ki

    sizlere ar ykleme hakknda bilgi verebiliyor ve vizyonunuzu gelitirebiliyorumdur.

    using System;

    using System.Data.SqlClient;

    namespace Overloading

    {

    public class KolayVeri

    {

    private string baglantiDurumu; /* Connection'n durumunu tutacak ve sadece bu class iinde geerli olan bir string deiken

    tanmladk. private anahtar kelimesi deikenin sadece bu class ierisinde yaayabilceini belirtir. Yazmayabilirizde, nitekim C#

    default olarak deikenleri private kabul eder.*/

    public string BaglantiDurumu /* Yukarda belirttiimiz baglantiDurumu isimli deikenin sahip olduu deeri, bu class'a ait

    nesne rneklerini kullandmz yerde grebilmek iin sadece okunabilir olan (readonly), bu sebeplede sadece Get blouna sahip

    olan bir zellik tanmlyoruz.*/

    {

    get

    {

    return baglantiDurumu; /* Bu zellie eritiimizde baglantiDurumu deikeninin o anki deeri geri dndrlecek.

    Yani zelliin arld yere dndrlcek.*/

    }

    }

    public KolayVeri() /* te C# derleyicisinin otomatik olarak ekledii parametresiz yapc metod. Biz bu yapcya tek satrlk bir

    kod ekliyoruz. Eer nesne rnei parametresiz bir Constructor ile yaplrsa bu durumda baglantinin kapal olduunu belirtmek iin

    baglantiDurumu deikenine bir deer atyoruz. Bu durumda uygulamamzda bu nesne rneinin BaglantiDurumu zelliine

    eritiimizde BAGLANAMADIK deerini elde edeceiz.*/

    {

    baglantiDurumu="BAGLANAMADIK";

    }

    public KolayVeri(string veritabaniAdi) /* Bizim yazdm ar yklenmi ilk yapc metoda gelince. Burada yapcmz,

    parametre olarak bir string alyor. Bu string veritabannn adn barndrcak ve SqlConnection nesnemiz iin gerekli balant

    stringine bu veritabannn adn geiricek.*/

    {

    string connectionString="initial catalog="+veritabaniAdi+";data source=localhost;integrated security=sspi";

    SqlConnection con=new SqlConnection(connectionString); /* SqlConnection balantmz yaratlyor.*/

    try /* Balant ilemini bir try blounda yapyoruz ki, herhangibir nedenle Sql sunucusuna balant salanamassa

    (rnein hatal veritaban ad nedeni ile) catch blounda baglantiDurumu deikenine BAGLANAMADIK deerini atyoruz. Bu

    durumda program iinde KolayVeri snfndan rnek nesnenin BaglantiDurumu zelliinin deerine baktmzda BAGLANAMADIK

    deerini alyoruz bylece balantnn salanamadna kanaat getiriyoruz. Kanaat dedikte aklma skdarda ki Kanaat lokantas

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 28/782

    geldi :) Yemekleri ok gzeldir. Sanrm karnmz ackt deerli okuyucularm.Neyse kaldmz yerden devam edelim.*/

    {

    con.Open(); // Balantmz alyor.

    baglantiDurumu="BAGLANDIK"; /* BaglantiDurumu zelliimiz (Property), baglantiDurumu deikeni sayesinde

    BAGLANDIK deerini alyor.*/

    }

    catch(Exception hata) /* Eer bir hata olursa baglantiDurumu deikenine BAGLANAMADIK deerini atyoruz.*/

    {

    baglantiDurumu="BAGLANAMADIK";

    }

    }

    public KolayVeri(string veritabaniAdi,string kullaniciAdi,string parola) /* Sra geldi ikinci overload constructor metoda. Bu

    metod ekstradan iki parametre daha alyor. Bir tanesi user id ye tekabl edicek olan kullaniciAdi, dieri ise bu kullanc iin

    password'e tekabl edicek olan parola. Bunlari SqlConnection'n connection stringine alarak , veritabanna belirtilen kullanc ile giri

    yapm oluyoruz. Kodlarn ileyii bir nceki metodumuz ile ayn.*/

    {

    string connectionString="initial catalog="+veritabaniAdi+";data source=localhost;user

    id="+kullaniciAdi+";password="+parola;

    SqlConnection con=new SqlConnection(connectionString);

    try

    {

    con.Open();

    baglantiDurumu="BAGLANDIK";

    }

    catch(Exception hata)

    {

    baglantiDurumu="BAGLANAMADIK";

    }

    }

    }

    }

    imdi sra geldi, formumuz zerindeki kodlar yazmaya.

    string veritabaniAdi;

    private void lstDatabase_SelectedIndexChanged(object sender, System.EventArgs e)

    {

    veritabaniAdi=lstDatabase.SelectedItem.ToString();

    /* Burada kv adnda bir KolayVeri snfndan nesne rnei (object instance) yaratlyor. Dikkat edicek olursanz burada yazdm

    ikinci overload constructor'u kullandk.*/

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 29/782

    KolayVeri kv=new KolayVeri(veritabaniAdi); /* Burada KolayVeri( dediimizde .NET bize kullanabileceimiz ar yklenmi

    constructorlar aadaki ekilde olduu gibi hatrlatacaktr. IntelliSencein gzn seveyim.*/

    stbDurumBilgisi.Text=lstDatabase.SelectedItem.ToString()+" "+kv.BaglantiDurumu;

    private void btnOzelBaglan_Click(object sender, System.EventArgs e)

    {

    string kullanici,sifre;

    kullanici=txtKullaniciAdi.Text;

    sifre=txtParola.Text;

    veritabaniAdi=lstDatabase.SelectedItem.ToString();

    KolayVeri kvOzel=new KolayVeri(veritabaniAdi,kullanici,sifre); /* Burada ise dier ar yklenmi yapcmz kullanarak bir

    KolayVeri nesne rnei oluturuyoruz.*/

    stbDurumBilgisi.Text=lstDatabase.SelectedItem.ToString()+" "+kvOzel.BaglantiDurumu+" User:"+kullanici;

    }

    }

    Evet imdide programn nasl altna bir bakalm. Listbox nesnesi zerinde bir veritaban adna bastmzda bu veritabanna bir

    balant alr.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 30/782

    ekil 6. Listboxta tklanan veritabanna balandktan sonra.

    Ve birde kullanc ad ile parola verilerek nasl balanacamz grelim.

    ekil 7. Kullanc ad ve parola ile baplant

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 31/782

    Peki ya yanl kullanc ad veya parola girersek.

    ekil 8. Yanlk kullanc ad veya parolas sonras.

    Evet deerli MsAkademik okuyucular bu seferlikte bu kadar. Bir sonraki makalemizde grmek dileiyle hepinize mutlu gnler,

    yarnlar dilerim.

    Transaction Kavram

    Deerli Okurlarm, Merhabalar.

    Bu makalemizde sizlere veritaban programclnda ve zellikle de ok katl mimaride ok nemli bir yere sahip olan Transactionlar

    hakknda bilgi vermeye alacam. Her zaman olduu gibi konuyu iyi anlayabilmek iin bir de rnek uygulamamz

    olucak. ncelikle Transaction nedir , ne ie yarar bunlardan bahsedelim. ou zaman programlarmzda ard arkasna veritaban

    ilemleri uygulatrz. rnein, bir veritabanndaki bir tablodan kayt silerken, ayn olayn sonucunda baka bir ilikli tabloya silinen

    bu verileri ekleyebilir veya gncelleyebiliriz. Hatta bu ilemin arkasndan da silinen kaytlarn bulunduu tablo ile ilikili baka

    tablolaradan da ayn verileri sildiimiz ilemleri balatabiliriz. Dikkat edicek olursanz burada birbirleriyle ilintili ve ardk ilemlerden

    sz ediyoruz.

    Farzedelim ki , zerinde altmz bu tablolara farkl veritaban sunucularnda bulunsun. rnein, birisi Adanada dieri

    Arnavutlukta orta olduumuz irketin sunucularnda. Hatta bir dieride Kazakistandaki ortamzn bir ka sunucusunda

    bulunuyor olsun. E hadi bir tanede bizim sunucumuzda farkl bir veya bir ka tablo olsun. imdi dnn ki, biz Kazakistan a

    sattmz mallarn bilgisini , Arnavutluk taki ortamzn sunucularnada bildiriyoruz. Stoumuzda bulunan mallarda 1000 adet

    televizyonu Kazakistana gndermek amacyla ihra birimimize rapor ediyoruz. hra birimi ilgili ilemleri yaptktan sonra,

    Kazakistandaki sunuculardan gelen deme bilgisini alyor. Sonra ise stok tan 1000 televizyonu dyor , muhasebe kaytlarn

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 32/782

    gncelliyor, Kazakistan daki sunucularda stok artn ve hesap eksililerini bildiriyor. Daha sonra ise , Arnavutluk taki sunuculara

    stok art ve stok azallarn ve muhasebe hareketlerini belirtiyor. Senaryo bu ya. ok hzl bir teknolojik alt yapya sahip

    olduumuzu ve bankalardan irkete olan para aklarnn annda grlp , tablolara yanstlabildiini ve bu sayede de stoklardaki

    hareketlerin ve irket muhasebe kaytlarndaki hareketlerin hemen gerekleebileceini yani mmkn olduunu dnelim. (Deerli

    okuyucalarm biliyorum ki uzun bir cmle oldu ama umarm gelmek istediim noktay anlamaya balamsnzdr)

    Bahsettiimiz tm bu ilemler birer i paracdr ve aslnda hepsi toplu olarak tek bir amaca hizmet etmektedir. Tm sunucular

    stok hareketlerinden ve gerekli muhasebe deiikliklerinden e zamanl olarak (aa yukar yani ) haberdar etmek ve veritaban

    sunucularn gncellemek. Dolaysyla tm bu i paracklarn, tek bir btn ii gerekletirmeye alan unsurlar olduunu

    syleyebiliriz. te burada tm bu i paracklar iin sylenebilecek baz hususlar vardr. ncelikle,

    paracklarnn birinde meydana gelen aksaklk , dier ilerin ve zellikle takib eden i paracklarnn doru ekilde ilememesine neden olabilir. Dolaysyla tm bu i paracklar baarl olduu takdirde btn i baarl olmu saylabilir.

    Dier yandan i paracklarnn ileyii srasnda veriler zerindeki deiikliklerin de tutarl olmas birbirlerini tamamlayc nitelik tamas gerekir. Sz gelimi stoklarmzda 2000 televiyon varken 1000 televizyon ihra ettiimizde stoumuza mal

    eklenmediini dnecek olursak 1000 televizyon kalmas gerekir. 1001 televizyon veya 999 televizyon deil. te bu

    verilerin tutarlln gerektirir.

    te bu nedenlerde tr Transaction kavram ortaya karmtr. Bu kavrama gre aslnda bahsedilen tm i paraklar kusursuz

    olarak baarl olduklarnda ilem tamam denebilir. te bizde veritaban uygulamalarmz gelitirirken, bu tip i paracklarn bir

    Transaction blouna alrz. imdi ise karmza iki yeni kavram kacaktr. Commit ve Rollback.Eer Transaction blouna dahil edilen

    i paracklarnn tm baarl olmu ise Transaction Commit edilir ve i paracklarndaki tm veri deiimleri gerekten

    veritabanlarna yanstlr. Ama i paracklarndan her hangibirinde tek bir hata oluup i paracnn ileyii bozulur ise bu durumda

    tm Transaction Rollback edilir ve bu durumda, o ana kadar ileyen tm i paracklarndaki ilemler geri alnarak , veritabanlar

    Transaction balamadan nceki haline dndrlr. Bu bir anlamda gvenlik ve verileri koruma adna oluturulmu bir koruma

    mekanizmasdr.

    Peki ya i paracklarnn dzgn ilemiyiine sebep olarak neler gsterebiliriz. Tabiki evresel faktrler en byk etkendir.

    Sunucular birbirine balayan hatlar zerinde olabilecek fiziki bir hasar ilemleri yarda brakabilir ve Kazakistan daki sunuculardaki

    1000 televizyonluk art buraya hi yansmayabilir. Kazakistandaki yetkili Trkiyedeki merkezi arayp stoumda hala 1000

    televizyon grnmyor. diyebilir. Merkezdeki yetkili ise. Bizim stoklardan 1000 tv dn km. Bilgisayar kaytlar yalan m

    syliyecek kardeim. diyebilir. Neyseki Transactionlar sayesinde olay yle geliir.

    Kazakistan Bro : Stokta bir hareket yok bir sorunmu var acaba?

    Merkez: Evet . Karadenizden geen boru hattnda frtna nedeni ile kopma olmu. Mallar bizim stokta halen daha kmadlar.

    Gemide bekletiyoruz.

    ok abart bir senaryo oldu aslnda. Nitekim o televizyonlar bir ekilde yerine ular Transactionlara gerek kalmadan. Ama olay

    umarm size betimleyebilmiimdir. imdi gelin olayn teknik ksmn bir de grafik zerinde grelim.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 33/782

    ekil 1. Transaction Kavram

    ekilde grld gibi rnek olarak 3 adet ilem parac ieren bir Transaction bloumuz var. Bu ilemler birbirine bal olarak

    tasvir edilmitir. Eer herhangibiri baarsz olursa veriler zerinde o ana kadar olan deiiklikler geri alnr ve sistem Transaction

    balamadan nceki haline konumlandrlr. ekilimize bunlar R-point yani Rollback Noktasna git olarak tasvir edilmitir. Ancak tm

    ilemler baarl olursa Transaction iinde gerekleen tm veri deiiklikleri onaylanm demektir.

    Transactionlar ile ilgili olarak nemli bir konu ise yukardaki rneklerde anlattmz gibi birden fazla veritaban olmas durumunda

    bu Transaction ilemlerinin nasl koordine edilceedir. Burada Datk Transaction dediimiz Distributed Transaction kavram ortaya

    kar. Bu konuyu ilerliyen makalelerimizde ilemey alacam. imdilik sadece tek bir veritaban zerinde yazabileceimiz

    Transaction lardan bahsetmek istiyorum..NET ierisinde SqlClient snfnda yer alan nesneleri Transaction nesneleri kullanlarak bu

    ilemi gerekletirebiliriz. Ben SqlTransaction nesnesini ele alacam. Bu nesneyi oluturmak iin herhangibir yapc metod yoktur.

    SqlDataReader snfnda olduu gibi bu snfa ait nesneler birer deikenmi gibi tanmlanr. Nesne atamalar SqlConnection nesnesi

    ile gerekletirilir ve bu ayn zamanda Transactionn hangi SqlConnection balants iin balatlacan belirlemeye yarar.

    SqlTransaction tran;

    tran = conNorthwind.BeginTransaction();

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 34/782

    Yukardaki ifadeye dikkat edersek, bir SqlTransaction nesnesi tanmlanm ve daha sonra conNorthwind isimli SqlConnection

    nesnesi iin balatlmtr. te Transaction blounun balad nokta burasdr. imdi ise , hangi Sql komutlarn dolaysyla hangi i

    paracklarn bu transaction nesnesine(yani blouna) dahil ediceimizi belirlemeliyiz. Bu ilem genelde altrlcak olan

    SqlCommand nesnelerinin Transaction zelliklerine Transaction nesnesinin atanmas ile gerekletirilir. Dilerseniz gereki bir rnek

    zerinde alalm ve Transaction kavramn daha iyi anlayalm.

    Merkezi stanbulda olan uluslararas devre mlk satan bir irket, lke ofislerinde satn yapt devre mlkler iin, sat yapan

    personele ait banka hesaplarna EFT ilemi ieren bir uygulamaya sahip olsun. Bahsi geen uygulamann almasna bir rnek

    verelim; Brezilyadaki ofisimizde bir sat personelimizin, devre mlk sattn ve sat tutar zerinden %1 prim aldn farz edelim.

    Yaplan sat sonucunda stanbuldaki suncuda yer alan veritabanna ait tablolarda peisra ilemler yapldn varsayalm.

    Personelin bilgilerinin olduu tabloda alaca toplam prim tutar sat tutarnn %1i orannda artsn , dencek prime ait bilgiler ayr

    bir tabloya ilensin ve ayn zamanda, irkete ait finans kurumundaki toplam para hesabndan bu prim tutar kadar TL eksilsin. te

    bu ilemi gz nnde bulundurduumuzda, tek bir ileme ait i paracklar olduunu anlayabiliriz. Dolaysyla burada bir

    Transactiondan rahatlkla sz edebiliriz.Dilerseniz uygulamamza geelim. ncelikle tablolarmza bir gz atalm. IstanbulMerkez

    isimli veritabanmzda u tablolar yer alyor.

    ekil 2. IstanbulMerkez veritabanndaki tablolar.

    Buradaki tablolardan ve grevlerinden ksaca bahsedelim. Personel tablosunda personele ait bilgiler yer alyor. Bu tablo Prim isimli

    tablo ile bire-ok ilikiye sahip. AFinans ise, bize ait finas kurumunun kasasndaki gncel TLs miktarn tutan bir tablo. Personel

    sat yaptnda, sat tutar zerinde prim Personel tablosundaki PrimToplami alannn deerini %1 arttryor sonra Prim tablosuna

    bunu iliyor ve son olarakta AFinans tablosundaki Tutar alanndan bahsi geen %1 lik prim miktarn azaltyor.

    Peki buradaki ilem iin neden Transaction kullanyoruz? Farz edelim ki, Personel tablosunda PrimToplami alannn deeri

    arttktan sonra, bir sorun nedeni ile veritabanna olan balant kesilmi olsun ve dier ilemler gereklememi olsun. Bu durumda

    personelin artan prim tutarn karlayacak kadar TLs finans kurumunun ilgili hesabndan dlmemi olaca iin , finansal

    dengeler bozulmu olucaktr. in iine para girdii zaman Transactionlar daha bir nem kazanmaktadr. Uygulamamz basit olmas

    asndan Console uygulamas olarak gelitireceim. Haydi balayalm. lemlerin kolay olmas asndan balang iin Personel

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 35/782

    tablosuna bir kayt girdim. u an iin grld gibi PrimToplami alannn deeri 0 TLsdr. Ayraca AFinans tablosunda bir

    balang tutarmzn olmas gerelkiyor.

    ekil 3. Personel Tablosu

    ekil 4. Afinans tablosu

    Uygulamamzda , Personel tablosunda yer alan PrimToplami alannn deerini prim tutar kadar arttrmak iin aadaki Stored

    Procedure kullanacaz.

    CREATE PROCEDURE [Prim Toplami Arttir]

    @prim float,

    @pid int

    AS

    UPDATE Personel SET PrimToplami = PrimToplami+@prim

    WHERE PersonelID=@pid

    GO

    Prim tablosuna eklenecek veriler iin ise INSERT sql cmlecii ieren bir Stored Proceduremz var.

    CREATE PROCEDURE [Prim Bilgisi Gir]

    @pid int,

    @st float,

    @p float,

    @str datetime

    AS

    INSERT INTO Prim (PersonelID,SatisTutari,Prim,SatisTarihi)

    VALUES (@pid,@st,@p,@str)

    GO

    Son olarak AFinans isimli tablomuzdan prim miktar kadar TLsn decek olan Stored Proceduremz yazalm.

    CREATE PROCEDURE [Prim Dus]

    @prim float

    AS

    UPDATE AFinans SET Tutar=Tutar-@prim

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 36/782

    GO

    Artk program kodlarmza geebiliriz. Kodlar C# ile yazmay tercih ettim.

    using System;

    using System.Data;

    using System.Data.SqlClient;

    namespace TransactionSample1

    {

    class Trans

    {

    [STAThread]

    static void Main(string[] args)

    {

    /* IstanbulMerkez veritabanna bir balant nesnesi referans ediyoruz. */

    SqlConnection conIstanbulMerkez=new SqlConnection("initial catalog=IstanbulMerkez;data source=localhost;integrated

    security=sspi");

    /* Transaction nesnemizi tanmlyor ve bu Transaction'n conIstanbulMerkez isimli SqlConnection nesnesinin belirttii

    balantya ait komutlar iin altrlacan belirtiyoruz. */

    SqlTransaction tr;

    conIstanbulMerkez.Open();

    tr=conIstanbulMerkez.BeginTransaction();

    double satisTutari=150000000000;

    double primTutari=satisTutari*0.01;

    /* imdi, Personel tablosundaki PrimToplami alann deerini primTutari deikeninin deerin kadar arttracak Stored

    Procedure' altracak SqlCommand nesnesini tanmlyor ve gerekli parametreleri ekleyerek bu parametrelere deerlerini

    veriyoruz. Son olaraktan da SqlCommand'in Transaction zelliine oluturduumuz tr isimli SqlTransaction nesnesini atyoruz. Bu u

    anlama geliyor. "Artk bu SqlCommand tr isimli Transaction iinde alcak olan bir i paracadr." */

    SqlCommand cmdPrimToplamiArttir=new SqlCommand("Prim Toplami Arttir",conIstanbulMerkez);

    cmdPrimToplamiArttir.CommandType=CommandType.StoredProcedure;

    cmdPrimToplamiArttir.Parameters.Add("@prim",SqlDbType.Float);

    cmdPrimToplamiArttir.Parameters.Add("@pid",SqlDbType.Int);

    cmdPrimToplamiArttir.Parameters["@prim"].Value=primTutari;

    cmdPrimToplamiArttir.Parameters["@pid"].Value=1;

    cmdPrimToplamiArttir.Transaction=tr;

    /* Aadaki satrlarda ise "Prim Bilgisi Gir" isimli Stored Procedure' altracak olan SqlCommand nesnesi oluturulup

    gerekli paramtere ayarlamalar yaplyor ve yine Transaction nesnesi belirlenerek bu komut nesneside Transaction blou ierisine

    bir i parac olarak bildiriliyor.*/

    SqlCommand cmdPrimBilgisiGir=new SqlCommand("Prim Bilgisi Gir",conIstanbulMerkez);

    cmdPrimBilgisiGir.CommandType=CommandType.StoredProcedure;

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 37/782

    cmdPrimBilgisiGir.Parameters.Add("@pid",SqlDbType.Int);

    cmdPrimBilgisiGir.Parameters.Add("@st",SqlDbType.Float);

    cmdPrimBilgisiGir.Parameters.Add("@p",SqlDbType.Float);

    cmdPrimBilgisiGir.Parameters.Add("@str",SqlDbType.DateTime);

    cmdPrimBilgisiGir.Parameters["@pid"].Value=1;

    cmdPrimBilgisiGir.Parameters["@st"].Value=satisTutari;

    cmdPrimBilgisiGir.Parameters["@p"].Value=primTutari;

    cmdPrimBilgisiGir.Parameters["@str"].Value=System.DateTime.Now;

    cmdPrimBilgisiGir.Transaction=tr;

    /* Son olarak AFinans isimli tablodaki Tutar alanndan prim tutar kadar TL'sn dcek olan Stored Procedure iin bir

    SqlCommand nesnesi tanmlanyor, prim tutarn tayacak olan parametre eklenip deeri veriliyor. Tabiki en nemlisi, bu komut

    nesnesi iinde SqlTransaction nesnemiz belirleniyor.*/

    SqlCommand cmdTutarDus=new SqlCommand("Prim Dus",conIstanbulMerkez);

    cmdTutarDus.CommandType=CommandType.StoredProcedure;

    cmdTutarDus.Parameters.Add("@prim",SqlDbType.Float);

    cmdTutarDus.Parameters["@prim"].Value=primTutari;

    cmdTutarDus.Transaction=tr;

    /* Evet sra geldi programn can alc kodlarna. Aada bir Try-Catch-Finally blou var. Bu bloklarda dikkat edicek

    olursanz tm SqlCommand nesnelerinin altrlmas try blounda yaplamktadr. Eer tm bu komutlar sorunsuz bir ekilde

    alrsa bu durumda, tr.Commit() ile transaction onaylanr vee deiikliklerin veritaban zerindeki tablolara yazlmas onaylanm

    olur*/

    try

    {

    int etkilenen=cmdPrimToplamiArttir.ExecuteNonQuery();

    Console.WriteLine("Personel tablosunda {0} kayt gncellendi",etkilenen);

    int eklenen=cmdPrimBilgisiGir.ExecuteNonQuery();

    Console.WriteLine("Prim tablosunda {0} kayt eklendi",eklenen);

    int hesaptaKalan= cmdTutarDus.ExecuteNonQuery();

    Console.WriteLine("AFinans tablosunda {0} kayt gncellendi",hesaptaKalan);

    tr.Commit();

    }

    catch(Exception hata) /* Ancak bir hata olmas durumdan ise, kullanc hatann bilgisi ile uyarlr ve tr.Rollback() ile

    hatann olutuu ana kadar olan tm ilemler iptal edilir.*/

    {

    Console.WriteLine(hata.Message+" Nedeni ile ilmeler iptal edildi");

    tr.Rollback();

    }

    finally /* hata olusada olumasada ak bir balant var ise bunun kapatlmasn garanti altna almak iin finally

    blounda balant nesnemizi Close metodu ile kapatrz.*/

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 38/782

    {

    conIstanbulMerkez.Close();

    }

    }

    }

    }

    ekil 5. Programn almas sonucu.

    Bu durumda veritabanndaki tabloalara bakcak olursak; Personel tablosuna PrimToplami alannn deeri artm,

    ekil 6. Personel tablosunda PrimToplami alannn deeri arttrld.

    Prim tablosuna ilgili personele ait bilgiler eklenmi,

    ekil 7. Prim tablosuna denecek prime ait bilgiler girildi.

    Son olarakta, AFinans isimli tablondaki Tutar alannn deeri gncellenmitir.

    ekil 8. AFinans tablosundaki Tutar alannn deeri prim tutar kadar azald.

    imdi dilerseniz bir hata tetikleyelim ve ne olacana bakalm. Bir hata retmek aslnda isteyince o kadar kolay deil malesef. Ben

    Stored Procedure lerden birinin ismini yanl yazcam. Bakalm ne olucak. u anda tablodaki veriler yukardaki ekil 6,7 ve ekil

    8da olduu gibi.

    SqlCommand cmdPrimBilgisiGir=new SqlCommand("Prim Bisi Gir",conIstanbulMerkez);

    Burada Stored Proceduren ismi Prim Bilgisi Gir iken ben Prim Bisi Gir yaptm. imdi altracak olursak; aadaki ekran ile

    karlarz. lemler iptal edilir.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 39/782

    10. lemler iptal edildi.

    Eer transaction kullanmasaydk ilk SqlCommand alr ve Personel tablosunda PrimToplami alann deeri artartd. Oysa imdi bu

    tabloyu kontrol edicek olursak,

    ekil 11. Bir etki olmadi.

    Tekrar nemli bir noktay vurgulamak isterim. Bu Transaction tek br veritaban zerinde almaktadr. Eer birden fazla veritaban

    sz konusu olursa , Distibuted Transaction tekniklerini kullanmamz gerekiyor. Bunu ilerliyen makalelerimizde incelemeye

    alacam. Umarm buraya kadar anlattklarmla Transactionlar hakknda bilgi sahibi olmusunuzdur. Bir sonraki makalemizde

    grmek dileiyle hepinize mutlu gnler dilerim.

    Distributed Transactions

    Deerli Okurlarm, Merhabalar.

    Bildiiniz gibi bir nceki makalemizde Transaction kavramndan bahsetmi, ancak birden fazla veritaban iin geerli olucak

    Transaction ilemlerinin Datk Transactionlar olarak adlandrldndan szetmitik. Bu makalemizde Datk Transactionlar

    inceleyecek ve her zaman olduu gibi konuyu aklayc basit bir rnek gelitireceiz.

    uygulamalarnda, Online Transaction Processing(OLTP) dediimiz olay ok sk kullanlmaktadr. Buna verilecek en gzel

    rnek bankalarn ATM uygulamalardr. Veriler e zamanl olarak ayn anda bir btn halinde ilenmekte ve gncellenmektedir. Bu

    tarz projelerin uygulanmasnda OLTP teknii yaygn bir biimde kullanlmaktadr. Bu tekniin uygulanabilmesi Datk

    Transactionlarn kullanlmasn gerektirir. .NET ile Datk Transactionlar yazmak iin Component Services kullanmamz

    gerekmektedir. zellikle,ok katl mimari dediimiz i uygulamalarnda Datk Transactionlar ok sk kullanrz. Burada Datk

    Transactionlar baka componentler tarafndan stlenilir ve Sunu Katman ile Veritabanlar arasndaki ilemlerin

    gerekletirilmesinde rol oynarlar. Bu componentlerin bulunduu katman Katman olarakda adlandrlmaktadr. Nitekim

    Componentler aslnda Transaction balatp gerekli metodlar altrarak veriler zerindeki btnsel ilevleri yerine getirir ve

    transaction sonlandrrlar. Yani Sunum Katman nda yer alan uygulamalar sadece gerekli verileri parametre olarak i katmannda

    yer alan componentlere gnderirler. Dolaysyla zerlerinde ilgili veritaban verileri iin herhangibir fonksiyon veya metodun

    altrlmasna gerek yoktur. Btn sorumluluk Component Services da yer alan COM+ componentindedir. Burada veirtabanlarna

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 40/782

    balanlr , gerekli dzenlemeler bir Transaction iersinde gerekletirilir ve sorunsuz bir transaction tm i paracklar ile teyid

    edilerek gerekli dzenlemeler veritabanlarna yanstlr.

    En basit haliyle 3 katl mimaride, Sunum Katman ile Veritabanlar arasndaki transaction ilemlerini COM+ Componentleri ile

    gerekletirebiliriz. Bu componentler Windows 2000 den itibaren Component Service olarak adlandrlan bir servis altnda yer

    almaktadrlar. Elbetteki bu componenti biz gelitireceiz. Componentin grevi , transaction ilemlerinin otomatik yada manuel

    olarak gerekletirilmesini salamaktr. Bir dll dosyas haline getirilen bu componentleri istenilen Sunum Katman uygulamasna

    ekleyerek kullanabiliriz. Yazacamz component iinde Transaction ilemlerini kullanabilmek amacyla .NET ierisinde yer alan

    System.EnterpriseServices snfnn metodlarn kullanrz. Oluturulan componenti rneklerimizde de greceiniz gibi bir

    Strong Name haline getirmemizde gerekmektedir. rneimizi yazarken bunlar daha iyi anlyacaksnz. katl mimaride, Datk

    Transaction uygulamalarnn aadaki ekil ile zihnimizde daha berrak canlanaca kansndaym.

    ekil 1. 3 Katl Mimari iin COM+ Kullanm

    zetlemek gerekirse, Datk Transaction larn kullanld uygulamalarda Component Services kullanlmas gerekmektedir. Bir

    Datk Transaction Componenti yazdmzda, transaction ilemlerini otomotik olarak Component Servicea yaptrabiliriz. Bunun

    yannda ContexrUtil ad verilen nesneyi ve bu nesneye ait SetComplete(), SetAbort() gibi metodlar kullanarak Transaction

    ilmelerini elle de yaplandrabiliriz. Bu makalemizde otomatik olan setim. Bir sonraki makalede ilemleri manuel olarak

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 41/782

    yapcaz.Dilerseniz rneimize geelim . Bu uygulamzda 2 veritaban zerindeki 2 farkl tablo iin, bir Transaction ierisinde basit

    veri giri ilemleri gerekletireceiz. ncelikle tablolarmn yapsn ve databaselerimizi belirtelim. Firends isimli bir Veritaban nda

    kullanacamz basit bir tablo var. Satislar isimli bu tabloda Ad,Soyad ve SatisTutari alanlar yer almakta.

    ekil 2. Satislar tablosunun yaps.

    kinci Veritabanmz ise IstanbulMerkez. Tablolamuzun ad Primler. Bu tabloda ise yine Ad,Soyad ve Prim bilgisi yer alyor.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 42/782

    ekil 3. Primler tablosunun yaps.

    Uygulamamzda Satislar isimli tabloya bilgi girildikten sonra SatisTutarinin %10 u zerinden prim hesaplancak ve ayn anda

    Primler tablosuna bu bilgiler eklenecek. Tabiki bu iki basit veritaban ilemi bir Transaction iinde gerekletirilecek. Uygulamamz

    tasarlamaya balayalm. nce yeni bir C# ile yeni bir Windows Application oluturalm. Bu uygulamann ierdii Form Sunum

    Katman nda yer alan veri giri ekranmz olucaktr. Formu aadakine benzer veya ayn ekilde tasarlayalm.

    ekil 4. Formun yaps.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 43/782

    Kullanc bu ekrandan Ad,Soyad ve Sat Tutar bilgilerini girecek. Girilen bu bilgiler, yazacamz COM+ Componentindeki metoda

    parametre olarak gidicek ve bu metod iinde ilenerek veritabanlarndaki tablolarda gerekli dzenlemeler yaplcak. Eer tm

    ilmeler baarl olursa ve metod tam olarak alrsa geriyede ilemlerin dolaysyla Transactionn baarl olduuna dair bir string

    bilgi gnderecek. Evet imdi uygulamann en nemli ksmna sra geldi . Componentin tasarlanmasna. lk nce, Project

    mensnden Add Component komutunu vererek component imizi uygulamamza ekliyoruz.

    ekil 5. Component Eklemek.

    Ben componentimize SatisPrimEkle adini verdim. Bu durumda Solutionmza SatisPrimEkle.cs isimli dosya eklenir ve Visual

    Studio.NET IDEde aadaki gibi grnr.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 44/782

    ekil 6. Componentin ilk eklendiinde IDE de durum.

    imdi ise bu component iersinde yer alcak datk transaction ilemleri iin gerekli olan referansmzn projemize eklememize

    gerekiyor. Daha ncede System.EnterpriseServices olarak bahsettiimiz bu snf eklemek iin yine, Project mensnden, Add

    Reference komutunu veriyoruz. Burada ise .NET sekmesinden System.EnterpriseServices snfn ekliyoruz.

    ekil 7. System.EnterpriseServices Snfnn eklenmesi.

    imdi Componentimizin kodlarn yazmaya balayabiliriz. To Switch To Code Window linkine tklayarak component imizin

    kodlarna gei yapyoruz. lk haliye kodlar aadaki gibidir.

    using System;

    using System.ComponentModel;

    using System.Collections;

    using System.Diagnostics;

    namespace distrans

    {

    ///

    /// Summary description for SatisPrimEkle.

    ///

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 45/782

    public class SatisPrimEkle : System.ComponentModel.Component

    {

    ///

    /// Required designer variable.

    ///

    private System.ComponentModel.Container components = null;

    public SatisPrimEkle(System.ComponentModel.IContainer container)

    {

    ///

    /// Required for Windows.Forms Class Composition Designer support

    ///

    container.Add(this);

    InitializeComponent();

    //

    // TODO: Add any constructor code after InitializeComponent call

    //

    }

    public SatisPrimEkle()

    {

    ///

    /// Required for Windows.Forms Class Composition Designer support

    ///

    InitializeComponent();

    //

    // TODO: Add any constructor code after InitializeComponent call

    //

    }

    ///

    /// Clean up any resources being used.

    ///

    protected override void Dispose( bool disposing )

    {

    if( disposing )

    {

    if(components != null)

    {

    components.Dispose();

    }

    }

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 46/782

    base.Dispose( disposing );

    }

    #region Component Designer generated code

    ///

    /// Required method for Designer support - do not modify

    /// the contents of this method with the code editor.

    ///

    private void InitializeComponent()

    {

    components = new System.ComponentModel.Container();

    }

    #endregion

    }

    }

    Biz buradaki kodlar aadaki ekliyle dzenleyecek ve yukarda yazl ou kodu kartacaz. Haydi balayalm. ncelikle using

    ksmna,

    using System.Data.SqlClient;

    using System.EnterpriseServices;

    snflarn eklememiz gerekiyor. nk Transaction ilemleri iin EnterpriseServices snfn ve veritaban ilemlerimiz iinde

    SqlClient snfnda yer alan nesnelerimizi kullanacaz. kinci kkl deiimiz ise SatisPrimEkle isimli snfmzn

    ServicedComponent snfndan tretilmi olmas. Bu deiiklii ve dier fazlalklar karttmz takdirde, kodlarmzn son hali

    aadaki gibi olucaktr.

    using System;

    using System.ComponentModel;

    using System.Collections;

    using System.Diagnostics;

    using System.Data.SqlClient;

    using System.EnterpriseServices;

    namespace distrans

    {

    public class SatisPrimEkle : ServicedComponent

    {

    }

    }

    imdi metodumuzu ekliyelim ve gerekli kodlamalar yazalm.

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 47/782

    using System;

    using System.ComponentModel;

    using System.Collections;

    using System.Diagnostics;

    using System.Data.SqlClient;

    using System.EnterpriseServices;

    namespace distrans

    {

    /* [Transaction(TransactionOption.Required)] satr ile belirtilen udur. Component imiz var olan Transaction ierisinde

    altrlacaktr. Ancak eer oluturulmu yani balatlm bir transaction yoksa, bu component imiz iin yeni bir tane oluturulmas

    salanacaktr. Burada,

    TransactionOption'n sahip olabilecei dier deerler Disabled, NotSupported, RequiresNew ve Supported dr.

    Disabled durumunda, transaction zellii grmezden gelinir. Default olarak bu deer kabul edilir. Bu durumda Transaction

    balatlmas gibi ilemler manuel olarak yaplr.

    Not Supported durumunda ise Component imiz bir transaction var olsa bile bu transaction'n dnda alcaktr.

    RequiresNew durumunda, Component imiz iin bir transaction var olsada olmasada mutlaka yeni bir transaction balatlacaktr.

    Supported durumu ise , var olan bir transaction olmas durumunda, Component imizin bu transaction'a katlmasn salar.

    Biz uygulamamzda otomatik transaction tekniini kullandmz iin Required seeneini kullanyoruz.

    */

    [Transaction(TransactionOption.Required)]public class SatisPrimEkle : ServicedComponent

    {

    /* AutoComplete() satr izleyen metodun bir transaction ierisinde yer alacan ve transaction ilemlerinin balatlmas ve

    bitirilmesini Component Services 'n stleneceini belirtir. Dolaysyla Component imizin bu metodunu altrdmzda bir

    transaction balatlr ve ContexUtil nesnesi ile manuel olarak yapacamz SetComplete (Commit) ve SetAbort(Rollback)

    hareketlerini COM+ Servisi kendisi yapar. */

    [AutoComplete()]public string VeriGonder(string ad,string soyad,double satisTutari)

    {

    SqlConnection conFriends = new SqlConnection("initial catalog=Friends;data source=127.0.0.1;integrated

    security=sspi;packet size=4096");

    SqlConnection conIstanbulMerkez = new SqlConnection("initial catalog=IstanbulMerkez;data

    source=127.0.0.1;integrated security=sspi;packet size=4096");

    /* Yukardaki SqlConnection nesneleri tanmlanrken data source zelliklerine sql sunucusunun bulunduu ip adresi

    girildi. Bu farkl ip'lere sahip sunucular sz konusu olduunda farkl veritabanlarnda kullanabiliriz anlamna gelmektedir.

    Uygulamamz ayn sunucu zerinde gerekletirmek zorunda olduum iin ayn ip adreslerini verdim.*/

    /* Adaki satrlarda veri girii iin gerekli sql cmlelerini hazrladk ve bunlar SqlCommand nesneleri ile ilikilendirip

    altrdk. */

    string sql1="INSERT INTO Satislar (Ad,Soyad,SatisTutari) VALUES ('"+ad+"','"+soyad+"',"+satisTutari+")";

    double prim=satisTutari*0.10;

    string sql2="INSERT INTO Primler (Ad,Soyad,Prim) VALUES ('"+ad+"','"+soyad+"',"+prim+")";

  • Makaleler Burak Selim enyurt www.bsenyurt.com [email protected]

    Created by Burak Selim enyurt 48/782

    SqlCommand cmdSatisGir=new SqlCommand(sql1,conFriends);

    SqlCommand cmdPrimGir=new SqlCommand(sql2,conIstanbulMe