DAO Gitti ADO Geldi
DAO gideli, ADO geleli epey oldu. ADO da gitmeden evvel onu anlatmazsak olmaz. Birçokları için artık eskimiş ADO'yu evirip çeviriyoruz bu ay.
Başlığın Türkçe'sini merak edenler için bu yazıda, Access'te kod ile kayıt işlemlerinin nasıl yapılabileceğinden bahsedildiğini söyleyeyim. ADO'yu incelememizin sebebi Access'in bizi onu kullanmaya zorlaması. Resimde bunun delilini görüyorsunuz.
Emektar DAO'nun yerinde yeller esiyor gördüğünüz gibi. Zaten Microsoft'un artık DAO'nun geliştirilmeyeceğini duyurduğunu biliyoruz. Madem öyle, işte ADO'nun bir kısım marifetleri.
Bir
Access 2000 dosyasını ilk oluşturduğunuzda referanslar listesinde geçerli olarak ADO (Microsoft Activex Data Objects 2.x Library) seçili geliyor. Office 2000 ilk kurulduğunda 2.1 sürümü görünüyor. Bu yazının yazıldığı sıralarda ADO'nun 2.5 sürümü epey yaygındı. (Fakat yazının yazıldığı bilgisayar her nasılsa bu yaygınlık alanı içerisinde yer almıyor.)
ADO, Microsoft'un sitesinden ücretsiz yüklenebiliyor. Veyahut MS'nin bazı kurulum paketlerinin içinde ADO'nun kurulum dosyası çıkabiliyor. Visual Studio 6.0 Service Pack 4 kurulum dosyaları arasında yer alıyor bu dosya. (PC Magazine Offline Ekim 2000 CD'sinde Visual Studio 6 SP4'ü bulabilirsiniz.)
ADO'nun kurulum dosyasının adı MDAC_TYP.EXE ve dosyanın büyüklüğü 8 mb. civarında. ADO kullandığınız projenizi dağıtmak istediğinizde bu kurulum dosyasını da vermeniz gerekebileceğini unutmayın. Tabii ki ücretsiz ve sınırsız dağıtılabilir.
'ADO da ne' diyenler için ADO'nun farklı uygulama geliştirme araçları tarafından ortak kullanılabilen bir veritabanı modülü olduğunu söyleyebilirim. Yaygın sistemlerin hemen hepsi diğer ortak modülleri kullanabildikleri gibi ADO'yu da kullanabilirler. ADO bize bir yerdeki veritabanına ulaşabilmemiz için kolaylıklar sağlıyor ve bizi bir yığın işten kurtarıyor. DAO'nun da (Data
Access Objects) hakkını yemeyelim. ADO kadar yetenekli olmasa da veri işlemleri daha önce onunla yapılıyordu.
ADO'nun en büyük yeteneklerinden biri Internet veya yerel ağ ortamında bile
Sql Server sunucusuna kolaylıkla bağlanabilmesi. Aynı makine üzerindeymiş gibi
Sql Server'a istediğiniz birçok şeyi yaptırabiliyorsunuz. Fakat bu yazının konusu, DAO yerine ADO kullanmamız konusunda ısrar eden
Access 2000'de ADO'nun nasıl kullanıldığı.
ADO gibi başka modeller de olduğunu hatırlatayım. Kısaca RDS, MSDE şeklinde adlandırılan benzer sistemler mevcut. İleriye dönük ve büyük projeler hazırlıyorsanız tez elden ADO'ya geçmenizi öneririm.
ADO İLE BAŞLANGIÇ
DAO'nun kolay nesnelerine yeterince alışmıştık.
Dim DB as Database
Dim Rs as Recordset
Set DB= CurrentDB()
Rs.FindFirst
Rs.FindNext
...
şeklindeki deyimler neredeyse tamamen değişti. Access'te, ASP'de ya da herhangi bir
Vba platformunda ADO'yu aşağıda anlatıldığına benzer şekillerde kullanabilirsiniz.
ADO ile bir tabloyu kullanmak için aktif proje dosyasının Connection nesnesine bir başvuru yapılıyor.
Dim rs As New ADODB.Recordset
rs.Open "Table1", CurrentProject.Connection
Bir tabloyu ya da veri kümesini açmak ve kullanmak için eskiden olduğu gibi birçok alternatif var. Ama ADO'da bu alternatifleri biraz daha iyi bilmemiz gerekiyor.
KAYIT DEĞİŞİKLİKLERİ
Kayıt ekleme yapılabilmesi için tablo açılırken adLockOptimistic parametresi kullanılmalı.
rs.Open "Table1", CurrentProject.Connection, _
adOpenKeyset, adLockOptimistic
rs.AddNew
rs("Field1") = "Test"
rs("Field2") = 1234
rs.Update
Kayıt silme eskisi gibi:
rs.Delete
Kayıt değiştirmek için ise ADO'nun DAO'ya göre bir farkı var. Değişikliği yapmadan önce artık Edit metodu kullanılmıyor ve doğrudan değişikliğe geçiliyor.
rs.Open ...
rs("Field1") = "Test"
rs("Field2") = 1234
rs.Update
ADO İLE
Sql KODU ÇALIŞTIRMAK
Artık Database nesnesi yerine Connection nesnesi kullanılıyor. Aktif dosyaya ulaşmak için CurrentProject.Connection deyimini kullanarak bir
Sql kodunu çalıştırmayı (Execute) deneyin.
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
conn.Execute "UPDATE Table1 SET ad = 'deneme' WHERE (ID='1');"
ya da
CurrentProject.Connection.Execute "UPDATE Table1 SET ad = 'deneme' WHERE (ID='1');"
SQL İLE ARAMA YAPMAK
SQL kodu içinde arama yapmak için WHERE dışında LIKE deyiminin de kullanılabileceğini biliyorsunuzdur. Eskiden LIKE deyiminde metin alanlarında ayrıntılı arama için * işareti kullanılırdı. Şimdiyse bunun yerine % işareti kullanılıyor. (SELECT deyiminin yanında * işareti kullanılır. Bu değişiklik sadece LIKE deyimi için geçerli.)
Şu deyim ile bir
Sql kodunu kayıt değişiklikleri yapılabilecek şekilde açabilirsiniz:
rs.Open "SELECT * FROM Table1 WHERE (AdiSoyadi Like 'A%'));", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
En sondaki adLockOptimistic deyimini adLockReadOnly yaparsanız kayıt kümesi sadece okunur olacaktır.
LIKE deyiminin yanındaki 'A%' ifadesi ile AdiSoyadi alanında 'A' ile başlayan kayıtlar seçiliyor. Değiştirip '[A-K,U-Z]%' şeklinde kullanmanız da mümkün. Yani hem A-K arası, hem de U-Z arası değerlerin olduğu kayıtlar elde ediliyor.
LIKE deyiminden sonra bir de şunu yazmayı deneyin:
'%A_[M,T]%'
Bu şekilde yapıldığında herhangi bir yerinde 'A' ve yanında herhangi bir karakter olup onun yanında da 'M' veya 'T' olan değerlerin bulunduğu kayıtlar listelenecektir. Mütevazi LIKE deyiminin eskiden kalma daha birçok yeteneği var. Buna ilk olarak Word6.0'da şahit olmuştum. LIKE ile ilgili arama yeteneklerini bir de Word2000'in Bul/Değiştir sayfasında görmelisiniz.
TABLO YA DA KAYIT KÜMESİ ÜZERİNDE ARAMA YAPMAK
Kayıt kümesinde arama yapmaktan kasıt,
Sql kodu kullanmadan, elde ettiğimiz kayıt kümesi (RecordSet) açıldıktan sonra arama yapılması. Eskiden FindFirst, FindNext gibi komutlar kullanıyorduk. Bu komutların tümü Find adlı yeni komut altında toplanmış. Find komutu değişik parametreler alarak eski komutların işini yapabiliyor. Fakat alışkanlıklarımızı değiştirmeye zorlayarak.
Arama işlemini başlatmadan önce tabloda kayıt olup olmadığı kontrol ediliyor. Zira kayıt yoksa MOVEFIRST komutu hata verir. Zaten herhangi bir anda ilk kaydı bulmak için tablonun başına gidilmesi gerekli.
İlk kaydı bul (FindFirst):
rs.MoveFirst
rs.Find "Kriter", 0, adSearchForward
Sonrakini bul (FindNext):
rs.Find "Kriter", 1, adSearchForward
Öncekini bul (FindPrevious):
rs.Find "Kriter", 1, adSearchBackward
Son kaydı bul (FindLast):
rs.MoveLast
rs.Find "Kriter", 0, adSearchBackward
DAO'da kayıt bulunamadığında RecordSet nesnesine ait NoMatch özelliği kullanılabilirken ADO'da böyle bir özellik yok. Aradığınız kaydın bulunup bulunamadığını anlamak için, eğer ileri doğru arama yapıyorsanız kümenin sonunda (rs.EOF=True ? ) olup olmadığınızı, geri doğru arama yapıyorsanız kümenin başında (rs.BOF=True ? ) olup olmadığınızı kontrol etmelisiniz.
BOŞ KAYITLAR GELSİN
NULL deyimi boş değerleri yani 'hiçbir şey'i ifade ediyor. Eskiden bir veri alanının değerinin boş olup olmadığını bulmak için 'VeriAlani1 IS NULL' yazılıyordu. Ya da boş olmayan kayıtlar 'VeriAlani1 IS NOT NULL' ile listelenebiliyordu. ADO'nun
Sql kodlarında ise bu deyimle beraber eşitlik işaretleri kullanılıyor.
'VeriAlani1 = NULL'
'VeriAlani1 <> NULL'
Son olarak NEW ya da CREATEOBJECT deyimi ile oluşturduğunuz Connection ve Recordset nesnelerini NOTHING ile silmeyi unutmayın.
Set rs = Nothing
Set conn = Nothing
ADO o kadar ayrıntılı ki tam olarak anlatana kadar neredeyse bir dergi dolusu yazı çıkar.
Eğer projenizde kod yazmıyorsanız ya da yazdığınız kodlarda ADO'yu kullanmıyorsanız referanslar listesinden ADO'yu kaldırabilirsiniz. Herhangi bir modül sayfası açıkken Tools/References (Araçlar/Başvurular) menüsünü kullanarak.
Bir tabloyu sadece okunabilir olarak açmak:
rs.Open "Table1", CurrentProject.Connection, adOpenKeyset, adLockReadOnly
Bir tabloyu kayıt ekleme, silme ya da değiştirme için açmak:
rs.Open "Table1", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Sadece okunabilir bir
Sql kodu açmak:
rs.Open "SELECT * FROM Table1 WHERE ...", CurrentProject.Connection, adOpenKeyset,
adLockReadOnly
Kayıt eklenebilecek, silinebilecek ya da değiştirilebilecek şekilde bir
Sql kodu açmak:
rs.Open "SELECT * FROM Table1 WHERE ...", CurrentProject.Connection, adOpenKeyset,
adLockOptimistic
Dim rs as New ADODB.Recordset
rs.Open "Kisiler", CurrentProject.Connection, _
adOpenKeyset, adLockOptimistic
If rs.EOF = True Then
MsgBox "Tabloda kayıt yok."
Else
rs.MoveFirst
rs.Find Kriter, 0
'Eski FindFirst ile aynı.
If rs.EOF = True Then
MsgBox "Kayıt bulunamadı."
Else
'Tüm kayıtları sırayla bul ve mesaj göster.
Do While Not rs.EOF
MsgBox "Kayıt bulundu." & vbCr & vbCr & _
rs("ID") & " " & rs("Ad") & " " & rs("Soyad")
'Sonraki kayıttan itibaren tekrar ara.
rs.Find Kriter, 1
Loop
End If
End If
rs.Close
Set rs = Nothing
diğer soruna gelince ado nesneleri kayıtlı ise çalışmaması için bir neden yok dao çalışıyorsa ado dünden çalışır mutlaka sende eksik yada bozuk bir referans falan vardır sebebini bilmemizin imkanı yok görnmeden bendede daha önce çalışan bir kod şimdi arıza veriyor office bozulmuştur. diye office yeniledim çalışmadı verilen eksik refaraansları yenileri ile değiştirdim çalışmadı sonunda format attım yeni office kurdum çalıştı büyük ihtimalle bilgisarara kurulan programlardan bir referans değişikliğine sebeb oldu silerkende o referansıda sildi ondan dolayıdır diye düşünüyorum ayrıca
NOT: bu makale alıntıdır. Ayrıca kod deposunda vardır.
ado ile yaptığın kodları ve referans ların bir fotosunu gönderirse3n bakarız