Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Parametrik sorgu
#1
Merhabalar,
Firebirdde 

Select * from cari where ad=:cad

gibi bir parametrik sorguda eger parametre degerini alan boyut tanimindan fazla verirsem hata donduruyor.

ayni sorguyu

Select * from cari where ad='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

seklinde yapsam boyut tanımından fazla bile olsa sorun cikarmiyor. 

Bu normal midir acaba?
Cevapla
#2
Verdiği hata nedir?
Cevapla
#3
(18-12-2018, Saat: 11:34)forumcuali Adlı Kullanıcıdan Alıntı: Verdiği hata nedir?

Verdigi hata. Hata boyutla alakali. Alan boyutundan kucuk deger verirsem sorgu parametresine hata vermiyor.
Alıntı:Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.
Cevapla
#4
(18-12-2018, Saat: 11:37)klavye Adlı Kullanıcıdan Alıntı:
(18-12-2018, Saat: 11:34)forumcuali Adlı Kullanıcıdan Alıntı: Verdiği hata nedir?

Verdigi hata. Hata boyutla alakali. Alan boyutundan kucuk deger verirsem sorgu parametresine hata vermiyor.
Alıntı:Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.

Burda hatanın kaynaklanma sebebini yazmışlar

http://www.firebirdfaq.org/faq79/

kısaca demiş ki:

1- sıfıra bölme hatası olablir
2- Hesaplama sonucuna uymayayan bir data tip tanımlanmış olabilir
3-birleştirilmiş stringlerin data büyüklüğünü aştığında olabilir
4- okunan datanın çevriminde bir hata olabilr.( Seçtiiniz karakter setine uymayan bir karakter olabilir. bu karakterleri çevrim komutları ile çevirmelisiniz)
5- dotnetfirebird kullanıyorsan yanlış sırada parametre gönderimiş olabilirsin demiş

daha ayrıntı için linke bakabilirsin


Kutsal Site stackowerflow'da ise firebirdini 2.5.1 'e update et orda bu sorunu çözdüler demiş (2012 de )

https://stackoverflow.com/questions/1128...truncation
Cevapla
#5
Gayet normal bir hata. Ben yazmış olsam bende hata verdiririm. Sorguda eşitliğe parametre ataması yapıyorsunuz, doğal olarak hangi alanı aramak isterseniz o alanın tipinde ve boyutunda veri girmenizi bekliyor, siz ad varchar(20) olarak tanıtırsanız :cad değişkenini de otomatik olarak varchar(20) olarak görüyor, buna gidip 25 karakterli bir değer girerseniz veri büyüklüğünü aşarsınız ve bu hatayı alırsınız.
WWW
Cevapla
#6
(18-12-2018, Saat: 13:21)esistem Adlı Kullanıcıdan Alıntı: Gayet normal bir hata. Ben yazmış olsam bende hata verdiririm. Sorguda eşitliğe parametre ataması yapıyorsunuz, doğal olarak hangi alanı aramak isterseniz o alanın tipinde ve boyutunda veri girmenizi bekliyor, siz ad varchar(20) olarak tanıtırsanız :cad değişkenini de otomatik olarak varchar(20) olarak görüyor, buna gidip 25 karakterli bir değer girerseniz veri büyüklüğünü aşarsınız ve bu hatayı alırsınız.

 Teşekkür ederim @esistem değer girince bu hatayi vermesi normal ama ben deger girmiyorum. select ile veri cekecegim sorgunun kosuluna deger gonderiyorum.
Farkli tipte olunca verebilir ama varchar  alana varchar veri yolluyorum.
ayrica adi='xxxxxxxxxxxx' bu da esitlik ama buna nekadar uzun girersem gireyim birsey demiyor.
Cevapla
#7
siz :cad olarak bir parametre belirtiyorsunuz ama içeride, formun üzerine bir query koyup sorguyu bu query içine yazarsanız göreceksiniz ki query nin params kısmında yazdığınız :cad parametresi tanımlanmış olacaktır dolayısı ile query bu parametre ile aranacak alanın tip olarak karşılaştırmasını yapacaktır, veritabanında ad alanı 20 byte tanıtılmış ise cad parametresinide otomatik 20 byte tanıyacaktır, siz dışarıdan bu parametreye 21 byte veri gönderdiğinizde alan taşması diye hata verecektir.

Tabi siz query içinde ad='xxxxx' şeklinde 21 byte veri girdiğinizde neden hata vermemesine bişey diyemem, orda tanımlı alanın boyutu kadar veriyi alıp karşılaştırma yapıyor olabilir kalan fazlalığı kaale almıyordur belkide o konud bilgim yok, fakat php de mesela ad varchar(10) diyorsunuz ama 20 byte gönderiyosunuz o gidip ilk 10 byte ını kaydediyor, belkide veritabanlarının (veya SQL in) ortak özelliğidir bişi diyemem ona.
WWW
Cevapla
#8
(18-12-2018, Saat: 14:42)esistem Adlı Kullanıcıdan Alıntı: siz :cad olarak bir parametre belirtiyorsunuz ama içeride, formun üzerine bir query koyup sorguyu bu query içine yazarsanız göreceksiniz ki query nin params kısmında yazdığınız :cad parametresi tanımlanmış olacaktır dolayısı ile query bu parametre ile aranacak alanın tip olarak karşılaştırmasını yapacaktır, veritabanında ad alanı 20 byte tanıtılmış ise cad parametresinide otomatik 20 byte tanıyacaktır, siz dışarıdan bu parametreye 21 byte veri gönderdiğinizde alan taşması diye hata verecektir.

Tabi siz query içinde ad='xxxxx' şeklinde 21 byte veri girdiğinizde neden hata vermemesine bişey diyemem, orda tanımlı alanın boyutu kadar veriyi alıp karşılaştırma yapıyor olabilir kalan fazlalığı kaale almıyordur belkide o konud bilgim yok, fakat php de mesela ad varchar(10) diyorsunuz ama 20 byte gönderiyosunuz o gidip ilk 10 byte ını kaydediyor, belkide veritabanlarının (veya SQL in) ortak özelliğidir bişi diyemem ona.

Sorun kendi programimda veya kullandigim bilesenlerde mi diye dusunup ibexpert ile denedim onda da ayni durum mevcut. Parametre olarak veri gonderirsem hata veriyor. ='xxx' seklinde yapinca sorun vermiyor.
Bu durumda parametre ile islem yaparken her bir sorguda alanlarin boyutlarinida kontrol etmek gerekecek bu durumda.
Kayit girislerde veri sınırını astiniz mi her sekilde hata veriyor.Bunda bir sorun yok.
Cevapla
#9
@klavye parametre gönderdiğinde exec işleminden önce pre control yapıyor ve excepiton throw ediyor. Yani parametreli gönderimlerde parameter check yapılıyor. Fakat diğerinde parametre göndermediğin için parameter check yapılmıyor.
İmam Süleyman Yakub <--> Molla Mustafa Mansur
Evlatlarım!
Cismanımız TÜRK ruhumuz ise İSLAM.
Bu yolda daim olalım her an.
Cevapla
#10
(18-12-2018, Saat: 15:06)ahmet_sinav Adlı Kullanıcıdan Alıntı: @klavye parametre gönderdiğinde exec işleminden önce pre control yapıyor ve excepiton throw ediyor. Yani parametreli gönderimlerde parameter check yapılıyor. Fakat diğerinde parametre göndermediğin için parameter check yapılmıyor.

Anladim. O zaman parametre kullanirken dikkatli olmak gerekecek. her sorgudan once alan boyut kontrolu  de yapmak gerekecek. 
Teşekkürler.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Thumbs Up iki tablodan iç içe sorgu problemi (sorun çözüldü) baloglurecep 16 9.175 16-04-2020, Saat: 02:04
Son Yorum: pro_imaj
  Firebird Pivot Sorgu klavye 6 5.982 14-08-2018, Saat: 22:39
Son Yorum: anemos



Konuyu Okuyanlar: 1 Ziyaretçi