ForuMini-Adı Gibi Sevimli Tek Adres
Oyunlar Gruplar Bloglar Albümler Mini-Chat

Go Back   ForuMini-Adı Gibi Sevimli Tek Adres > Bilgisayar > Program Download > Diğer Programlar

Cevapla
 
LinkBack Seçenekler Stil
Alt 16.04.08, 00:15   #1 (permalink)
Çılgın Yönetici
 
no comment - ait Kullanıcı Resmi (Avatar)
 
no comment - MSN üzeri Mesaj gönder no comment - YAHOO üzeri Mesaj gönder no comment isimli Üyeye Skype üzeri Mesaj gönder
: yeni : ADO Teknolojisi

Bu konu içinde ADO ile ilgili bilgiler vardır.

ADO Teknolojisi

ADO Genel Bilgiler
Uygulama programcılarının ihtiyaç duyduğu önemli bir araç, uygulamaların geniş bir veri grubuna ulaşıp işlem yapmasını sağlayacak tutarlı ve basit bir programlama arayüzüdür. Bu veri kaynağı basit bir metin dosyası olabileceği gibi çok karmaşık bir veri tabanı yapısında da olabilir. (Tipik bir veri kaynağı ise Open Database Connectivity(ODBC) standardını destekleyen Stuructured Query Language(SQL) komutlarıyla işlenen ilişkisel bir veri tabanıdır.) Kullanılan arayüz bu çeşitli yapıdaki verilere erişirken ve bunlar üzerinde işlem yaparken varsayımlara dayanmamalıdır. Burada ortaya çıkabilecek sorunların aşılması için Microsoftun önerdiği çözüm OLE DB dir. Bu yapı çeşitli yapıdaki kaynaklara erişmede bir standart sağlar. Fakat OLE DB arayüzü optimum ihityaçlara göre düzenlenmiş olduğundan kullanımı gerekli basitlikte değildir. İşte uygulama programı ile OLE DB arsında köprü vazifesi yaparak bu basitliği sağlayacak olan ADO'dur.

ADO güçlü ve basit bir veri modelidir. ADO, veri tabanı sunucusundaki bilgilere erişmeyi ve üzerinde işlem yapmayı sağlar. Bunu yaparken bir OLE DB veri sağlayıcısı kullanılır.

ADO'nun bu işlemlerde göze çarpan özellikleri; kolay kullanımı, yüksek düzeydeki hızı, düşük bellek ihtiyacıdır.

ADO özellikle istemci-sunucu ve web tabanlı uygulamalarda kullanılmaya uygun temel niteliklere sahiptir.

Bunun yanında ADO, sunucudan istemci uygulamalarına veri taşınması ve işlenen verilerin geri döndürülmesini bir tek döngüde gerçekleştiren RDS(remote data service)nin gelişimine de yol vermiştir. RDS, ADO programlama modeliyle birleştirilerek istemci tarafından yapılan uzak veri işlemlerinin kolaylaştırılması sağlanmıştır.

Takip eden bölümde ADO ile programlamaya giriş bağlamında ilgili başlıklar altında özelleşmiş bilgiler verilmiştir.

ADO ile Programlama
ADO, bir veri kaynağı üzerinde işlem yapmayı sağlayacak bir dizi işlemden oluşan bir programlama modeli sunmaktadır.

Bu proglamlama modeli nesne tabanlıdır. Bu nesneler, veri üzerinde işlem yapmayı sağlayacak bir grup metot ve veri özelliklerini belirleyecek ya da metotların kontrolünü sağlayacak niteliklerden oluşur. Aynı zamanda nesnelere bağlı olaylar vardır.

[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]

örnek 1 - basit ADO modeli

ADO'nun sağladığı temel nitelikleri şöyle sıralıyabiliriz :

Toplu günleme (batch updates)
Depolanmış prosedürler (stored procedures)
Serbest bağlı nesneler (free threaded objects)
Çeşitli imleç tipleri (various cursor types)
Kayıtkümesi önbellek yönetimi (recordset cache management)
Bir Visual Basic veritabanını web üzerinde geliştirmek için ADO en kolay metotlardan birini sunmaktadır.

örnek 2 - web üzerindeki bir veritabanına ADO kullanarak erişim örneği.

ADO Programlama Modeli

Temel Yaklaşım
Burada kaba hatlarıyla ADO programlama modelinin gerçekleştirdiği olaylar anlatılmaya çalışılacaktır:

Bir veri kaynağına bağlanılır. Veri üzerinde yapılan değişikliklerin ya başarılı bir şekilde tamamlanması ya da hiç yapılmaması sağlanabilir.

Veri kaynağı üzerinde işlem yapabilmek için bir komut tanımlanır. Bu komut değişken parametreler içerebileceği gibi performansı optimize etmeye yönelik de olabilir.

Komut çalıştırılır.

Eğer komut veriyi tablo içinde satırlar şeklinde döndürürse, bu satırlar kolayca test edilmek ve işlenebilmek üzere bir ön bellek içersinde saklanır.

Eğer uygunsa veri kaynağı da bu ön bellekteki satırlardan günlenir.

Hataları bulmaya yarayacak genel yöntemler oluşturulur.

Bu aşamalar programlama modelinde genel olarak geçilecek aşamalardir. Fakat ADO'nun esnekligi, nesnelerin birbirinden bağımsız olarak yaratılabilmesi ve sadece modelin belli kısımlarını çalıştırmaya izin vermesidir. Yani kayıtkümesi nesnesi oluşturmak için bağlantı nesnesi oluşturulması gerekli değildir ve veri tabloları direk olarak ön belleğe kopyalanıp, üzerinde işlemler yapılabilir.

Detaylı Yaklaşım (Nesne Modeli)
ADO programlama modelinin temel parçaları aşağıda sıralanmıştır:

bağlantı (connection)
komut (command)
parametre (parameter)
kayıtkümesi (recordset)
alan (field)
hata (error)
özellik (property)
biriktiri (collection)
olay (event)
ADO, class ve nesne yapılarını kullanarak kabaca şu aktiviteleri gerçekleştirir :

Bir veri kaynağına bağlantı yapılır (bağlantı) ve isteğe bağlı olarak bir işlem başlatılır.
İsteğe bağlı olarak bir SQL komutu yerine geçecek bir nesne oluşturulur.
İsteğe bağlı olarak parametre kullanarak SQL komutundaki kolon, tablo ve değerler belirlenir.
Komut işletilir.
Eğer komut satır döndürürse satırlar bir bellek alanında depolanır (kayıtkümesi).
Veriler ekleme,silme veya değiştirme yapılarak işlenir (kayıtkümesi).
Veri kaynağı bellek alnından günlenir (kayıtkümesi).
İşlemde yapılan değişklikler kabul edilir veya rededilir ve işlem bitirilir (bağlantı).

ADO Nesneleri

Bağlantı Nesnesi (connection object) :

Uygulama programından veri kaynağına erişim, veri alışverişi için gerekli ortamı oluşturacak bağlantı üzerinden sağlanır. Bu erişim bazen veri kaynağına direkt olabileceği gibi(iki katlı sistemler) bir aracı(örnek microsoft internet information system) kullanılarak da sağlanabilir(üç katlı sistemler).

Nesne modelinde bağlantı, bağlantı nesnesiyle içerilir. Bağlantı nesnesi veri kaynağına açık bir bağlantıyı temsil eder. Bağlantı nesnesinin biriktirilerini (collections),metotlarını ve özelliklerini kullanarak şunlar yapılabilir:

Bağlantıyı açmadan önce ConnectionString, ConnectionTimeout ve Mode özelliklerini kullanarak bağlantıyı şekillendirebiliriz.
Toplu günlemeleri destekleyen Client Cursor Provider aktive etmek için CursorLocation özelliğini kurabiliriz.
DefaultDatabase özelliğini kullanarak bağlantı için önceden belirlenmiş bir veri tabanı atayabiliriz.
Açılan işlemler için izolasyon seviyesini IsolationLevel özelliğini kullanarak belirliyebiliriz.
Provider özelliğiyle bir OLE DB veri sağlayıcısı belirleyebiliriz.
Open ve Close metotlarıyla veri tabanına fiziksel erişimi kurabilir ve kesebiliriz.
Bağlantı üzerinden bir komutu Execute metotuyla çalıştırabilir ve komutun çalışmasını CommandTimeout özelliği ile şekillendirebiliriz.
BeginTrans, CommitTrans, RollbackTrans metotlarını ve Attributes özelliğini kullanarak, açık bağlantı üzerindeki işlemleri yönetebiliriz.
Errors biriktirisiyle (collection) veri kaynağından döndürülen hataları kontrol edebiliriz.
Version özelliğiyle ADO'nun versiyonunu okuyabiliriz.
OpenSchema metoduyla kullandığınız veri tabanı şeması hakkında bilgi edinebiliriz.
Bir işlem sırasında veri değişikliklerinin ya başarılı bir şekilde tümden yapılmasını ya da hiç yapılmamasını ADO sağlar. ADO eğer yapılan işlem iptal edilir ya da işlem sırasındaki herhangi bir safhada hata oluşursa, bütün olarak işlemin yapılmamış gibi kabul edilmesine neden olacaktır, veri kaynağı önceki halini koruyacaktır.

Nesne modelinde işlem kavramı açıkça içerilmez. Bu bağlantı nesnesi metotlarıyla ifade edilir.

ADO veri ve servislere OLE DB sağlayıcısından ulaştığından bağlantı nesnesi belli bir sağlayıcıyı belirtmesi için kullanılır.


örnek 3 - bir microsoft veritabanına TimeSheet adlı DSN kullanarak oluşturulan bir bağlantı nesnesi - `bir ADO nesnesi oluşturulması
Set oDBTime = Server.CreateObject("ADODB.Connection")

`veritabanının açılması
oDBTime.Open "TimeSheet"



Komut Nesnesi (command object) :

Komutlar kurulan bağlantıda veri kaynağı üzerinde işlem yapmada kullanılır. Tipik olarak bu işlemler ekleme, silme ve günleme veya veriyi veri satırları halinde almaktır. Nesne modelinde komut kavramı komut nesnesiyle içerilir. Bu nesnenin varlığı ADOya komut üzerinde işleyişe ilişkin optimizasyonlar yapmayı sağlar. Komut nesnesinin biriktiri (collection), metot ve özellikleriyle yapılabilecekleri şöyle sıralayabiliriz :

CommandText özelliğiyle çalıştırılabilir komut metinini (örneğin bir SQL satırını) tanımlayabiliriz.
Parametre nesnesi ve Parametreler biriktirisiyle parametreli sorgular ve depolanmış prosedür argümanlarnı tanımlayabiliriz.
Execute metoduyla bir komutu işletip kayıtkümesi nesnesi döndürebiliriz.
Komut işleyişini optimize edebilmek için CommandType özelliğini kullanarak komutun tipini belirleyebiliriz.
Prepared özelliğiyle komutu çalıştırmadan önce veri sağlayıcının komutun hazır (derlenmiş) bir versiyonunu saklayıp saklamadığını kontrol edebiliriz.
Veri sağlayıcının komutu çalıştırmadan önce belli bir süre beklemsini sağlamak üzere CommandTimeout özelliğini kullanabiliriz.
Bir açık bağlantıyı ActiveConnection özelliğini kullanarak bir komut nesnesiyle ilişkilendirebiliriz.
Name özelliğini kullanarak bir komut nesnesini ilişkilendirildiği bağlantı nesnesi üzerinde bir metot olarak tanımlayabiliriz.
Veri sağlamak için bir komut nesnesini kayıtkümesinin Source özelliğine iletebiliriz.
Bir komut nesnesini bağımsız olarak oluşturabilmek için ActiveConnection özelliğini geçerli bir bağlantı katarına atarız. ADO bu durumda yine bir bağlantı nesnesi oluşturacak fakat bu nesneyi bir nesne değişkenine atamıyacaktır. Burada dikkat edilecek nokta eğer aynı bağlantıya birden çok komut atıyorsanız bağlantı nesnesini bir bağlantı değişkenine atayacak şekilde açık bir bağlantı oluşturmalısınız; çünkü aksi halde her komut için aynı bağlantı katarı kullanılmış bile olsa farklı bir bağlantı nesnesi oluşturulur.

Bir komutu çalıştırmak için onu bağlantı nesnesi üzerindeki Name özelliğini kullanarak çağırmanız yeterli olacaktır. Komutun ActiveConnection özelliği bağlantıyla ilişkilendirilmiş olmalıdır. Eğer komutun parametreleri varsa bu değerleri metot argümanları olarak iletebilirsiniz.

Parametre Nesnesi (parameter object) :

Genellikle komutlar değişken parçalara, parametrelere ihtiyaç duyarlar. Böylece veri alınışında her seferinde aynı komutu değişik özellikte kullanmak mümkün olur.

Parametreler özellikle fonksiyon gibi çalışan komutların çalıştırılmasında yararlıdır. Böyle durumlarda komutun ne yaptığı bilinir fakat nasıl yaptığı bilinmez. Sadece gerekli parametre değeri gönderilir ve işlem gerçekleştirilir.

Nesne modelinde parametre kavramı parametre nesnesiyle içerilir. Bir parametre nesnesi bir komut nesnesiyle ilişkilendirilmiş bir parametre veya argümandır. Komutlar parametreler yardımıyla değişik şekilde işlev görme yeteneği kazanırlar. Parametre nesnesinin metot, özellik ve biriktirilerini kullanarak yapılabilecekler şöyle sıralanabilir :

Name özelliğiyle parametre ismini belirleyebilirsiniz.
Value özelliğiyle parametre değerini döndürebilirsiniz.
Parametre karakteristiklerini Attributes, Direction, Precision, NumericScale, Size ve Type özelliklerini kullanarak öğrenebilirsiniz.
AppendChunk metoduyla parametreye long binary ya da karakter verileri aktarılabilir.
Eğer depolanmış bir prosedür ya da parametreli bir sorgu ile ilişkilendirilmiş parametrelerin adları ve özellikleri biliniyorsa CreateParameter metoduyla parametre nesneleri oluşturulabilir ve Append metoduyla bunlar parametreler biriktirisine eklenebilir.

örnek 4 - bir parametre nesnesi oluşturma Set parameter = command. CreateParameter(Name,Type,Direction,Size,Value)



Kayıtkümesi Nesnesi (recordset object) :

Eğer veriyi bilgi satırları halinde döndüren bir sorgu komutu kullanılmışsa, bu satırlar yerel bir depoda saklanır. Nesne modelinde bu depo kayıtkümesi nesnesi olarak içerilir. Fakat bu kayıtkümesinin tek bir satırını belirten bir nesne yoktur. Herhangi bir zamanda kayıtkümesi nesnesi bütün kayıtların içinde tek bir kayıdı gösterir. Veri üzerinde yapılan işlemlerin hemen hemen tümü bu nesne kullanılarak yapılır. Kayıtkümesi nesnesi oluşturmak için bağlantı nesnesinin Execute metodu, komut nesnesi veya kayıtkümesi nesnesinin Open metodu kullanılır.

Kayıtkümesi yapısı bize şu imkanlari sunar:

Hangi satırların test etmeye hazır olduğunun belirlenmesini.
Satırların gezilmesini.
Satırları belirlenen bir sıralama ile gezilmesini.
Satır ekleme, çıkarma ve değiştirmesi işlemlerinin yapılmasını.
Veri kaynağının günlemesinin yapılmasını.
Kayıtkümesinin genel olarak yönetilmesini.
Kayıtkümesi nesnesi kullanılmadan önce bir imleç tipi belirlenmelidir. ADO'da tanımlı dört imleç tipi vardır :

Dynamic cursor : kayıtlar üzerinde diğer kullanıcılar tarafından yapılan ekleme, değiştirme, silme işlemlerini görmeyi sağlar. Eğer veri sağlayıcı kısıtlaması yoksa sık kullanılan (bookmark) yapısına izin verir.
Keyset cursor : diğer kullanıcıların yaptıkları ekleri görmeye izin vermez, silinen kayıtlara erişime izin vermez. Diğer kullanıcılarn yaptıkları değişiklikler ise görülebilir. Bookmark yapısını destekler.
Static cursor : bir grup kaydın statik bir kopyasını bilgi aramak, rapor oluşturmak için sağlar.Bookmark yapısı vardır. Diğer kullanıcıların yaptığı hiçbir işlem görünmez. İstemci-tarafı (client-side) kayıtkümesi nesnesi açtığınızda bu tip kullanılmasına izin verilen tek tiptir.
Forward-only cursor : Statik tipin özelliklerini taşır fakat kayıtlar üzerinde sadece ilerlemeye izin verir. Bu tip ADO'nun normalde(default) kullandığı tiptir.
Daha önce komut nesnesinde anlatıldığı üzere kayıtkümesi nesnesi de bağımsız olarak oluşturulabilir. Bir kayıtkümesi nesnesi açıldığında ilk kaydı gösterilir. MoveFirst, MoveLast, MoveNext, MovePrevious ve Move metotları kayıtlar arasında hareketi sağlayan metotlardır. BOF ve EOF özellikleri bu hareket esnasında sınırları kontrol etmeye yarar.

Kayıtkümesi nesneleri iki çeşit kayıt günlemeye izin verir. İlk yöntemde yapılan değişiklikler anında veri kaynağına aktarılır. Update metodu kullanılır. İkinci yöntem toplu halde yapılan değişikliktir. Bu yöntemin kullanılması için veri sağlayıcının desteklemesi gerekir. UpdateBatch metoduyla birden fazla üzerinde değişiklik yapılan kayıt bir kerede veri kaynağına aktarılır.


örnek 5 - bağımsız bir kayıtkümesi nesnesi oluşturma `ADO kayıtkümesi oluşturulması
set rsTimeSheet = CreateObject("ADODB.Recordset")
`Kayıtkümesi özelliklerinin belirlenmesi
rsTimeSheet.CursorType = adOpenKeyset
rsTimeSheet.Source = "Select * From EmpTime"
rsTimeSheet.Open


Alan Nesnesi (field object) :

Kayıtkümesinin bir satırı bir veya daha çok alandan oluşur. Eğer kayıtkümesini iki boyutlu bir yapı olarak düşünürseniz alanlar kolonları oluşururlar. Aynı zamanda bu alanlardan kayıtkümesinin alanlar biriktirisi meydana gelir. Her alanın nitelikleri arasında ismi, veri tipi ve değeri vardır. Veri kaynağından alınan bu değerdir.

Nesne modelinde bu yapı alan nesnesiyle içerilir. Alan nesnesinin biriktiri, metot ve özellikleriyle yapılabilecek işlemler şöyle özetlenebilir :

Name özelliğiyle alan adı döndürülür.
Value özelliği kullanılarak alan değeri görülebilir veya değiştirilebilir.
Alanın temel karakteristiklerini Type, Precision ve NumericScale özellikleriyle öğrenebiliriz.
DefinedSize özelliği alanın belirlenmiş boyutunu döndürür.
ActualSize özelliği alandaki verinin boyutunu döndürür.
AppendChunk, GetChunk metotlarıyla alanlardaki long binary ve long character verileri işlenir.
Veri kaynağındaki veriyi günlemek için önce kayıtkümesi satırlarındaki alanların günlenmesi gerekir. Burada günlemenin başarıyla yapılması bağlantı nesnesinin garantisi altındadır.

Hata Nesnesi (error object) :

Uygulamalarda hataların olması kaçınılmazdır. Genellikle bağlantı kurulamadığında, komut çalıştırılamadığında, veya uygun durumdaki bir nesne üzerinde işlem yapılamadığında hatalar oluşur.

Bu hatalar nesne modelinde hata nesnesi ile içerilir. Hata nesneleri Bağlantı nesnesinin hatalar biriktirisine yerleştirilir. Aslında bu hata nesneleri veri sağlayıcı hatalarıdır; bunun yanında ADO, run-time ortamının exception-handling mekanizmasına kendi hatlarını üretir. Bu hatalar kullanılan dilin hata yakalama mekanizmalarıyla ele alınır. Bu hataları ekte bulabilirsiniz :

hata ismi hata numarası hata tanımı
adErrInvalidArgument 3001 0x800A0BB9 uygulamanın kullandığı argümanlarda tip, sınır hatası
adErrNoCurrentRecord 3021 0x800A0BCD uygulanın itediği işlem mevcut kaydı istiyor fakat bu kayıt silinmiş yada BOF veya EOF değeri doğrulanmış.
adErrIllegalOperation 3219 0x800A0C93 uygulamanın istediği işleme izin verilmiyor.
adErrInTransaction 3246 0x800A0CAE uygulama işlem ortasında bağlantıyı kapatamaz
adErrFeatureNotAvailable 3251 0x800A0CB3 uygulamanın istediği işlem veri sağlayısı tarafından desteklenmiyor.
adErrItemNotFound 3265 0x800A0CC1 ADO uygulamanın istediği nesneyi biriktiride bulamıyor.
adErrObjectInCollection 3367 0x800A0D27 nesne halihazırda biriktiride olduğundan ekleme yapılamıyor.
adErrObjectNotSet 3420 0x800A0D5C uygulamanın işaret ettiği nesne geçerli bir nesne değil.
adErrDataConversion 3421 0x800A0D5D uygulama şu anki işlem için geçersiz tipte bir değer kullanıyor.
adErrObjectClosed 3704 0x800A0E78 uygulamanın istediği işlem kullandığı nesne kapalı iken yapılamıyor.
adErrObjectOpen 3705 0x800A0E79 uygulamanın istediği işlem kullandığı nesne açık iken yapılamıyor.
adErrProviderNotFound 3706 0x800A0E7A Auygulama komut nesnesiyle kaynak olarak kullandığı kayıtkümesi ActiveConnection özelliğini değiştiremiyor.
adErrBoundToCommand 3707 0x800A0E7B uygulamanın istediği işlem kullandığı nesne açık iken yapılamıyor.
adErrInvalidParamInfo 3708 0x800A0E7C uygulama uygun olamayan bir parametre nesnesi tanımlıyor.
adErrInvalidConnection 3709 0x800A0E7D uygulama kapalı veya geçersiz bir bağlantı üzerinden bir nesneyle işlem istiyor.

Ortaya çıkan bir hata bir veya daha fazla hata nesnesi oluşturur. Ortaya çıkabilecek bir diğer hata önceki hata nesnelerinin ortadan kaldırılmasına sebep olur.

Özellik Nesnesi (property object) :

Her ADO nesnesi bir dizi bağımsız özelliğe sahiptir. Özellikleri bir nesneyi tanımlar yada nesnenin kontrolünü sağlar.

İki tip özellik vardır: Oluşturulmuş ve dinamik: Oluşturulmuş özellikler ADO nesnesinin bir parçasidir ve her zaman hazırdır. Bu özellikler nesnenin özellikler biriktirisine alınmaz ve değerleri değiştirilebilse de karakteristikleri değiştirilemez.


örnek : oluşturulmuş özellik kullanımı - MyObject.Property


Dinamik özellikler ise ADO nesne özellikleri içine veri sağlayıcısı sayesinde eklenirler ve sadece bu sağlayıcı kullanılırken mevcutturlar. Bu özellik nesneleri ait oldukları nesnenin özellikler biriktirisinde bulunur ve bunlara biriktiri üzerinden ulaşılır.


örnek : dinamik özellik erişimi - MyObject.Properties("Name") - biriktiri kullanıldı.


Nesne modeli bir özelliği özellik nesnesiyle içerir.

ADO Biriktirisi "collection"
ADOnun sağladığı biriktiri nesnesi, belli tipte nesneleri içeren bir nesnedir. Biriktirideki nesnelere bir biriktiri metodunu kullanarak ismiyle, katar olarak, ya da sırasıyla, tamsayı değeri olarak, ulaşilabilir.

ADO dört tip biriktiri sağlar :

Bağlantı nesnesi hatalar biriktirisine sahiptir. Bu biriktiride veri sağlayıcısına ilişkin bir hatada oluşturulan bütün hata nesneleri bulunur. Oluşan herhangi başka bir hatada eski hatalar biriktirisi temizlenir ve yeni hata nesneleri biriktiriye konur.

Komut nesnesi parametreler biriktirisine sahiptir. Bu biriktiride komuta uygulanabilecek tüm parametre nesneleri kapsanır. Refresh metoduyla komuta ait depolanmış prosedür ve parametreli sorguların parametre bilgileri komutun parametreler biriktirisinden alınır. CreateParameter metoduyla oluşturulan parametre nesneleri Append metoduyla biriktiriye eklenir. Böylece parametre değerleri üzerinde sağlayıcıyı kullanmadan işlem yapılabilir.

Kayıt kümesi nesnesi alanlar biriktirisine sahiptir. Bu biriktiride kayıtkümesi nesnesinin tüm kolonlarını belirten bütün alan nesneleri içerilir.

Bütün bunlara ek olarak, bağlantı, komut, kayıtkümesi ve alan nesnelerinin hepsinin ortak olarak sahip oldukları bir biriktiri tipi de özellikler biriktirisidir. Bu biriktiride ait oldukları nesneye ilişkin bütün özellik nesneleri bulunur.

ADO Olay Elealıcısı "Event Handler"
ADO 2.0 ile birlikte olay kavramı programlama modeline girmiştir. Olaylar belirli operasyonların oluştuğuna ya da oluşacağına ilişkin belirlemelerdir. Olaylar genelde asenkron görevlerin beraber organize edilmesinde yaralıdırlar.

İşlem başlatılmadan önce çağrılan olay elealıcıları, işlem parmetrelerini inceleme ve değiştirme olanağı sunarken, işlem tamamlandıktan sonra çağrılan olay elealıcıları asenkron bir olayın bitiminden sizi haberdar eder.

Nesne modeli açık olarak olayları içermez ama onları olay elealan rutinlerle temsil eder.

İki çeşit olay ailesi vardir :

Bağlantı olayları: Bu olaylar bağlantı üzerinde işlemler başlatıldığında, veya komutlar işletildiğinde veya bağlantılar başlatılıp bitirildiğinde işlev görürler.

Kayıtkümesi olayları: Bu olaylar veri alışını belirlemek üzere, kayıtkümesi nesnesi satırları üzerinde gezindiğinizde veya bir satır değiştirildiğinde veya satırdaki bir alan değiştirildiğinde veya bütün bir kayıtkümesi üzerinde değişiklik yapıldığında işlev görür.

Not; alıntıdır.
__________________
[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]

==>[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]<==

Sorularınız ve sorunlarınız için nocomment@forumini.com mail atabilirsiniz...


no comment isimli Üye şimdilik offline konumundadır  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Alt 16.04.08, 00:17   #2 (permalink)
Çılgın Yönetici
 
no comment - ait Kullanıcı Resmi (Avatar)
 
no comment - MSN üzeri Mesaj gönder no comment - YAHOO üzeri Mesaj gönder no comment isimli Üyeye Skype üzeri Mesaj gönder
Standart OLE-DB Sağlayıcılarını ADO ile Kullanma

OLE-DB Sağlayıcılarını ADO ile Kullanma

ADO'nun gücünü ve esnekliğini oluşturan özelliklerden başta geleni onun farklı veri sağlayıclara aynı programlama modeliyle bağlanabilmesidir. Bu durumda her veri sağlayıcının kendine özgü özellikleri olduğundan farklı sağlayıcılarda uygulama programnın ADO ile etkileşimi birtaım değişiklikler gösterebilmektedir. Bu farklılıkları üç kategoride toplayabiliriz :

ConnectionString özelliğinde yeralan bağlantı parametreleri.
Komut nesnesi kullanımı.
Sağlayıcıya özel kayıtkümesi davranışı.
Ayrıca bağlantı, komut, kaıtkümesi nesnelerinin özellikler biriktirisi (collection) sağlayıcya özel dinamik özellilkeri içerir. Bu özellikler sağlayıcıya özgü fonksiyonelliğe dair bilgileri edinmemizi sağlar. İlgili nesnenin özellikler biriktirisinde kullanacağımız refreshe metoduyla bu sağlayıcı özellilerine (dinamik özellikler) ulaşabiliriz.

İlerleyen bölümlerde çok yüzeysel olarak, sadece ADO ve OLE DB ilişkisinin kafamızda daha iyi canlanması bakımından, Microsoft'un sunduğu sağlayıcılar hakkında bilgi vermeye çalışılacaktır.

ODBC Veri Tabanları İçin Veri Sağlayıcı
Microsoft ODBC Provider, ADO'nun herhangi bir ODBC veri tabanına bağlanmasını sağlayan arayüzdür. ODBS sürücüleri şu anda birçok veri tabanı yönetim sistemlerinde (bunlara microsoft ürünü olmayan Oracle gibi sistemler de dahil) kullanılmaktadır.

Bu ADO için default veri sağlayıcıdır ve Microsoft SQL Server 6.5 ile kullanıldığında sağlayıcı bağımlı bütün ADO özelliklerini desteklemektedir.

Bu sağlayıcıya bağlanmak için ConnectionString özelliğinin Provider argümanı 'MSDASQL' değerine atanır. Bağlantı tanımalanmış bir veri kaynağı ismi (DSN veya FileDSN) kullanılarak da yapılabilir.

DSN veya FileDSN kullanılarak :

"[Provider=MSDASQL;] { DSN=isim | FileDSN=dosyaismi } ; [DATABASE=veritabanı;] UID=kullanıcı;PWD=şifre"

DSN veya FileDSN kullanmadan :

"[Provider=MSDASQL;] DRIVER=sürücü; SERVER=server; DATABASE=veritabanı; UID=kullanıcı; PWD=şifre"


Microsoft Index Server İçin Veri Sağlayıcı
Microsoft Index Server için Microsoft OLE DB sağlayıcısı kütük sistemine ve web üzerindeki veriye yalnız-okunur bir erişim sağlar. ADO uygulamaları SQL saorgularını kullanarak veriye ve dosya özelliklerine ulaşırlar.

Bu sağlayıcıya bağlanmak için ConnectionString özelliğinin Provider argümanı 'MSIDXS' değerine atanır.

Microsoft Active Directory Service İçin Veri Sağlayıcı
Microsof Active Directory Service için OLE DB veri sağlayıcısı ,ADO'nun heterojen klavuz sevislerine Microsoft Active Directory Service vasıtasıyala bağlanmasını sağlayan sağlayıcıdır. Bu ADO uygulamalarına, Windows NT 4.0, LDAP-uyumlu ve Novell yalnız-okunur klavuz sevislerine salt-okunur erişim sağlar.

Bu sağlayıcıya bağlanmak için ConnectionString özelliğinin Provider argümanı 'ADSDSOObject' değerine atanır.

Microsoft Jet Veri Tabanları İçin Veri Sağlayıcı
Micosoft Jet Veri Tabanları için OLE DB veri sağlayıcısı, ADO'nun Microsoft Jet Veritabanlarına bağlanmasını sağlayan sağlayıcıdır.

Bu sağlayıcıya bağlanmak için ConnectionString özelliğinin Provider argümanı 'Microsoft.Jet.OLEDB.3.51' değerine atanır.

Microsoft SQL Server İçin Veri Sağlayıcı
Microoft SQL Server için OLE DB sağlayıcısı, ADO'nun Microsoft SQL Server'a erişimin sağlar.

Bu sağlayıcıya bağlanmak için ConnectionString özelliğinin Provider argümanı 'SQLOLEDB' değerine atanır.

Oracle Veri Tabanları İçin Veri Sağlayıcı
Microsoft Oracle için OLE DB sağlayıcısı ADO'nun Oracle veritabanlarına bağlanmasını sağlayan arayüzdür.

Bu sağlayıcıya bağlanmak için ConnectionString özelliğinin Provider argümanı 'MSDAORA' değerine atanır.


Not; Alıntıdır...
__________________
[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]

==>[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]<==

Sorularınız ve sorunlarınız için nocomment@forumini.com mail atabilirsiniz...


no comment isimli Üye şimdilik offline konumundadır  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Alt 16.04.08, 00:18   #3 (permalink)
Çılgın Yönetici
 
no comment - ait Kullanıcı Resmi (Avatar)
 
no comment - MSN üzeri Mesaj gönder no comment - YAHOO üzeri Mesaj gönder no comment isimli Üyeye Skype üzeri Mesaj gönder
Standart ADO - Kod ile Veri Tabanı Yönetimi

ADO - Kod ile Veri Tabanı Yönetimi

(General)(Declaration)
Dim Baglanti As Connection
Dim KayitSet As Recordset

Private Sub veri_set() ‘ Tekrar eden tanımlama için
Text1.Text = KayitSet![sicil_no] ‘ ortak kod
Text2.Text = KayitSet![ad]
Text3.Text = KayitSet![soyad]
Text4.Text = KayitSet![adres]
End Sub

Private Sub ilk_okuma() ‘ Ortak kod
Set KayitSet = New Recordset ‘ Kayıt seti tanımlanıyor
KayitSet.Open "Select * from kisiler", Baglanti, adOpenKeyset, adLockOptimistic
If KayitSet.RecordCount <> 0 Then
KayitSet.Fields.Refresh
veri_set
End If
End Sub

Private Sub Form_Load()
Set Baglanti = New Connection ‘ Veri tabanının tanıtımı
Baglanti.Open "Provider=Microsoft.jet.oledb.4.0; Data Source = personel.mdb"
ilk_okuma
End Sub



Private Sub Command4_Click() ‘ İlk kayıt
On Error Resume Next
KayitSet.MoveFirst
veri_set
End Sub


Private Sub Command2_Click() ‘ Önceki kayıt
On Error GoTo yenihata
KayitSet.MovePrevious
veri_set
Exit Sub
yenihata:
KayitSet.MoveFirst
End Sub


Private Sub Command3_Click() ‘ Son Kayıt
On Error Resume Next
KayitSet.MoveLast
veri_set
End Sub


Private Sub Command1_Click() ‘ Sonraki kayıt
On Error GoTo yenihata
KayitSet.MoveNext
veri_set
Exit Sub
yenihata:
KayitSet.MoveLast
End Sub


Private Sub Command6_Click() ‘ Arama
On Error Resume Next
Dim ara_sicil_no As Double ‘ Arama için yeni kayıt seti
Dim yeni_k_s As New Recordset
ara_sicil_no = InputBox("Aranan kişinin sicil numarasını giriniz :", _
"Sicil Numarası İle Arama")
yeni_k_s.Open "Select * from kisiler where sicil_no=" & _
Val(ara_sicil_no), Baglanti, adOpenKeyset, adLockOptimistic
If yeni_k_s.RecordCount <> 0 Then
Text1.Text = yeni_k_s![sicil_no]
Text2.Text = yeni_k_s![ad]
Text3.Text = yeni_k_s![soyad]
Text4.Text = yeni_k_s![adres]
yeni_k_s.Close
Else
MsgBox "Kayıt Bulunamadı", vbCritical, "Arama"
End If
End Sub




Private Sub Command7_Click() ‘ Kayıt ekleme
If Command7.Caption = "Ekle" Then ‘ başlığa göre işlem seçimi
Text1.Text = ******
Text2.Text = ******
Text3.Text = ******
Text4.Text = ******
Command7.Caption = "Kaydet" ‘ Başlık değiştirme
Else
Dim yeni_k_s As New Recordset
yeni_k_s.Open "Select * from kisiler", Baglanti, _
adOpenKeyset, adLockOptimistic
If yeni_k_s.RecordCount <> 0 Then
yeni_k_s.AddNew
yeni_k_s![sicil_no] = Text1.Text
yeni_k_s![ad] = Text2.Text
yeni_k_s![soyad] = Text3.Text
yeni_k_s![adres] = Text4.Text
yeni_k_s.Update
yeni_k_s.Close
End If
ilk_okuma
Command7.Caption = "Ekle"
End If
End Sub


Private Sub Command5_Click() ‘ Kayıt silme
On Error Resume Next
Dim yeni_k_s As New Recordset ‘ Kayıt silme için kayıt seti
yeni_k_s.Open "Select * from kisiler where sicil_no=" & Text1.Text, _
Baglanti, adOpenKeyset, adLockOptimistic
If yeni_k_s.RecordCount <> 0 Then
yeni_k_s.Delete
yeni_k_s.Close
End If
ilk_okuma
End Sub


Private Sub Command8_Click()
Close All ‘ Açık olan herşeyi kapat
End ‘ Programdan çık
End Sub


Programın kodlanmasına başlamadan önce Project > Reference mönüsünden “Microsoft ActiveX Data Object 2.5 Library” referanslar arasına eklenir.

Not; alıntıdır...
__________________
[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]

==>[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]<==

Sorularınız ve sorunlarınız için nocomment@forumini.com mail atabilirsiniz...


no comment isimli Üye şimdilik offline konumundadır  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Alt 16.04.08, 00:19   #4 (permalink)
Çılgın Yönetici
 
no comment - ait Kullanıcı Resmi (Avatar)
 
no comment - MSN üzeri Mesaj gönder no comment - YAHOO üzeri Mesaj gönder no comment isimli Üyeye Skype üzeri Mesaj gönder
Standart ADO.NET'in Getirdiği Avantajlar

ADO.NET'in Getirdiği Avantajlar

ASP den ASP.NET e geçemeyi planlayanların veritabanı işlemlerinde kullanacağı yeni bir kutuphana olan ADO.NET aslında bir çok kişi tarafından ADO nun devamı olarak görülmektedir. İsmen böyle olabilir ancak, ADO.NET başlı başına .NET Framework Class Libaryde bulunan eşsiz classlardan bir tanesidir.

ADO sayesinde uygulama geliştiriciler çok rahat bir şekilde veritabanına bağlanıp yönetimi sağlayabiliyorlardı. Ancak ADO nun da geri kaldığı yerler oluyordu. Özellikle veri paylaşımının çok önemli olduğu günümüzde, ADO'nun sadece COM u destekleyen sistemlerde çalışabiliyor olması bir çok kitlenin uygulama geliştirmelerinde zorluk çıkarmıştır.
Oysa ADO.NET ile yerleşik bir şekilde gelen XML desteği sayesinde hiç bir sistem farketmeksizin veri paylaşımı çok rahatça sağlanabilmektedir.

ADO.NET in fark attığı bir başka özellik olan bağlantılı-bağlantısız katmanlar ise bence en büyük yapısal değişikliktir. Birazdan daha detaylı bir şekilde değinecek olduğumuz bağlantılı-bağlantısız katmanlar sayesinde veritabanına bağlı kalmadan, veritabanından çekilen veriler üzerinde değişiklik yapabiliyorsunuz. Kayıtları silibiliyor veya yeni kayıt ekleyebiliyorsunuz. Dediğim gibi bu işlemleri veritabanı ile hiç bir bağlantı kurmadan yapıyor olmak kesinlikle performans arttırıcı bir durumdur. Özellikle web uygulamalarında bağlantısız katman sayesinde artık ziyaretçilerimize daha hızlı bir site sunabileceğiz.

Bilmeyenlerinizin olabileceğini de düşünerek son bir hatırlatma yapmak istiyorum; ADO ile kullandığımız recordset ler artık yok. Recordet lere hakimiyet kurmak zordu, bunun için çok iyi duzenlenmiş SQL cümlecikleri ve koşullar kullanıyorduk. Ancak ADO.NET de işler daha organize ilerlemektedir. ADO.NET te kullanacağımız bir nesne olan DataSet sayesinde verileri çok daha kolay bir şekilde yönetebileceğiz.

Öncelikle Bağlantılı-Bağlantısız Katmanların ne olduğunu inceleyelim.


Bağlantılı-Bağlantısız Katman ?

ADO ile, en basitinden veritabanından aldığımız bilgileri listelemk istediğimizde, bağlantıyı açıp listeleme yapmak için bir döngü kurar ve döngü sonunda bağlantıyı kapatırdık. Tahmin edebileceğiniz gibi bu döngü sırasında veritabanı ile olan bağlantımız sürekli açık durumdadır.

Peki, listelenmesi gereken bilgileri veritabanından aldıktan hemen sonra bağlantıyı kapatsak ve daha sonra istediğimiz gibi listeleme işlemlerini tamamlasak, Sizce Nasıl Olur?
İşte ADO.NET bize bu tarz bir avantaj sağlamaktadır. Bağlantılı katman dediğimiz bölümde veritabanına bağlanıp verileri alır ve hemen ardından bağlantıyı kapatır. İşte bundan sonra yapacağımız işlemler ise bağlantısız katman adı altında gerçekleşir.

Bağlantılı katmanda veritabanından alınan veriler DataSet, DataTable, DataRow gibi oluşturulacak nesnelere atanır. Bu atama yapıldıktan sonra istediğimiz işlemi gerçekleştirebiliriz.

İstersek DataSet den bir Kayıt Silebilir veya yeni bir kayıt ekleyebiliriz. Dikkatinizi tekrar çekmek istiyorum; bu kayıt ekleme silme işlemi sırasında hala bağlantısız çalışmaktayız. Oysa ADO olsaydı neler neler yapacaktık....

Makalemizin başlarında belirtmiş olduğum ADO.NET bize verilerimize mükemmel bir şekilde hükmetmemizi sağlaması özelliğini bu bağlantısız katmanda istediğimiz gibi kullanabiliriz.

Not; alıntıdır...
__________________
[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]

==>[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]<==

Sorularınız ve sorunlarınız için nocomment@forumini.com mail atabilirsiniz...


no comment isimli Üye şimdilik offline konumundadır  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Alt 16.04.08, 00:20   #5 (permalink)
Çılgın Yönetici
 
no comment - ait Kullanıcı Resmi (Avatar)
 
no comment - MSN üzeri Mesaj gönder no comment - YAHOO üzeri Mesaj gönder no comment isimli Üyeye Skype üzeri Mesaj gönder
Standart ADO.NET 2.0'ın Kullanımı

ADO.NET 2.0'ın Kullanımı

Makale Özeti
ADO.NET 2.0 ile gelen yenilikler ve değişiklerden bazıları... DataTablelar büyüdü DataSet'e yakınlaştı, DataReader'ın akrabası çıktı DataTableReader, fabrikalaşma dönemi başladı, sadece provider adı verip bağlantıyı oluşturacağımız ProviderFactory yapısı geliştirildi..

Makale
ADO.NET 2.0 ile gelen yenilikler ve değişiklerden bazıları... DataTablelar büyüdü DataSet'e yakınlaştı, DataReader'ın akrabası çıktı DataTableReader, fabrikalaşma dönemi başladı, sadece provider adı verip bağlantıyı oluşturacağımız ProviderFactory yapısı geliştirildi..

DataTable

.NET Framework 1.xte DataTable nesneleri XML serializasyonunu kendi başlarına desteklemiyorlardı. DataTable DataSette bulunan ReadXml ve WriteXml methodlarını desteklemiyordu. Web servislerine verinin iletimi için için DataSet göndermek (veya Web servisinden almak) oldukça alışılagelmiş bir methoddu, ancak bunu DataTable ile yapmak mümkün değildi. .NET Framework 1.x için DataSetin IXmlSerializable interfaceini implemente ettiği kesinlik kazanmazken .NET Framework 2.0 ile IXmlSerializable interfaceini kullanabilmeniz için elinizin altında, ve artık System.DataTable classı IxmlSerializable implemente etmektedir. Sadece bir tabloluk işiniz varken DataSet kullanmak zorunda kalmayacak olmamız hayatı kolaylaştıracak. Daha önceleri sadece DataSete özgü olan ReadXml, WriteXml ve GetSchema artık DataTablein de bir parçası.

Artık DataTable nesnelerini .NET-bazlı Web servislerine gönderip geri alabiliriz. Persist edilen DataTable ve DataSet nesnelerinin XMLleri -her ikisi de DataTable ile direkt çalıştığı için- birbirine benzerdir.

Artık DataTable nesnesinin desteklediği diğer bir DataSet methodu da Merge methodudur. DataTable.Merge methodu DataTable.Merge methodu ile bir başka DataTablea taşınabilirsiniz (.NET Framework 1.xteki PreserveChanges ve MissingSchemaAction) , ancak DataSette olduğu gibi DataRow kolleksiyonunu getiremiyorsunuz. Eğer DataRow kolleksiyonu farklı DataTablelardan geliyor ise, DataSet.Merge methodu ile DataSet.Merge methodu çeşitli rowları birleştirip gerekirse yeni bir DataTable yaratır. Ancak, aynı DataRow kolleksiyonu DataTable.Merge methodu ile kullanılıyor ise rowları diğer DataTablelar ile kullanabilmek imkansız. Bu tür problemleri engellemek için bu overload DataTable tarafından desteklenmemektedir.

IDataReader

Eğer SqlDataReader nesnesi ile tanışıyor iseniz, streamed veri ile çalışıyorsunuz demektir. SqlDataReader gibi classlar veriyi read-only, forward-only,firehose-style olarak okumanızı IdataReader interfaceini implemente ederler..NET Framework 1.xte, veri erişimi katmanında DataTable ya da DataSeti yaratmak zorundaydınız ve sonra UI göndermelidiniz.

ADO.NET 2.0da, Microsoft Fill methodunun senaryo arkasını açıkladı ve DataAdaptera ihtiyaç duymadan DataSet veya DataTablea Load methodunu kullanarak veri yükleyebilirsiniz. Load methodu ile DataTable ya da DataSete verileri doldurma işlemi explicit olarak DataAdaptera bağlı değildir ve bazı senaryolar için veritabanına bağlantı da gerek kalmamıştır. Böylece veri katmanınızdan daha efektif bir DataReader nesnesi geri dönderebilirsiniz. Artık, kullandığınız kaynaklarınız üzerinde daha fazla yetkiye sahipsiniz. DataReader kullanırken veri katmanından veriyi dışarıya taşımak için bağlantıyı açmamız ve kapatmamız gerekli idi. Load aynı zamanda DataReaderın yeni disconnected akrabası olan DataTableReader ile çalışmaktadır.

Load methodunun ayrıca yüklemek istediğiniz objenin içinde zaten o rowlar varsa merge modeunu seçebilmenizi sağlayan LoadOption parameterleri vardır. Bu opsiyonlar OverWriteRow, PreserveCurrentValues, ve UpdateCurrentValues. Microsoft veriyi merge etme işlemini bu fonksiyonelite ile daha kolay hale getirdi. Ve tabi ki aynı opsiyonlar DataSet.Merge ve DataTable.Merge methoduna da eklendi.

DataTableReader

DataTableReader, DbDataReader (IDataReaderın veritabanına özel olmayan implementasyonu olan class) base classından inherit eden yeni bir class. DataTable ve DataSet CreateDataReader methoduna sahipler. (Betanın daha önceki releaselerindeki GetDataReader), container tarafından gösterilen sonuçlarıla aynı sayıya sahip bir DataTableReader geri döndürmektedir. Silinen rowlar DataTableReadera gönderilmez. DataTableReader veriler arasında ilerlemek, veriyi başka bir yere aktarmak ve DataSet veya DataTablea yüklemek için kullanılırlar.

DataTableReader DataSet veya DataTable içerisinde ilerlemek için ideal. Bunun nedeni, ilerleme sırasında eğer kaynak DataTableından rowlar silinirse, kayıt işaretleyicisi doğru pozisyonda kalacaktır. Kaynak veriye reference constraint koyan, verilerin silinmesini engelleyen SqlDataReaderdan oldukça farklıdır. Ek olarak eğer DataTableReaderın kayıt işaretleyicisini üstüne yeni rowlar eklenirse , bu rowlara DataTableda ilerleme esnasında erişelebilirler.

Kodunuzda DataTableReader nesnesinin Tables özelliğini göremiyor olsanız bile, Debugger ile objenizi inceleyebilir, Tables özelliğini görüntüleyebilirsiniz. DataTableın şeması DataTableReader tarafından alınır, bu sayede class sadece tablolar içinde değil, columnlar ve rowlar içerisinde de ilerler. DbDataReader Ienumerableı implemente ettiği için Collection özelliği vardır ve debuggerda bu sayede verilere ulaşabilirsiniz.


DataReader gibi ancak bilgi hem forward-only hem de istenilen pozisyondan erişilebiliyor. Eğer birden çok sonuç kümesi varsa sadece NextResultset methodu ile bir sonrakine ilerleyebilirsiniz. DataTableReaderın Read methodu ile kayıt işaretleyicisi ile ilk sonuç kümesinin ilk rowuna atlarsınız. .NET Framework 1.x ile SqlDataReader ve ilişki related classlarda, veri Item özelliği veya GetDateTime gibi belirlenen bir format methodu ile erişilebiliyordu.

DataTableReaderda olmadığı gibi, veritabanı-specific DataReaderlar veritabanından direkt olarak akarlar ve açık bir bağlantı isterler. Bağlantı varken DataReader nesnesini bir katmandan diğer katmana göndermek önerilmez. Bağlantısı uygun şekilde kapatılmayan DataReader kayankalarınızı tüketebilir. DataTableReader ile bu konularda endişelenmenize gerek kalmadı.

Batch Updateler

Eğer hard-coder iseniz ve DataAdapterın command nesnelerini sihirbazlar kadar basit görüyor (ve küçümsüyorsanız) DataAdapter'ın yeni (SqlDataAdapter ve OracleDataAdapter classlarında bulunan) UpdateBatchSize özelliği fikrinizi değiştirebilir.

.NET Framework 1.x, birden çok kayıtın güncellenmesi verimlilik, performans ve güvenlik kaygılarınızdan bir tanesini yatıştırmanıza neden olabilir. DataAdapter'ın hazır Update command nesnesi önemli derecede kurtarabilir, ancak halen arka planda kayıt başına bir veritabanı çağırmaktadır.

DataAdapterın UpdateBatchSize özelliğini belirleyin. Batch updating kullanıldığında DataAdapter parametrelenmiş command nesnelerin serisini oluşturur ve bir güncelleme esnasında servera hepsini bir kerede gönderir. Bu manuel olarak yapılabilir, ancak bu olay karmaşıktır ve birçok yazılım geliştirici için en iyi çözüm olmayabilir.

Sorgudaki Parametre sayısı önemli değildir. Eğer SQL Servera bir batch içinde birden çok update sorgusu yolluyor iseniz, SQL Profilerdan görüntüleyebileceğiniz gibi her update sorgusu tek başına çalışır.

UpdateBatchSize özelliğine değer atayabilirsiniz, kaynaklarınızın verimliliğini düzenleyebileceğiniz bir batch içinde kaç tane row güncelleneceğini belirleyebilirsiniz. En büyük yararı ise eğer güncellenecek çok fazla row varsa, veritabanı sunucusu ile daha az muhattap olacaksınız.

Her zaman için daha çok, UpdateBatchSize ile olmak zorunda değil. Örneğin, lcoal veritabanı ile küçük boyuttaki batchler ile daha çok sunucu ile muhattap olmak daha yararlı olacağı gibi, remote bir veritabanı için tam tersi bir durum sözkonusudur. Çok bütük boyutta batchler hazırlarken, istemci makinaların hızından, ağınızın gizliliğine kadar bir çok konuda kaynaklarınızı kullanırken daha düşünceli olmalısınız. Kendi değişkenlerinize göre batch boyutunuzu belirlemelisiniz.

DataViewin yeni ToTable methodu ile sıralanmış, başka bir DataTableın filtrelenmiş DataViewi ile yeni bir tablo yaratabilirsiniz. Eğer DataViewin kaynağının bulunduğu asıl DataTable, bir DataSetin parçası ise, bu method tarafından geri dönen DataTable, asıl DataSet ile halen ilişkilidir. Bundan dolayı, bu DataTable direkt olarak başka bir DataSetin içine atamazsınız. DataTableın zaten varolan DataSete ait olduğuna dair ArgumentException alırsınız. .NET Framework 1.x ile DataTable kopyalasını kullanırdınız:

myDataSet.Tables.Add(MyNewTable.Copy)


ToTable methodununu overloadlarından bir tanesi farklı rowları filtrelenmesi için Boolean bir parametre istemektedir. Örneğin elinizde yazar adı, adresi, yayımevleri bilgileri içeren bir DataTable var. Bu yazarların unique illeri veya her ilde yayımevi olan ve olmayan yazarların listesini görüntülemek oldukça zor olurdu. Her rowun tek tek karşılaştırarak ilerleyerek bulurdunuz. DataView kendisi eşsiz değerleri filtreleyemiyor olsa bile ToTable methodu, anahtar değerleri tekrar eden değerler olan ayrı bir tablo yaratır. Boolean ile, filtrelemek istediğiniz alanları parametre dizisi olarak göndermelisiniz. Ve son olarak, ToTable methodunun bir overloadu da geri dönecek olan tablonun isminini de ek bir parametre olarak gönderebilirsiniz:

Public Function DVtoNewTable() As DataTable

Dim ds As DataSet = GetAuthors()

Dim dt As DataTable = ds.Tables(0)

Dim dv As DataView = dt.DefaultView

Return dv.ToTable("IlbazindaDurum", True, _

New String() {"il", "durum"})

End Function

Binary Remoted DataSetler

XML Web serviceleri üzerinden remotingin bir artısı da verinin sadece XML formatında değil, aynı zamanda binary formatında da gönderilmesi. (Bir DataSetin içinde olmadığı sürece). Daha önce de encode mekanizması binary olduğu halde, DataSetler pipe aracılığıyla gönderilmeden önce DataSetler XML olarak serilize edilirlerdi, performansta düşüş yaşanırdı. ADO.NET 2.0da bu düzeltildi. Remoted DataSetler şimdi gerçekten binary veri olarak serilize ediliyorlar.

RowState

Yeni rowlar eklediğinizde ya da modifiye ettiğinizde RowState gizli bir canavar olabiliyordu. Bir DataRow yaratmak, bunu bir DataTableın içine atmak ve modifiye etmek için yapılan işlemleri inceleyelim:

Create New DataRow via DataTable.NewRow Detached

Modify Data in DataRow Detached

Add Row via DataTable.Rows.Add Added

Modify Row Again Added

Update DataTable via AcceptChanges Unchanged

Modify Row again Modified

RowStates sonuçlar beklediğiniz gibiler. Ancak eğer bu verileri bir Web servisten ya da remoting aracılığıyla alıoyrsanız ve local verideponuzu güncellemek için kullanmanız gerekiyor ise? Eğer DataAdapterın Update methodunu kullanıyorsanız, bu kayıtlar, çoğu durumda, dikkate alınmayacak ve Unchanged olarak işaretlenecektir.

DataRow classına bu işle uğraşmak için iki yeni method eklendi: SetAdded and SetModified. Bu methodlar sayesinde Unchanged rowun durumunu ya Added ya da Modified olarak değiştirebilirsiniz, ve RowStatein üzerinde bir yetkiye sahip olabilirsiniz. SetAdded ve SetModified methodlarının Intellisenselarındaki tanımları Beta1de doğru olarak gösterilmemektedir, dikkat.

ProviderFactory

Birçok çeşitteki veritabanını kullanmak için hayatı kolaylaştırmak için System.Data.Common uzayalanı içerisinde yeni classların kolleksiyonu bulunmaktadır. Daha önceden eğer farklı veri tabanları ile uğraşacaksanız, her veritabanı tipi için ayrı kod blokları yazardınız. .NET Framework 1.xte SqlConnection ve OledbConnection kalıtımları sürecinde ortak bir ataları bulunamaktadır. Aynı konu SqlCommand ve OledbCommand için de aynı şey sözkonusu. Veritabanı bağımsız kod yazmanın en iyi yolu interfaceleri kullanmaktı.

ProviderFactory classları provider-bağımsız bağlantılar, command nesneler, adapterlar yaratmanızı sağlar. Çalışma zamanında istediğiniz namespacee geçiş yapabilirsiniz. Nasıl çalıştığına kısaca bir bakmak istersek:

Public Sub ProviderTestleri(ByVal providerAdi As String)

Dim provider As DbProviderFactory = _

DbProviderFactories.GetFactory(providerAdi)

Dim connection As DbConnection = provider.CreateConnection()

Dim adapter As DbDataAdapter = provider.CreateDataAdapter()

End Sub

Oluşturması ve kullanması inanılmaz derecede basit. Bu örnekte, provider adı ("System.Data.SqlClient" gibi) bir resource dosyasında, ya da application configuration dosyasında ya da veri depolamak için kullanılan diğer bir mekanizmandan çağrılabilir.


SQL Server Updateleri

ADO.NET takımı Microsoftta SQL Server organizasyonunda da yer aldıkları için ADO.NET ve SQL Server arasında yakın ilişkilere şaşmamak gerekmektedir, SQL Server 2005in CLRi host ediyor olması gibi. System.Data.Sql ve System.Data.SqlServer uzayalanları SQL Server 2005ten .NET ile konuşabilecek araçlara sahipler. Daha önceki SQLServer 2005 betalarında da bulunan System.Data.SqlServer uzayalanının, Beta 3 versiyonunda kaldırılması planlamakta. Özelliklerin SqlClient uzayalanına eklenmesi beklenmekte. Şimdi, ADO.NET 2.0ın SQL Server işlevselliğine bir bakalım. Bütün bu fonksiyonlar sadece SqlClient uzayalanında geçerli.

SQL Server 2005teki en büyük değişikliklerden biri de Multiple Active Resultsets (MARS) eklenmesi. Büyük ihitmal “Veri Venüsten, Sonuçlar MARStan” deyimini duymuşsunuzdur.

MARS ile SQL Server takımı, bir sonuç kümesinin SQL Serverdan dağıtılma şeklini değiştirdi ve ADO.NET takımı bunu avantaj olarak kullandı. Sonuç, şu anda aynı bağlantı ile birden çok DataReader alabilirsiniz. SQL Server 2005a bağlanırken varsayılan olarak MARS aktifleştirildi, ancak istenirse bağlantı cümlesinde MultipleActiveResultSets adında Boolean parametresini ile deaktif edilebilir, ayarlanabilir.

Unutmayın, MARS bir bağlantıdan birden çok DataReader oluşturmak için ayrı command nesnelerine ihtiyaç duyar, böylece aynı command nesnesini kullanarak Updates ve Insertleri de çalıştırabilirsiniz. MARS kaynak overheadi ile birlikte gelmekte, yani bağlantı havuzu aracılığıyla tekrar kulllanılan SqlConnection objelerinin zaten başardığı performans ile bir karşılaştırma yapıp kullanmanız önerilir. MARS her zaman performansı artırmayacaktır. Ancak bir transaction işlemi süresince birden çok command kullanabilecek ve performansın bedeli pahalı olabilir.

Transactionları MARS ile kullanırken, bir bağlantıda birden çok transactionın yaratılmasına izin verilmez ve System.InvalidOperationException gönderirir. Veritabanı transactionları (SqlTransaction ve OledbTransaction gibi) halen kullanımdayken, yeni System.Transaction uzayalanında güçlü TransactionScopeunu kullanabilirsiniz. TransactionScope local transactionlarda kullanılabileceği gibi distributed transactionlarda da kullanılabilir. System.Transactions uzayalanı için Data Points.

ADThis type of connection reuse was not a problem for DataAdapterler için bu tür bağlantıyı tekrar kullanmak sorun yaratmamaktadır. DataAdapterı doldurduğunuzda, pipe üzerinden veri gönderilir ve pipe boşalır ve bir diğer çağrı için açık kalır.


Threading, Notifications, ve Bulk Copy

Multithreaded uygulamalar yazmak karmaşık olabilir ancak yararlı inanılmayacak derecede fazladır. ADO.NET 2.0 ile gelen özelliklerden bir tanesi de SqlCommand classının gerçek asenkrone işlem yetenekleridir. SqlCommand'ın asynch methodları orta-katman işlemleri için çok büyük artıdır ve örneğin bir rowda birbiriyle ilişkisiz birden çok sorgu çalıştırırken çok kullanışlıdır. Bu sorgular şimdi eş zamanlı olarak çalışabilmektedirler. "Asynchronous Command Execution in ADO.NET 2.0".

Bu noktada, asenkrone command nesnelerin MARS ile birleştirmek bazen etkileyici bir performans sergilese de, gerçekçi olmak gerekirse kazanılan performans çoğu zaman az ve karmaşaya değmeyecek niteliktedir.

ADO.NET 2.0da SQL Servera özel iki yeni özellik de Data.Sql.SqlNotification ve Data.SqlClient.SqlDependency. SQL Server 2005, SqlCommandinize SqlNotification veya SqlDependency nesnelerini kullanarak change notificationlarınız bir queuea sokabilir. Sıraya özel bir RECEIVE sorgusu aracığıyla subscribe olabilirsiniz ya da sırayı kendiniz sorgulayabilirsiniz. Eğer RECEIVE sorgusunu kullanıyorsanız, SQL Serverdan değişikliklerin yapıldığına dair mesajlar alabilmek için event handler oluşturabilirsiniz.

SqlDependency, SqlNotification davranışlarını sergileyen ancak daha üst bir level soyutlama içerir kodunun yazılması biraz daha kolaydır.

Notification kullanırken bazı önemli kurallar bulunmaktadır. Öncelikle, sorgunuzdaki bir tabloyu referans ederken tbalo için iki-parça isim kullanmalısınız. Eğer tablonun tek ismi varsa, mesela pubs veritabanında authors tablosu gibi, owner ismini ekleyebilirsiniz (dbo.authors gibi) Eğer tablonun zaten iki ismi varsa, mesela AdventureWorkste olduğu gibi person.contact, person.contact yeterlidir. İkinci olarak, “select * from authors” sorgusundaki gibi * kullanmak yerine column isimlerini belirtmelisiniz. Üçüncü olarak, notification birkaç parametrenin değiştiği çok sayıdaki ortak sorgular için dizayn edilmiştir ve çok sayıda ad hoc query kullanacak iseniz performansınız belirgin derecede azalır.

SQL Books Onlineda Query Notifications başlığı altında daha çok kurallar bulunmaktadır. Ek olarak, çok özel kurallar bulunmaktadır. (grant izinleri, datatable özelliklerinin atanması, vs..). ("Query Notifications in ADO.NET 2.0".)

SqlDependency ve SqlNotification classlarını System.Web.Caching.SqlCacheDependency classı ile karıştırmamak gerekli. Bu ASP.NET classı sadece SQL Server 2005 query notificationı kullanmaz, ancak aynı zamanda SQL Server 2000 ve SQL Server 7.0 ile de çalışabilir. Ancak ADO.NET classları daha önceki SQL Server versiyonları ile çalışmaz. ASP.NET 2.0 ile caching konusunda daha detaylı bilgi için, "Caching Improvements in ASP.NET Whidbey," G. Andrew Duthie ve "Improved Caching in ASP.NET 2.0," Stephen Walther, A First Look at ADO.NET and System.Xml v.2.0, Alex Homer, Dave Sussman, Mark Fussell (Addison Wesley, 2004).

Eğer ADO.NET ile verileri tek bir kaynaktan SQL Servera aktarmayı istiyorsanız, basit bir DTS transferinden daha uzun sürdüğünü göreceksiniz. Bunun nedeni, ADO.NET ile arka planda bir seferde veritabanına tek bir kayıt yazılmasıdır. Yeni SqlBulkCopy classı sayesinde .NET uygulamanızdan SQL Server ‘a verilerin bulk insertini sağlar. Yeni batch updateler, ADO.NET 2.0taki, DTS kadar hızlı çalışan SqlBulkCopy classına yaklaşamayacaklar.

SqlBulkCopy sayesinde birkaç satır kod ile bir DataTabledan, DataRowların kolleksiyonundan veya IdataReaderı implemente eden bir classtan verileri alabilrsiniz, örneğin:

Dim connDest As New SqlConnection(sqllocal)

connDest.Open()

Dim dr As SqlDataReader = MyRoutinetoPopulateaDataReader

Dim oBCP As New SqlBulkCopy(connDest)

oBCP.DestinationTableName = "HedefTablom"

oBCP.WriteToServer(dr)

dr.Close()

oBCP.Close()

connSrc.Close()

connDest.Close()

SQL Server 2000 tablosunda yüzbinlerce satır kayıtı SQL Server 2005 veritabanına transfer ederken, SqlBulkCopy performansı nerdeyse DTS ile aynıdır, batch updateleri kullanıldığında ise çok yavaştır.

Not; alıntıdır...
__________________
[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]

==>[Sadece forumumuza üye olanlar linkleri görebilirler Tiklayin ve kaydolun...]<==

Sorularınız ve sorunlarınız için nocomment@forumini.com mail atabilirsiniz...


no comment isimli Üye şimdilik offline konumundadır  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Alt 16.04.08, 00:21   #6 (permalink)
Çılgın Yönetici
 
no comment - ait Kullanıcı Resmi (Avatar)
 
no comment - MSN üzeri Mesaj gönder no comment - YAHOO üzeri Mesaj gönder no comment isimli Üyeye Skype üzeri Mesaj gönder
Standart Hızlı ADO.NET Kursu

Hızlı ADO.NET Kursu

MS Press tarafından yayınlanan Adım Adım ASP.NET kitabını incelerken ADO.NET kısmına geldiğimde okuduğum ilk cümle şu oldu : "ADO.NET başlı başına bir kitap konusu olmaya yetecek kadar geniş bir konudur." Fakat burda bir veritabanı programcısının temel ihtiyaçlarını rahatlıkla karşılayabilecek kavram ve yöntemleri inceleyeceğiz.

ADO, n tabanlı bir uygulamada veri katmanı ile iş katmanı arasında veri transferini sağlayan teknolojidir. .NET devrimi ile ADO da yeni özellikler kazandı.

1. ADO.NET Nesne Grubu

ADO.NET ile gelen özelliklerin en önemlisi artık veritabanı tipine özel bağlantı nesnelerinin oluşturulmasıdır. Örneğin MSSQL Server 2000 veritabanına bağlanmak için SqlConnection nesnesini kullanırız. Bu performans açısından ciddi hız kazandırmıştır. Aynı şekilde veritabanı ile işlemler yaparkende veritabanı tipine özel oluşturulmuş nesneler yardımıyla artık daha hızlı ve daha kolay hale gelmiştir.

ADO daki temel nesnelerden viri Connection idi. Hangi veritabanı olursa olsun bu nesne ile bağlantı sağlanıyordu. ADO.NET te buna karşılık SqlConnection, OracleConnection, OleDbConnection ve OdbcConnection seçeneklerimiz mevcut

ADO nun ikinci temel nesnesi Command ise ADO.NET te yine veritabanı tipine göre değişkenlik arz ederek alternatifleri ile geliyor. SqlCommand, OracleCommand, OldeDdCommand ve OdbcCommand.

ADO yu oluşturan temel nesnelerin üçüncüsü RecordSet in alternatifleri yine birden fazla nesneden oluşuyor : DataSet, DataReader ve DataAdapter.

DataSet : RecordSet in gelişmiş versiyonudur. Birden fazla tablo sorgusunu barındırabilir, aralarında ilişki kurulabilir.

DataAdapter : DataSet ile veritabanı arasında köprü vazifesi görür. Insert, Update, Delete işlemlerini DataSet içindeki değişikliklere göre uygular.

DataReader : Veritabanından okunan kayıtsetini hızlı bir şekilde sunum katmanına aktarır. Sadece ileri doğru okunur ve okunan her kayıt hafızadan silindiği için hafızada yer tutmaz ve performasnı arttırır. Salt okunurdur.

2. İş Katmanından Veritabanına Bağlanmak

1. Önce bir SqlConnection nesnesi oluşturulur.
2. Oluşturduğumuz nesnenin ConnectionString özelliğine bağlantı cümlesi atanır
3. Open() fonksiyonu ile bağlantı açılır
4. Veritabanı ile yapacağımız işemler yapılır.
5. Close() fonksiyonu ile veritabanı bağlantımız kapatılır.

Örnek :

1 SqlConnection SqlConn = new SqlConnection();

2 SqlConn.ConnectionString = "server=127.0.0.1;"

+ "database=NorthWind;uid=sa;password=123";

3 SqlConn.Open();

4 // işlemler

5 SqlConn.Close();



3. Genel Fonksiyonlar

Veritabanı programcılarının temel işlevleri, kayıt girme, güncelleme ve silme işlemleridir. Bunun için veritabanı programcılarının ADO.NET te en çok kullanacakları nesne xxxCommand dir. ( xxx , veritabanı tipine göre değişkenlik gösterir. Örneğin; SqlCommand )

Şimdi bu nesnenin fonksiyonlarını inceleyeceğiz.

a. ExecuteNonQuery : Insert, Update, Delete gibi veritabanında değişiklik yapacak sorguların çalıştırılabileceği fonksiyondur. Geriye Sql sorgusundan etkilenen satır miktarını integer tipinde döndürür.

Örnek :

SqlConnection SqlConn = new SqlConnection();

SqlConn.ConnectionString = "server=127.0.0.1;"

+ "database=NorthWind;uid=sa;password=123";



SqlCommand Comm = new SqlCommand();

Comm.Connection = SqlConn;

Comm.CommandType = CommandType.Text;



string CompanyName = txtCompanyName.Text;

string Phone = txtPhone.Text;

string sql = "Insert into Shippers(CompanyName,Phone)"

+ " values('Mutasyon Corp.','0212 123 45 67')";



Comm.CommandText = sql;



SqlConn.Open();

Comm.ExecuteNonQuery();

SqlConn.Close();





b. ExecuteScalar : Tek bir değer döndüren sorgularda kullanılır. Örneğin "Select Count(*) Tablo1" gibi. Birden fazla satır ve sütun döndürecek bir sorgu kullanıldığında sonuç tablosunun ilk satır ve ilk sütündaki değeri döndürür.

Örnek :

SqlConnection SqlConn = new SqlConnection();

SqlConn.ConnectionString = "server=127.0.0.1;"

+ "database=NorthWind;uid=sa;password=123";



SqlCommand Comm = new SqlCommand();

Comm.Connection = SqlConn;

Comm.CommandType = CommandType.Text;



Comm.CommandText = "Select Count(*) From Shippers";



SqlConn.Open();

object oReturn = Comm.ExecuteScalar();

SqlConn.Close();



Response.Write( oReturn.ToString() );



c. ExecuteReader : xxxDataReader nesnesi ile birlikte kullanılır. Veri görüntülerken kullanılır. Sadece ileri ve salt okunurdur.

Örnek :

SqlConnection SqlConn = new SqlConnection();

SqlConn.ConnectionString = "server=127.0.0.1;"

+ "database=NorthWind;uid=sa;password=123";



SqlCommand Comm = new SqlCommand();

Comm.Connection = SqlConn;

Comm.CommandType = CommandType.Text;



Comm.CommandText = "Select CompanyName,Phone From Shippers";



SqlConn.Open();



SqlDataReader myReader;

myReader = Comm.ExecuteReader();



Response.Write("<table>");



while(myReader.Read())

{

Response.Write("<tr>");

Response.Write("<td>" + myReader["CompanyName"] + "</td>");

Response.Write("<td>" + myReader["Phone"] + "</td>");

Response.Write("</tr>");

}



Response.Write("</table>");



SqlConn.Close();



4. Stored Procudure'lara Erişmek.

1. Önce bir SqlConnection nesnesi oluşturulur.
2. Oluşturduğumuz nesnenin ConnectionString özelliğine bağlantı cümlesi atanır
3. SqlCommand Nesnesi oluşturulur
4. Command nesnemizin Connection 1. adımda oluşturduğumuz Connection nesnesi atanır.
5. Command nesnemizin CommandType özelliğine Stored Procedure ile çalışacağımı