http://esiyo.net - uordek.essiyoo.each { |yazi| esiyo.net << yazi }

Ruby ile Veri Tabanı - 4 (ODBC)

06.12.2006, yazan Tankut ŞENTÜRK

Bir önceki yazımızda artık ODBC modülü ile ilgili birçok sorumuza cevap bulmuştuk. Bu cevaplarla beraber bir iki adet faydalı örnek de vermiştik.

Bugün çalışmalarımızı örnekler üzerine yoğunlaştıralım ve örnekleri detaylı bir biçimde inceleyelim.
Örnek-1

require "DbTool.rb"

myDriver = DbTool.new()

myDriver.getDb() do |db|
    tableArr = db.tables().fetch_all
    tableArr.each do |table|
        tblType = table[3]
        tblName = table[2]
        if tblType != "SYSTEM TABLE" && tblType != "VIEW" && tblName!= "dtproperties" then
          count = db.run("SELECT COUNT(*) FROM dbo.[" + tblName+ "]").fetch_all
          puts "Table = " + tblName+ "(" + count.to_s + ")"
        end
    end
    tableArr.clear
end

Yukarıda verilen Örnek-1'i incelemeye başlarsak; Öncelikle

require "DbTool.rb"

myDriver = DbTool.new()

myDriver.getDb() do |db|
....
....
....
end

bölümlerinin DbTool sınıfı kullanımı esnasında standart işlemler olduğunu ve 'db' değişkeni içerisinde veri tabanı bağlantısı gerekli olan ODBC::Database sınıfından bir nesne bulunur. Aynı zamanda 'DbTool.getDb()' method'u içerisinde tüm hata yakalama ve işlem sonucunda bağlantıyı koparma ve kaynakları serbest bırakma işlemleri yer aldığından bunları burada yapmamıza gerek yok.

Bununla beraber

tableArr = db.tables().fetch_all
tableArr.each do |table|
   tblType = table[3]
   tblName = table[2]
....
end
tableArr.clear

bloğu içerisinde de tüm tabloların "fetch_all" işlemi ile beraber alınması ile veriler "Disconnected" yani bağlantısız şekilde elde ederiz. Daha sonra bu dizi üzerinde "each" ile beraber her satırda yer alan bilgiler işleniyor. "table" değişkeni de aynı zamanda bir diziyi ifade eder, bu şekilde 3. eleman tablonun tipini, 2. elemanı ise tablonun adını belirtir. Daha sonrasında;

if tblType != "SYSTEM TABLE" && tblType != "VIEW" && tblName!= "dtproperties" then
  count = db.run("SELECT COUNT(*) FROM dbo.[" + tblName+ "]").fetch_all
  puts "Table = " + tblName+ "(" + count.to_s + ")"
end

tipi "SYSTEM TABLE" ve "VIEW" olmayan aynı zamanda ismi "dtproperties" olmayan tabloları üzerinde işlem yapacağımızı belirtir ve tablolarda kaç adet kayıt olduğunu öğrenmek için SELECT.. cümlesi hazırlanıp, db değişkeni kullanılarak koşturulur. Dönen sonuç gene bağlantısız bir biçimde "count" bilgisine yazılır. Ve bu bilgiler ekrana yazılır.

Soru: Neden bağlantısız veri akışı kullanıyoruz ?
Yanıt: Eğer bu şekilde bağlantısız veri akışı kullanmaz isek, aynı anda açık birçok ODBC::Statement ortaya çıkacaktır. Fakat varsayılan olarak ODBC modülü bu şekilde tasarlanmamıştır, aynı iki ODBC::Statement açık olduğunda "Connection is busy with results for another hstmt" hatası alınır. Benim önerim, güvenli çalışma için her zaman bağlantısız nesneler kullanmamızdır.

Soru: getDb methodu neden "yield" kullanılarak yazıldı?
Yanıt: Her zaman data kurtarma, bağlantı kapatma ve hata yakalayıcıların yazılmasını istemiyorsak, bu şekilde yazım standardını kabul etmemiz gerekir. Ruby kullanıyorsanız bu şekilde bir yazım şeklini tercih etmelisiniz :).

Kolay gelsin..

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails)

Yaz aklındakini, çekinme :)

Lütfen: Yorumunuzun değerlendirilmesi ve yayınlanması uzun sürebilir. Yorumunuzu tekrar göndermeniz için bir neden yoktur, inanın tüm yorumları yayınlıyorum. Bazıları hariç :).