Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Ahmet Faruk Nacaroğlu
Ahmet Faruk Nacaroğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
40 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  ADO.NET/SQL Ahmet Faruk Nacaroğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : ADO.NET/SQL
Yayınlanma Tarihi : 14.1.2004
Okunma Sayısı : 39022
Yorum Sayısı : 7     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 30.6.2022
Turhal Temizer
Mac OS/X Removing CUDA 30.6.2022
Burak Selim Şenyurt
Rust Pratikleri - Value Moved Here 30.6.2022
Burak Selim Şenyurt
Rust Pratikleri - State Tasarım Kalıbı 30.6.2022
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
C# ile MS Access Stored Queries Kullanımı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Hızla gelişen ve değişen dünyaya ayak uydurmak için bilgisayarları hayatın tüm alanlarında kullanmak neredeyse zorunlu hale geldi. Diğer taraftan özellikle iş dünyasının bugünkü hacimde iş yapabilmesinde bilişim sektörünün katkısı yatsınamaz. Kısacası hem bilişim hem de iş dünyası birbirlerinin gelişmelerinde adeta katalizör gibi çalışıyorlar. Bu durumda kurumların iş süreçlerinin bilgisayar ortamında yürütülmesi için çok sayıda ve karmaşık uygulamara ihtiyaç gün geçtikçe artıyor. Bu da biz yazılımcılar için güzel bir gelişmedir.

Fakat yukarıda bahsettiğim olayın diğer bir yüzü de var. Çoğu zaman müşterilere sunduğumuz çözümlerde esneklik onlar için önemli bir kirter haline gelmiştir. Bir yazılımı geliştirirken çok değişik araçlar kullanma ihitmalinin olması bir bakıma bizim ilermizi yaparken daha planlama aşamasında dikkatli olmamızı zorunlu kılar hale gelmiştir. Bu yazıda inceleyeceğimiz konu da üreteceğimiz çözümleri daha fazla nasıl esnek hale getirebiliriz sorusuna cevap vermeye odaklanmıştır.

Düşünün ki siz bir uygulama geliştiriyorsunuz. Uygulamanızın veritabanı olarak hem Access hem de sQL Server ile sorunsuz çalışması gerekiyor. Mesela herhangi bir A şirketi ile bir proje konusunda anlaştınınz. Her şey tamam ama kullanılacak veritabanı konusunda onlar kararsız kaldı. Ya da onlara Access ucuz ama sınırlı bir çözüm olduğunu anlatmanıza karşın SQL Server gibi tam donanımlı bir veritabanı sunucusunun yetenklerinden bahsettikten sonra mlaiyetini de şu kadarcık dediniz. Onlar ne isterler acaba? Büyük ihtimal size önce Ms Access kullanalım eğer zamanla daha fazla veri işlemek zorunda kalırsak SQL Server'a geçeriz mi dediler?

Diğer taraftan sizin profesyonel bir yazılımcı olduğunuz varsayaraktan program kodları içinde SQL sorgularını görmekten hoşlanmadığınızı düşünelim. Hoşlanmamaktan ziyade programı olduğunca modüler geliştirmek ve kodun okunmasını kolaylaştırmak sizi ileride büyük sıkıntılardan kurtaracaktır. O zaman çözümü şu şekilde planlamakta fayda olduğuna inamıyorum. Uygulama 4 katmandan oluşmalı. En arkada veritabanı ve içine gömülmüş Saklı Yordamlar (Stored Procedures), veri erişim katmanı (Data Acces Layer), iş kuralları katmanı (Business Logic Layer) ve sunum katmanı (Presentation Layer). Eğer bu katmanları kulalnırsak uygulamamız yeteri kadar modüler olacaktır. Bir de .NET'in getirdiği esnekliklerle birlikte artık sunum katmanını diğer üç katman sabit kalmak koşulu ile sunum katmanını değiştirdiğimizde uygulammız gayet güzel çalışır. Sunum katmanı değiştirmekten kastim ise ister web formları veya windows formlarını kullanmaktır. Yani Uygulamamızı ASP.NET veya Windows uygulaması olarak çalıştırmak için sadece bu katmanı değiştirmek kafi olacaktır.

Buraya kadar herşey tamam gibi görnüyor. Az önce bahsettiğimiz gibi SQL Server ve saklı yordamları kullanmak gayet kolay. Fakat Access ile saklı yordamları kullanmak mümkün mü? Microsoft'un tüm benzer uygulamarında entegrasyona büyük önem vermesinden dolayı mümkün. Bunun için iki değişik yoldan birini seçebiliriz. Birincisi bir Access veritabanı içine saklı yordam gömebiliriz. Fakat bu iş için herhangi bir arayüz yok. Bunu yapmak için koda yazmak zorundayız. Diğer bir çözüm ise Access'te tanımladığımız Sorguları (Queries) saklı yordam çağıtıyor gibi çağırabiliriz. Bu tür sorgulara saklı sorgular (stored queries) ismi veriliyor.

MS Access Saklı sorguları tabiki karmaşık SQL Server saklı yordamlarından daha az yetenekli ama sizin işinizi büyük oranda göreceğine inanıyorum. Hatta bu tür sorguları program kodu içinden çağırmanın Access veritabanı ile çalışan uygulaların perfromanslarını belli ölçüde artırdığına dair değişik inceleme makaleleri de mevcut. Çünkü Access saklı yordamları da veritabanı içinde bir nevi derleniyorlar! Yalnız SQL Server saklı yordamlarındaki geri dönüş parametrelerinin Access saklı yordamlarında bulunmadığını hemen belirtelim. İsterseniz hemen nasıl saklı yordamları kullanacağımız öğrenmeye koyuyalım.

Örnek Uygulama

İlk görevimiz bir Access veritabanı oluşturmak olacak. İsmine db1.mdb verdiğimiz veritabanımıza Kullanicilar adlı bir tabo ekleyelim. Tablonun detayları aşağıda Şekil 1'de verilmiştir:


Şekil 1: Kullanicilar tablomuz ve yapısı

Yeni sorgu oluşturmak için hemen Access içinde veritabanımızın sorgular sekmesine tıklayalım:


Şekil 2: Sorgular sekmesi (Türkçe Ofis için Queries yerine Sorgular olmalı)


Ardından Tasarım görünümde Sorgul oluşuturma (Create query in Design view) seçeneğine tıklayınız. Karşımıza hemen tabloların listeleri çıkacaktır. Aslında listede sadece bir tablo olduğu için Kullanicilar'ı sorguya dahil edelim. Ardından sorgu ekranında boş bir yere sağ tıklayalım. Karşımıza çıkan seçeneklerden Sorgu Tipini ordan da Append Query'i seçelim:


Şekil 3: Sorgu tipini seçme


Seçme işleminden sonra karşımıza çıkan menüden tablo ismi olarak tabiki Kullanicilar'ı seçelim. Yine boş bir yerde sağ tıklayıp Parameters seçeneğiniz tıklammız gerekiyor. Karşımıza çıkacak kutucuğa parametreleri ve veri tiplerini sırası ile girelim. Örneğimiz için parametreler aşağıdaki gibi olmalı:


Şekil 4: Sorguya parametre ekleme

Yukarıda görülen şekilde parametrelerimiz ekldedikten sonra "OK"'yi tıklayıp yolumuza devam edelim. Şimdi sıra yine sorgu ekranında boş bir yere sağ tıklayıp çıkan şeyde (çıkan şeyin ismi aslında context menü'dür.) SQL view'i tıklayalım. Karşımıza sorgumuzun SQL kodu çıkacaktır.


Şekil 5: Sorgumuzun SQL görünümü


Yukarıdaki kodu dikkatlice incelerseniz bu koda bizim tam olarak istediğimiz gibi olmamış. Hemen bunu gerektiği gibi düzenleyelim:


Şekil 6: Sorgumuzun düzenlenmiş hali


Evet Şekil 6'daki haliyle sorgumuz tamamlanmış oldu. Değişikleri bir gözden geçirecek olursak. Öncelikle parametrelerin veri tipleri doğruydu ama büyüklükleri gereğinden fazla idi (herbiri 255 karakterdi). Diğer bir düzeltme ise Insert sorgusnun tamamlanmasıdır. Bu noktada özellikle son satıra dikkat etmeliyiz. Değerler olarak parametreleri veriyoruz!

Sorgumuzu sp_KullaniciEkle ismiyle kaydettikten sonra çalıştırmak için üstüne çift tıklayalım. Sorgu önce bizi uyaracak. Uyarı mealen tabloya yeni bri kayıt ekliyorsunuz dikkat edindir. Sonra bizden parametreleri aşağıdaki sıra ile isteyecektir.


Şekil 7: Sorgumuzu Access içinde çalıştırınca istenen parametreler.


İkinci bir saklı yordam daha yazmakta fayda olduğuna inanıyorum. Bu defa yazacağımız saklı yordam birincisiden farklı olacak. Parametre almayan ve SELECT sorgusu yapan bir saklı yordam. İsmini "sp_TumKullanicilariListele" olarak verebiliriz. Saklı yordamın SQL kodu aşağıda yeralıyor:

SELECT * FROM Kullanicilar;
Sıra program kodumuzu yazmaya geldi. program kodumuzu isterseniz Windows uygulaması olacak şeklide yazalım. Bunun için hemen bir Windows Projesi oluşturalım. Projenin ismini ben Access_SakliYordamlar olarak verdim. Ardından aşağıda görülen formu tasarladım:


Şekil 8: Saklı Yordamlarla çalışmak için bir form

İsterseniz önce forma bir göz atalım. Form kolayca fark edeceğiniz gibi iki kısmdan oluşmaktadır. Üst kısımda yeni kullanıcı eklemek için gerekli kontroller yeralıyor. Bunlar metin kutuları ve düğmemizdir. Alta ise sisteme kayıtlı tüm kullanıcıları listeleyen bir DataGrid. Bu işlem için aşağıdaki fonksiyonu kullanacağız:

//dataGrid'e tüm kullanıcıları yükleyen fonksiyon:
public void KullanicilariListele()
{
     /********************************************************************
     *
     * BU ÖRNEK STORED QUERYLERİ PARAMETRESİZ ÇAĞIRMAYA YÖNELİKTİR!!!
     *
     ********************************************************************/

     // veritabanımıza bağlantı için gerekli string:
     string strBaglanti = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\db1.mdb";

     // Bağlantı nesnemiz:
     OleDbConnection conBaglanti = new OleDbConnection(strBaglanti);      // Komutumuzu tanımlayalım
     OleDbCommand cmdKullanicilar = new OleDbCommand( );

     // komutumuzun tipini ve ismini verelim:

     /* *******************************************************
     *
     * DİKKAT EDİN KOMUTUMUZUN TİPİ STORED PROCEDURE
     * ve COMMAND TEXT'imiz ise STORED PROCEDURE'UN İSMİ
     *
     ********************************************************/
     cmdKullanicilar.CommandType = CommandType.StoredProcedure;
     cmdKullanicilar.CommandText = "sp_TumKullanicilariListele";     

     // Komuta ilgili bağlantıyı ekleyelim:
     cmdKullanicilar.Connection = conBaglanti;      

     // DataAdapter nesnemizi oluşturalım:
     OleDbDataAdapter daKullanicilar = new OleDbDataAdapter(cmdKullanicilar);

     // DataSetimizi tanımlayalım:
     DataSet dsKullanicilar = new DataSet();

     // Bağlantımızı açalım:
     conBaglanti.Open();

     // DataAdapterımızı dolduralım:
     daKullanicilar.Fill(dsKullanicilar,"Kullanicilar");

     // Datagridimize dataseti ekleyelim:
     dgKullanicilar.DataSource = dsKullanicilar.Tables["Kullanicilar"];

     // Son olarak bağlantımızı kapatalım:
     conBaglanti.Close();
}


Kod 1: Tüm kullanıcıları DataGrid'e aktaran metod Yukarıdaki metod ilk bakışta veritabanından bir takım verileri datagiride aktaran rutin gibi görünüyor. Aslında bu biraz garip bir metod. Hem kullanılan komutun tipi saklı yordam (CommandType.StoredProcedure satırına dikkat ediniz) hem de Access veritabanı ile çalışıyor. İşte bu makalenin amacı da bu değil mi? Fakat biz burda saklı yordam (stored procedure) çağırıyormuş gibi görünmemize rağmen Access'te yeralan bir saklı sorgu (stored query çağırıyoruz)

Takdir ederseiniz ki form göründüğü anda kullanıların listesini görmek için formun load metodundan Kod 'de yeralan metodu çağırmalıyız.

private void Form1_Load(object sender, System.EventArgs e)
{
    // Önce dataGrid'e tüm kullanıcıları yükleyen fonksiyonu cağrılarım:
    KullanicilariListele();
}
Kod 2: Formun Load metodu

Son olarak kullanıcıyı sisteme ekleyen metodu inceleyelim birlikte. Bu metod ise adım adım oluşturduğumuz sp_KullaniciEkle sayesinde yeni bir kullanıcı ekliyor. Metodun kodu şu şekilde:

private void btnKullaniciEkle_Click(object sender, System.EventArgs e)
{

    // Veritabanı işlemlerine geçmeden önce kullanıcının girdiği
    // değerleri bir alalım:
    string strAdi = txtAdi.Text;
    string strSoyadi = txtSoyadi.Text;
    string strEmail = txtEmail.Text;

    // Normalde yukarıda kullanıcının tüm girdilerini kontrol etmek
    // gerekiyor. Fakat bu işlemi size bırakıyorum. Çünkü bu yazdıdaki
    // odak noktamız Acsess Stored Query''lerini stored procedure gibi kullanmak.      //--------- Veritabanı işlemleri başlıyor ------------//

    // veritabanımıza bağlantı için gerekli string:
    string strBaglanti = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\db1.mdb";

    // Bağlantı nesnemiz:
    OleDbConnection conBaglanti = new OleDbConnection(strBaglanti);

    // Komutumuzu tanımlayalım
    OleDbCommand cmdKullaniEkle = new OleDbCommand( );

    // komutumuzun tipini ve ismini verelim:

    /* *******************************************************
    *
    *   DİKKAT EDİN KOMUTUMUZUN TİPİ STORED PROCEDURE
    *   ve COMMAND TEXT'imiz ise STORED PROCEDURE'UN İSMİ
    *
    *********************************************************/
    cmdKullaniEkle.CommandType = CommandType.StoredProcedure;
    cmdKullaniEkle.CommandText = "sp_KullaniciEkle";

    /* *********************************************************
    * Parametreleri tanımlayıp onları komutumuza ekliyoruz: *
    ***********************************************************/

    // Önce kullanıcı adını içeren parametreyi hazırlayalım:
    OleDbParameter prmAdi = new OleDbParameter();
    prmAdi.ParameterName = "@Adi";
    prmAdi.OleDbType = OleDbType.VarChar;
    prmAdi.Size = 20;
    prmAdi.Value = strAdi;

    // Soyadını içeren parametre:
    OleDbParameter prmSoyadi = new OleDbParameter();
    prmSoyadi.ParameterName = "@Soyadi";
    prmSoyadi.OleDbType = OleDbType.VarChar;
    prmSoyadi.Size = 20;
    prmSoyadi.Value = strSoyadi;

    // Son parametremiz ise email için:
    OleDbParameter prmEmail = new OleDbParameter();
    prmEmail.ParameterName = "@Email";
    prmEmail.OleDbType = OleDbType.VarChar;
    prmEmail.Size = 50;
    prmEmail.Value = strEmail;

    /***** Parametreleri komuta ekle ****/
    cmdKullaniEkle.Parameters.Add(prmAdi);
    cmdKullaniEkle.Parameters.Add(prmSoyadi);
    cmdKullaniEkle.Parameters.Add(prmEmail);

    // Komuta bağlantı nesnemizi de ekleyelim:
    cmdKullaniEkle.Connection = conBaglanti;

    // Bağlantıyı açalım:
    conBaglanti.Open();

    // Komutu çağıralım ve sonucu ekrana yazdıralım:
    int sonuc = cmdKullaniEkle.ExecuteNonQuery();
    MessageBox.Show("Veritabanına " + sonuc.ToString() + " kayıt eklendi ");

    // Bağlantıyı kopart.
    conBaglanti.Close();

    // Yeni kayıt eklendiğne göre onu alt traftaki datagrid içinde
    // görmek gerekir. Bunun için kullanicilariListele()'yi çağıralım:
    KullanicilariListele();

}


Kod 3: Yeni bir kullanıcı veritabanına ekleyen metod

Yukarıdaki metod'un birinci yazığımızdan farklarından birisi Access saklı sorgusunu çağırırken parametre kullanıyor olmamız. Diğeri ise işin doğasından ötürü DataSet ve DataAdapter olaylarına hiç girmeden direk olarak komut nesnemizin ExecuteNonQuery metodundan faydalanmamızdır.

Sizin de gördünüz gibi Access saklı sorgularını tıpki SQL Server veya başka bri veritabanı sunucusunda (Oracle, DB2 gibi) yeralan saklı yordam çağırmak kadar kolaydır. Hatta ister parametreli ister parametresiz çağırma şanslarına sahipsiniz. Biz örneğimizde INSERT ve SELECT komutları ile çalıştık. DELETE ve UPDATE komutlarını da Access sorgu yordamlarmızda kullanabilirsiniz. Örnek programcığın kodunu indirebilirsiniz. bu kodu mutlaka derleyip çalıştırınız. Hatta DELETE ve UPDATE komutlarını da kullanacak şekilde değiştirmeniz sizin için öğrendiğinizi pekiştirmek babında faydalı olacağı kanaatindeyim.

Örnek kaynak kodları indirmek için tıklayın.

Makale:
C# ile MS Access Stored Queries Kullanımı ADO.NET ve SQL Ahmet Faruk Nacaroğlu
  • Yazılan Yorumlar
  • Yorum Yaz
EYL
11
2014
Güzel bir makale :)
EYL
11
2014
Güzel bir makale :)
EYL
11
2014
Güzel bir makale :)
EYL
11
2014
Güzel bir makale :)
EYL
11
2014
Güzel bir makale :)
EYL
11
2014
Güzel bir makale :)
AĞU
17
2006
bu makaleniz için çok teşekkür ediyorum. tam aradığım konuydu.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor