Recordset kullanmadan Execute ile veritabanından değer alınabilir mi?

Katılım
16 Ağustos 2004
Mesajlar
137
Excel Vers. ve Dili
Office 2010 En 64 Bit
Merhaba,

Bir SQL Server'a ADO Connection nesnesi vasıtasıyla bağlanıp kabaca Connection.Execute "Update Tablo1 Set Alan1 = Alan1 + 1"

şeklindeki bir komutu Execute yöntemiyle server'a gönderip veritabanındaki bir alandaki değeri değiştirebiliyoruz.

Aynı Verinin ne olduğunu öğrenmek için ise ilgili connection için bir de Recordset tanımlayıp bu değeri Recordset içinden öğrenip uygulamamızda kullanabiliyoruz.

Peki ilgili veriyi (Mesela örneğimizdeki Alan1 Alanındaki değeri) Recordset kullanmadan Execute yöntemi ile elde etmek mümkün müdür?

Yani;

Deger = Connection.Execute ("Select Alan1 From Tablo1")

gibi bir yöntem var mı?
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,344
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
Merhaba,
.
.
Recordset kullanmadan Execute yöntemi ile elde etmek mümkün müdür?

Deger = Connection.Execute ("Select Alan1 From Tablo1")

gibi bir yöntem var mı?
Merhaba,

Recordset' ten kurtuluş yoktur. :)

Eğer SELECT ifadesinden bir kayıt kümesi dönecekse, -bu bir nesnedir-
"Deger" değişkeni Recorset'in ta kendisidir.
 
Katılım
16 Ağustos 2004
Mesajlar
137
Excel Vers. ve Dili
Office 2010 En 64 Bit
Öncelikle yorumunuz için teşekkür ediyorum Zeki Bey,

Firmamızda kullanılan muhasebe programının bir giriş kaydını Profiler'dan izlerken Update ve ardından Select ifadelerini içeren iki tane SQL sorgusunun SQL Server'a gönderildiğini gördüm.

İlk update işleminin aynısını Connection.Execute "Update ............"
komutu ile ben de yaratabildim.

Ancak ardından program Select ifadesi ile az önce Update etmiş olduğu veriyi aldı ve hemen ardından da bu veriyi de içeren bir kayıt kümesini
Insert Into ............. ifadesi ile veritabanına girdi.

İlgili değeri ben Recordset ile öğrenmek istediğimde değeri ben de öğrenebiliyorum, ancak benim Recordset nesnesiyle öğrendiğim değerin yürütüldüğü satırlar Profiler'da çok daha fazla satır ile ve benim tam olarak anlayamadığım komutlarla bana geri dönüyor.

Yani; aynı değeri Recordset ile ben de hatasız olarak öğrenebiliyorum. Ama kullandığımız muhasebe programının içinden yapılan girişlerde Profiler da sadece bir Select satırı oluşurken benim Recordset ile yaptığım işlemde 6-7 satırlık bir komutlar dizisi dönüyor (Anladığım kadarıyla SQL cümleme benim SQL cümlemde olmamasına rağmen bir değişken deklare ediliyor ve ardından bu değişkenin aldığı değer bana bildiriliyor).

Netice; Çok sorun değil, ancak benim sorgum SQL Server'i daha fazla yoracak gibi görünüyor. O yüzden eğer sadece Command.Execute "Select......" gibi bir komutla bu değeri öğrenebiliyormuyum diye sordum.


Not1: Zeki Bey (veya bilgisi olan başka biri), Recordset'te tanımladığımız adLockPessimistic ile
Command.Execute "Set implicit_transactions on"
.
.
.
Command.Execute "Set implicit_transactions off" (Veya Command.Execute "IF @@TRANCOUNT < 0 COMMITTRAN")

işlemleri aynı işi mi yaparlar? (Yani ikisi de değeri update edilecek bir alana erişimi geçici olarak engelleyip o anda işlem yapan uygulamanın önce Update yapmasına ve ardından da Update yapılmış olan bu alandaki değeri Select etmesi için işe yarar mı?)


Not2: Aslında benim yapmak istediğim işlem;

Update Tablo1 Set Alan1 = Alan1 + 1 Where Kriter = 'xyz'
Select Alan1 From Tablo1 Where Kriter = 'xyz'

**** Tablo1: Tablonun Adı, Alan1 ve Kriter ise bu tabloda bulunan ve biri Long, Diğeri ise String olarak tanımlanmış iki alandır.

bu iki satırı ard arda yürütürken bahsedilen Alan1 adlı alana başka kimsenin ben işlem yaparken erişmesini engellemek. Yani Select ettiğim değer kesinlikle benim Update ettiğim değer olmalı. Bunun için bir recordset nesnesinin Lock Type'ini adLockPessimistic yapmak kesin olarak bu alana diğer kullanıcıların erişimini ben Recordset.Close komutu gönderene kadar engeller mi?
 
Üst