Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen Ali Erdoğan »

Merhaba,
Diyelimki Firebird'de çalıştırılmak üzere hazırladığımız bir sql ifadesi var.

Kod: Tümünü seç

insert into tablo(tamsayi,tarih,ondalik) values(1,'21.02.2008','10,45');
Şeklinde bir SQL ifadesi bölgesel ayarları Türkçe olarak yapılmış bir bilgisayarda çalışacaktır. Ancak bölgesel ayarları Amerikan İngilizcesi olarak yapılmış bir bilgisayarda tarih formatı aa/gg/yyyy ve ondalık ayıracı "." olduğu için çalışmayacaktır. Bu durumda bir sql cümlesini istediğimiz bir kültür kodu ile (mesela win-1254) çalışmaya nasıl zorlayabiliriz?

Burada tarih ve ondalık sayıyı datasetde parametre olarak tanımla diyebilirsiniz. Ancak durum böyle bir yapıyı desteklemiyor ve verilen bir sql cümlesinin ne olursa olsun bölgesel ayarlardan bağımsız çalışmasını gerektiriyor.

//FIBPlus bileşenlerini kullanıyorum.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen undefined »

viewtopic.php?f=18&t=23413
Burada bu meseleye biraz değinmiştim. Params kullanırsanız bu dönüşümler otomatik olur.
Params kullanmamak için Sql'i ben runtimeda generate ediyoum demekte mazeret değil. Runtimeda da params belirlenebilir.

Eğer params kullanamıyacağın bir durum varsa (ki beni ikna etmen gerekir buna) FormatDate ve FormatFloat fonksiyonları ile kendi belirlediğin firebirdün anlaycağı biçimleri verip bunları stringe dönüştürebilirsin.

Ayrıca Win1254 bölgesel ayar değil, 8 bitlik karakter setini ifade eder. Bunun nasıl olacağı da bağlanırken yanlış hatırlamıyorsam SET NAMES ile belirleniyor. Bağlantı bileşenlerinin bunu otomatik yapıyor olması lazım.
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen Ali Erdoğan »

Bir yerden bir yere veri taşımak için birinci uygulama taşınacak verileri diğer veri tabanına işleyecek sql ifadelerini içeren bir dosya oluşturuyor. Sonra uzaktaki uygulama bu sql dosyasını işleterek veriler aktarılmış oluyor. Şimdilik zaten sorun yok. Ancak ileride iki taraftan birinde bu bölgesel ayarlar değişecek olursa sistem çalışmayacak.

Parametre kullanma durumum bu yüzden yok. Koca dosyadaki tarih ve ondalıkları düzene sokmak pratikte sanırım mümkün değil.

Şimdi veri aktarımı için xml dosyası oluştur vs. diyebilirsiniz. Ancak pek çok tablodan karmaşık bir aktarım durumu söz konusu ve xml ile bu olay çok daha komplike ve ağır olacaktı. Direk sql ifadeleri ile 2-3 mb bir dosya oluşuyor ancak xml ile yapmaya çalışırsak sürekli tekrarlanan ifadelerden dolayı 30-40 mb buluyor. Performans olarak da çok çok yavaş oluyor.

Bu arada veri alışverişi yapan taraflardan biri Asp.Net ile hazırlandı ve web tabanlı çalışıyor. Diğeri ise Delphi ile hazırlanmış bir masaüstü uygulaması.
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen Ali Erdoğan »

undefined yazdı: Ayrıca Win1254 bölgesel ayar değil, 8 bitlik karakter setini ifade eder.
Anlatmak istediğim scripti Türkçe yerel ayarları ile çalıştırmak. Eski Asp de

Session.LCID = 8859

şeklinde bir komut verdiğimiz zaman sunucunun yerel ayarları ne olursa olsun sayfa Türkçe yerel ayarlarına göre çalışıyordu.
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen Battosai »

Veritabanlarının tarih,saat,ondalık tipleri sabit diye biliyorum.Bu yüzden hepsinin bunları dönüştürmek için fonksiyonları var...SQLserver'ın vardır belki kullanmadığım için bilmiyorum.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen undefined »

Battosai yazdı:Veritabanlarının tarih,saat,ondalık tipleri sabit diye biliyorum.Bu yüzden hepsinin bunları dönüştürmek için fonksiyonları var...SQLserver'ın vardır belki kullanmadığım için bilmiyorum.
Evet firebird bölgesel ayarlardan bağımsız çalışır. O SQL oluştururken formatlaman her zaman firebird'ün istediği şekilde olmalıdır.
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen Ali Erdoğan »

undefined yazdı: Evet firebird bölgesel ayarlardan bağımsız çalışır. O SQL oluştururken formatlaman her zaman firebird'ün istediği şekilde olmalıdır.
Bu kullandığım bileşenden kaynaklanıyor o halde. Bölgesel ayarlar script'in çalışmasını etkiliyor. Aynı şey IBExpert'de çalıştırdığım zaman için de geçerli. Bölgesel ayarlar Türkçe iken sorun yok. Ancak Başka bir bölgesel ayar seçtiğimde tarih ve ondalıklarda takılıyor :( .
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen aLonE CoDeR »

Ben mi yanlış algıladım bilmiyorum ama sanırım anlatılanlarla anladıkların çelişiyor. FireBird zaten bölgesel ayarlara bağımlı olarak çalışmıyor, sorgu da nihayetinde çalıştırılmak üzere senin elinden (uygulamandan) geçiyor. Bu durumda o sorguları revize ederek ilgili kontrol ve değişiklikleri yapmak neden mümkün değil bunu çözemedim. Bu noktadan hareketle eğer sorguya müdahale edebiliyorsak -ki çalıştırabildiğimize göre edebiliyoruz- parametre kullanmamız için bir mani göremiyorum.

Kolay gele.
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen Ali Erdoğan »

aLonE CoDeR yazdı:Ben mi yanlış algıladım bilmiyorum ama sanırım anlatılanlarla anladıkların çelişiyor. FireBird zaten bölgesel ayarlara bağımlı olarak çalışmıyor, sorgu da nihayetinde çalıştırılmak üzere senin elinden (uygulamandan) geçiyor. Bu durumda o sorguları revize ederek ilgili kontrol ve değişiklikleri yapmak neden mümkün değil bunu çözemedim. Bu noktadan hareketle eğer sorguya müdahale edebiliyorsak -ki çalıştırabildiğimize göre edebiliyoruz- parametre kullanmamız için bir mani göremiyorum.

Kolay gele.
@alone tüm mesajları okumamışsın sanırım. Veri taşımak amacı ile bir script oluşturuluyor. Bu script binlerce ifade içeriyor. Sonra bu script başka bir makina da çalıştırılarak veriler işlenmiş oluyor. Bu yüzden parametre kullanma şansım yok. Çünkü veriler zaten script vasıtası ile taşınıyor.

IBExpert'de içerisinde tarih ve ondalık alanı olan bir tablo için

Kod: Tümünü seç

update tablo set tarih='25.05.2008', ondalik='9,81'
sorgusunu çalıştırın. Eğer bölgesel ayarlarınız Türkçe ise çalışacaktır. Sonra bölgesel ayarlarınızı İngilizce (Amerikan) yapıp IBExpert'i yeniden başlatın ve sorguyu yeniden çalıştırmayı deneyin. Meşhur

Kod: Tümünü seç

Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
hatası ile karşılaşacaksınız.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen aLonE CoDeR »

Ali Erdoğan yazdı: Sonra bu script başka bir makina da çalıştırılarak veriler işlenmiş oluyor.
Burada adı geçen başka makina, müdahale imkanın olmayan bir makina ve/veya scripti çalıştıran uygulama başka birinin yazdığı ve müdahale edemedin bir uygulama mı? Öyle bile olsa scripti generate ettikten sonra tekrar bir müdahaleyle gerekle revizyon yapılabilir.

"Mesajların tamamını okumamışsın" şeklinde bir yaklaşım hoş değil, hiçbir konuda 2 kelime okuyarak cevap yazmadım bugüne kadar! Yapılan eleştiri ve yorumların yıkıcı değil yapıcı olduğunu bulunduğumuz ortam gereği düşünmek durumundayız.

Topice daha yazmıyorum, kolay gele.
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Re: Sql Cümlesini Bölgesel Ayarlardan Bağımsız Çalıştırmak

Mesaj gönderen Ali Erdoğan »

aLonE CoDeR yazdı:
Ali Erdoğan yazdı: Sonra bu script başka bir makina da çalıştırılarak veriler işlenmiş oluyor.
Burada adı geçen başka makina, müdahale imkanın olmayan bir makina ve/veya scripti çalıştıran uygulama başka birinin yazdığı ve müdahale edemedin bir uygulama mı? Öyle bile olsa scripti generate ettikten sonra tekrar bir müdahaleyle gerekle revizyon yapılabilir.
Anlatamadığım nokta odur ki benim elimde bir script + bu script i çalıştırmak için gereken veriler yok. Yani elimde bir sql cümlesi ve bu sql cümlesinde kullanılacak veriler olsa parametre vasıtası ile bu verileri enjekte ederim ki benim de benimsediğim durum budur. Ancak elimde sadece bir script var ve veriler zaten bunun içerisinde. Parametre kullanamama sebebim budur.
aLonE CoDeR yazdı: "Mesajların tamamını okumamışsın" şeklinde bir yaklaşım hoş değil, hiçbir konuda 2 kelime okuyarak cevap yazmadım bugüne kadar! Yapılan eleştiri ve yorumların yıkıcı değil yapıcı olduğunu bulunduğumuz ortam gereği düşünmek durumundayız.
Parametre kullanamamamdaki sebebi önceki mesajlarda anlatmama rağmen mesajında niçin parametre kullanmadığımı sorgulaman üzerine mesajları okumadığını düşündüm. Zaten okuma zorunluluğun da yok. Bu bir eleştiri değil.
aLonE CoDeR yazdı: Topice daha yazmıyorum
Burada kimse kimseye bıçak dayamıyor gel şu konuya yaz diye. O yüzden "konuya artık yazmıyorum" sözünü afedersin ancak biraz "küstahça" bulduğumu söylemek istiyorum. Kimsenin "Lütfedin de n'lur yazın" diyecek durumu yok zaten. Öyleyse bu naz kime?

Bununla beraber şöyle bir şözüm geliştirim:

- GetLocaleInfo fonksiyonu ile bölgesel ayarlardaki verileri alıp değişkenlere atıyorum.
- SetLocaleInfo ile istediğim tarih ve ondalık biçimlerini atıyorum
- İşlemleri yapıyorum
- Tekrar SetLocaleInfo ile bölgesel ayarları eski haline geri döndürüyorum.

Threat bazında bu işlemleri yapmak için ShortDateFormat ve DecimalSeparator özellikleri kullanılabilir. Yukarıdaki yöntemde eğer bölgesel ayarlar değiştirildikten sonra tekrar revize edilmeden elektrik kesintisi vs. olursa kullanıcının bölgesel ayarları benim atadığım şekli ile kalacağından biraz sakıncalı bir yöntem ancak bu çok küçük bir olasılık ve kullanıcıların %95 i zaten benim atadığım bölgesel ayarları kullanıyorlar.
Cevapla