DBX & DataSnap Hakkında Destek Talebi..

// 9 Mayıs 2012 // Delphi

Web servisleri hakkında açılan destek talebi ve bu hususa ilgisini eksik etmeyen arkadaşlarımızın varlığı benim de yaşadığım bazı sorunlara istinaden QC’de açtığım başlıklar için sizlerden destek talebinde bulunmama neden oldu.

Bu başlıklar ve linkleri kısaca aşağıdaki gibidir;

TJSONTrue & TJSONFalse Problemi

TJSONTrue ve TJSONFalse sınıfları TJSONValue sınıfından türetilmişlerdir ve TJSONValue sınıfı da TJSONAncestor sınıfından türetilmiştir. TJSONAncestor sınıfı içinde Value isminde virtual olarak tanımlanmış olan bir fonksiyonun; TJSONTrue ve TJSONFalse sınıfları içinde ezilmesi(override) unutulmuştur. Bu bağlamda, TJSONTrue ve TJSONFalse sınıflarından ürettiğiniz nesneler üzerinde Value fonksiyonunu çağırdığınızda maalesef TJSONAncestor sınıfı içinde tanımlı olan Value fonksiyonu çağrılacak ve geri dönüş değeri olarak beklediğiniz “true” yada “false” yerine NullString sabiti yani “” dönecektir.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

TDBXBoolean.SetAsString Problemi

procedure TDBXBooleanValue.SetAsString(const Value : UnicodeString);
begin
SetBoolean(Value <> 'False');
end;

Bu metodun içinde dışarıdan geçilen Value isimli parametrenin karşılaştırılması sırasında bir problem oluşmaktadır. Bu metoda dışarıdan, “false” yada “FALSE” biçiminde geçilen parametreler beklendiği gibi false sonucunu doğurmayıp true ile neticelenmektedir. Metodun doğru implemente edilmiş hali;

procedure TDBXBooleanValue.SetAsString(const Value : UnicodeString);
begin
SetBoolean(UpperCase(Value) <> 'FALSE');
end;

olmalıdır.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

TDBXReader Sınıfı RecordCount Eksikliği

Bilindiği gibi DBX ile veritabanlarından veri çekmek için Command nesnelerinden istifade ediyoruz. Bu Command nesneleride veri setlerini TDBXReader üzerinden bizlere sunuyorlar. Datasnap uygulamaları geliştirirken, uygulamanızın hemen hemen her platformda çalışan bir versiyonunu istiyorsanız muhtemelen JSON sınıfları ile çalışmak isteyeceksiniz. Bu bağlamda metodlarınızın, TDBXReader yerine TJSONObject türevi nesneler döndürmesini isteyeceksiniz. Bu isteğinizi yerine getirmek için muhtemelen TDBXReader’ı bir TJSONObject’e çeviren hazır metodlar kullanacaksınız. Ancak, eğer TDBXReader’ınız içinde hiç bir kayıt yok ise yani boş bir dataset olarak veritabanınızdan döndü ise, bu durumda TDBXReader’ı TJSONObject’e çevirirken bir hata ile karşılaşacaksınız. Bu hatayı bertaraf etmek için TDBXReader’ın içinde kayıt olup olmadığını bilmek isteyeceksiniz. Ancak hepimizin bildiği gibi DBX unidirectional olduğu için böyle bir metodla yada property ile maalesef karşılaşamayacaksınız. TDBXReader üzerinde *while Next* ile dönüp kayıt sayısını bulabilirsiniz ancak bu durumda da TDBXReader’ın son kaydına erişmiş olacak ve başka problemlerle karşılaşacaksınız. Bu bağlamda, TDBXReader üzerinde RecordCount gibi bir property yada fonksiyonun programcılara sunulması son derece faydalı olacaktır.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

Native DBX SQL Server Driver’ı “Application Name” Özelliğini Desteklemiyor Problemi

Bazen SQL Server tarafında uygulamamıza bağlanan kullanıcının kim olduğu bilgisine ulaşmak isteriz. Örneğin pek çoğumuz, veritabanı sunucusunun sunduğu kullanıcı, login imkanlarını kullanıp; GRANT , REVOKE ile o kullanıcıları nesneler üzerinde haklar vermek yerine; Users gibi bir tablo oluşturup kullanıcılarımızı oraya girer ve UserRights gibi tablolarda da hakları belirleriz. Uygulamalarımızda ise programa girerken kullanıcıdan isim ve şifre girmesini bekler, doğruluğunu yine Users tablosunu sorgulayarak yaparız. Durum bu ahvalde iken, SQL Server içinde T-SQL dilini kullanırken, veritabanına hangi kullanıcı ile bağlandığımızı göremeyiz. Dolayısı ile kullanıcı işlemlerini loglamak istediğimizde bunu başaramayız. Ancak; eğer veritabanı sunucusuna bağlanırken connection nesnemiz üzerindeki Connection String’de “Application Name” özelliğine kullanıcı adını yazarsak, SQL Server’da istediğimiz her yerde APP_NAME() T-SQL metodu ile bağlı olan kullanının isim bilgisine erişebiliriz. İşte ADO’da mevcut olan bu fonksiyonalite maalesef native DBX SQL Server driver’ında bulunmuyor.
Not: DevArt’ın driver’ında bu özellik sunuluyor.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

Otomatik Parametre Oluşturma Problemi

Veritabanı tarafında eğer sizde benim gibi sık sık stored procedure kullanıyorsanız ve bu stored procedure’lerinizde birden çok parametreniz var ise TDBXCommand ile bu parametreleri sürekli oluşturmaktan bıkmış olmalısınız. Muhtemelen ADO’daki gibi Parameters.Refresh isimli bir metod neden yok diye içinizi geçirmişsinizdir. Benim buna bulduğum geçici çözümü raporun linkinden takip edebilirsiniz.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

TDBXParameterList & ParamByName Problemi

Pek çoğumuz DBX ile programlamaya başlamadan önce muhtemeldir ki ADO kullanıyorduk. Dolayısı ile alışılagelmiş bazı kullanımlarımız var. Örneğin, ADO üzerinden bir stored procedure’nin parametresine ulaşmak için hepimiz genelde ParamByName fonksiyonunu kullanırız. Maalesef DBX’de bu fonksiyonda yok, onun yerine GetParameterByName isimli bir metod sunulmuş. Evet bu metod istediğimizi yerine getiriyor ama alışkanlıklarımıza pek de uygun olmuyor. Ben bu sorunu bertaraf edebilmek adına geçici bir çözüm olarak helper sınıflardan istifade ettim.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

TDBXParameter.Value & Set.. Metodları Problemi

Yine bir stored procedure’nin parametrelerine değer atamak istediğin,zde muhtemelen Value property’sine başvuracaksınız. TDBXParameter sınıfın Value property’si TDBXWritableValue türünde tanımlanmıştır ve TDBXWritableValue sınıfının birden fazla Set ile başlayan ve nerede ise her veri türü için metodu vardır. Integer tipli bir parametre için SetAsInteger, Double için SetAsDouble, String için SetAsString ve buna benzer metodları çağırmanız gerekir. Bunun yerine TDBXWritableValue sınıfının TValue tipinde bir değişkeni parametre olarak kabul eden bir Set.. metodu olsa idi işimiz ne kadar kolay olurdu değil mi ? Artık SetAsString, SetAsDouble, SetAsInteger metodlarını çağırmak yerine her veri türünü tutabilen SetAsValue metodunu çağırabilirdik. Bu sorunu aşmak için uyguladığım yöntemi raporun linkinden takip edebilirsiniz.

Raporun linki aşağıdadır:
Görmek için
Oylamak için

Burada sizinle paylaştığım sorunları ben bir şekilde aştım sizlerinde linklerden görebileceği gibi. Ancak bu sorunların Delphi içinde düzeltilmesi hepimiz için daha yararlı olacaktır. Bazı raporlarımı sorun olarak adletmeyip belki de istek olarak görebilirsiniz, bu konuda haklı da olabilirsiniz ama bence sorun olabilme ihtimali onlar için bile yüksektir.

Sizlerden ricam sunduğum raporlara oylarınız ile destek vermeniz. Kimbilir belki de önümüzdeki update’de sorunları aşmış olabiliriz sizlerin sayesinde.

“DBX & DataSnap Hakkında Destek Talebi..” için 2 Yorum

  1. seydi diyor ki:

    Merhaba XE6 ‘da Datasnap’da interbase örnekleme yapıyorum . DataClientSet1 ‘de gerekli ayarları yaptım , Active True yaptığımda Access violation at address 50B0DA6F in module ‘dsnap200.bpl’.Read of address hatası veriyor. XE6 ‘yı Yönetici olarak da çalıştırdım. Sebebi ne olabilir.

  2. emrah diyor ki:

    seydi arkadaşımızın sorduğu soru beni 2-3 haftadır delirtti. Serverda çalışan datasnap uygulaması var, datamodülün içerisinde TFDquery ler ve servermethodta datasetprovider ler var. Bu servera 5 tane el terminali aynı anda programı kullanırken, datasnap sürekli access violation hatası veriyor. Nedeni ne olabilir :(

Yorum Yazın