Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno "Numeric value out of range." (Sybase SQL Anywhere 5.5)

Po spustení databázovej procedúry (alebo ako to nazvať) cez program písaný v Delphi 2007 mi vyskočí chyba:

Project *.exe raised exception class EOleException with message '[Sybase][ODBC driver]Numeric value out of range: value 808335409 out of range for destination'.

Vždy mi vypíše chybu s tou istou hodnotou, pritom údaje, ktoré vkladám do databázy sú VŽDY iné!

Nechcem tú dávať tých 150 riadkov zdrojového kódu v Delphi a zdrojový kód tej procedúry, preto mi určite presne neporadíte, kde je chyba. Len chcem vedieť, kedy sa táto chyba vyskytuje, pretože na Googli som toho veľa nenašiel. :-/

Předmět Autor Datum
A jak ti mame poradit bez znalosti toho, co delas? Ma sybase nejaky profiller, abys byl schopny zach…
Jan Fiala 28.07.2008 14:43
Jan Fiala
V databáze je niekoľko tabuliek. V programe pozbieram dáta asi z troch rôznych tabuliek + z údajov z…
gorgeous007 28.07.2008 15:09
gorgeous007
Muj tip je, ze pri predavani dat z delphi do databaze tam posilas uplne jinou (nenaplnenou) promenno…
P.D. 28.07.2008 14:55
P.D.
Môže to byť tým, že tam posielam toto(??): Parameters[20].Value := Doby[1]; Je pole len ukazovate…
gorgeous007 28.07.2008 15:11
gorgeous007
No pokud mas nekde nad timto radkem neo typu Doby[1]:=80 a do db predavas Parameters[20].Value a…
P.D. 28.07.2008 15:31
P.D.
Na programovani je nejzajimavjejsi hledani vlastnich chyb... Hlavne, keď mám do termínu urobenia to…
gorgeous007 28.07.2008 15:54
gorgeous007
Tak mám tu hodiť 300 riadkov zdrojáku v Delphi (je to len čisto to, čo vkladá do databázy), tú datab…
gorgeous007 28.07.2008 15:18
gorgeous007
to dej na uloz.to v textovém souboru s příponou .txt ]:)
marekdrtic 28.07.2008 15:50
marekdrtic
Tak už som to všetko dal na Problem.txt Dal som tam celú procedúru Vklad, ktorú potom 2-krát využív…
gorgeous007 28.07.2008 16:12
gorgeous007
A jsi si jisty, ze vsechny polozky pole Doby[] jsou naplnene? V tom cyklu je ruzne preskakujes. Zji…
Jan Fiala 28.07.2008 16:26
Jan Fiala
Aha, díky. Ja som tam všade mal premennú i, potom som ten cyklus celý prepisoval a zamenil som aj to…
gorgeous007 28.07.2008 16:28
gorgeous007
Ak je problém vo volaní uloženej procedúry (a nie je k dispozícii nejaký profiler), tak by som na tv…
los 28.07.2008 16:22
los
Díky, idem skúsiť. ;-) Síce mi to zaberie množstvo času, ale lepšie ako hľadať na Googli niečo, čo m…
gorgeous007 28.07.2008 16:26
gorgeous007
Tak problém je vyriešený. Díky všetkým, ale hlavne autorovi PSPadu, ktorý to s Delphi naozaj umí. ;-… poslední
gorgeous007 28.07.2008 16:35
gorgeous007

V databáze je niekoľko tabuliek. V programe pozbieram dáta asi z troch rôznych tabuliek + z údajov zadaných do formulára a pošlem ich ako 46 parametrov procedúre (v databáze), ktorá ich len vloží do jednej tabuľky, ktorá má presne 46 stĺpcov. Robím to tak preto, lebo Delphi mi akosi nechce pracovať s takým dlhým reťazcom, keď na to chcem použiť komponent ADOCommandText (INSERT INTO ...).

Mám k tomu len aplikáciu Sybase Central, v ktorej sa dá prezerať celá "konštrukcia" databázy.

Inak keď mi vypíše tú chybu, označí mi riadok s príkazom ExecProc, čiže chyba je niekde v databáze, resp. vykonávaní tej procedúry.

Muj tip je, ze pri predavani dat z delphi do databaze tam posilas uplne jinou (nenaplnenou) promennou nebo jen ukazatel na pametove misto s promennou. To by vysvetlovalo, proc to ma porad stejnou hodnotu... a ta je mimochodem vyssi, nez co se tam da narvat. Ale bez zdrojaku Ti asi nikdo vic neporadi... :-)

No pokud mas nekde nad timto radkem neo typu

Doby[1]:=80

a do db predavas

Parameters[20].Value

a ne

Parameters[20]

, tak to mas relativne dobre. Poslat sem cely zdrojak, tak Te asi admin kuchne a navic nevim, kdo by se tim prokousaval. Na programovani je nejzajimavjejsi hledani vlastnich chyb...

Tak už som to všetko dal na Problem.txt

Dal som tam celú procedúru Vklad, ktorú potom 2-krát využívam v programe. Dal som ju tam celú hlavne, aby ste sa mohli pozrieť na deklarácie premenných. Potom sa mrknite hlavne za poznámku // Pre Crystal Reports, pretože kód pred ňou bezproblémovo funguje a robí, čo má.

Inak procedúra frmZaklad.NacitanieSQL robí toto:

procedure TfrmZaklad.NacitanieSQL(Prikaz: String);
  begin
    with DataModule1.ADOQuery do begin
      SQL.Clear;
      SQL.Add(Prikaz);
      Active := true;
    end;
  end;

Ďalej procedúra frmZaklad.VykonanieSQL robí toto:

procedure TfrmZaklad.VykonanieSQL(Prikaz: String); 
  begin
    with DataModule1.ADOCommand do begin
      CommandText := Prikaz;
      Execute;
    end;
  end;

A nakoniec funkcia frmZaklad.BodkaNaCiarku robí toto:

function TfrmZaklad.BodkaNaCiarku(C: String): Currency;
  var
    i: Integer;
  begin
    for i := 1 to Length(C) do begin
      if (C[i] = '.') then C[i] := ',';
    end;
    BodkaNaCiarku := StrToCurr(C);
  end;

Môžete mi z toho zdrojáku poradiť? ... :-/

Ak je problém vo volaní uloženej procedúry (a nie je k dispozícii nejaký profiler), tak by som na tvojom mieste postupoval nejako takto:

- Zmenil by som telo uloženej procedúry tak, aby nerobila vôbec nič (napríklad namiesto INSERT INTO t(c1,c2) VALUES (?,?) by som dal SELECT ? AS c1,? AS c2). Ak by to stále padalo, tak by som postupne odstraňoval parametre procedúry - až kým by to neprestalo padať.

- V prípade, že by to po zrušení tela procedúry začalo fungovať, tak by som postupne menil procedúru tak, aby namiesto parametrov vkladala nejaké konštanty, ktoré určite ide do tabuľky vložiť - až kým by to neprestalo padať.

Ďalší postup by závisel od dátového typu problémového parametra a hodnoty, s ktorou sa procedúra volá.

PS: Zdrojový kód som zatiaľ nepozeral.

Zpět do poradny Odpovědět na původní otázku Nahoru