C#/MySQL decimal symbol probléma
2014-02-18T14:02:47+01:00
2014-02-20T14:30:40+01:00
2022-07-22T23:42:42+02:00
  • Értem! Működik is Hát nagyon szépen köszönöm a segítséged,türelmed! Sok mindent tanultam az elmúlt napokbanJövök egy sörrel
    Tiszteletem!!!
    Mutasd a teljes hozzászólást!
  • Na de az UPDATE-et miért nem paraméterekkel csinálod, ugyanúgy, mint a beszúrást? Miért string-et formázgatsz?

    command_insert.Parameters.AddWithValue("@Iznos", value2);

    Egy double-t vagy egy decimal-t sose adj át string-ként, kizárólag típusbiztosan.

    Ráadásul ez a gyakorlat:

    "UPDATE table SET Amount = '" + update_amount +"'

    egyenes forrása lehet az SQL injection-nak. Mindig használj paramétereket!
    Mutasd a teljes hozzászólást!
  • Na most minden működik szépen! Váltogathatom a területi beállitás és a textbox-ba is olyan symbolum kerül ami a területi beállitásban meg van adva.
    Viszont az UPDATE-el problémáim vannak! Ha egy értéket UPDATE-ni akarok akkor a "," szimbólumot figyelmen kivül hagyja és az 500,2 neki 5002 lesz.
    "UPDATE table SET Amount =  '" + update_amount +"'
    Ha itt string-re alakítom a változót és raplace-zem "."-ra akkor jól müködik.
    Mutasd a teljes hozzászólást!
  • Értek mindent amit mondasz! Használom a dante által leírtakat. Ellenőrzőm hogy mi a decimal symbol és azt engedem beírni! Működik! A probléma ott van hogy ha most én beirom az összeget pl 500,20 ( vessző a decimal symbol) akkor mint leírtam az adatbázisba valamiért nem jól viszi be az értéket mert 500,20 helyet 50020 van!
    double value2 = double.Parse(amount_textbox.Text, CultureInfo.InvariantCulture);
    command_insert.Parameters.AddWithValue("@Iznos", value2);
    Mutasd a teljes hozzászólást!
  • A területit átváltottam magyar-ra igy a symbol "," lett. A textbox-ba most "," irok és a parse-nál nem kell megadom CulterInfot-t.

    Ez remek, de így viszont - ezt is írtam már - olyan Windows-okon exception-t vagy egyéb hibát fogsz kapni, ahol nem vessző a szimbólum.

    Használd Dante javaslatát, azaz olvasd ki a rendszerből az aktuális szimbólumot és engedélyezd beíráskor a használatát!

    Ezt egy string replace-el oldottam meg

    Na, ez mindenképpen gányolás így. Mit keres string az adatbázis-kommunikációban? Ott már a kész double-t (decimal-t) kéne átadni paraméterként, nem string-eket, így ott nem is lehet probléma a szimbólum (hiszen az a típuson belül egyértelmű).

    Harmadszor írom: vedd külön a double (decimal) parse-olást az adatbázisba beszúrástól! Amikor az adatbázissal kommunikálsz, már a kész double (decimal) értéket kéne paraméterként átadnod. Semmilyen string-nek nem szabadna ott szerepelnie, amin Replace()-t tudsz futtatni!

    A gányolásnak az a legnagyobb hátránya, hogy bár látszólag működik, sokszor csak akkor derül ki, hogy gond van, amikor már éles adatokon használják a rendszert egy ideje. Légy tisztában azzal, hogy pontosan mit művel a programod!
    Mutasd a teljes hozzászólást!
  • Szia!
    Végül hajnalban sikerült megoldani a hibát! A területit átváltottam magyar-ra igy a symbol "," lett. A textbox-ba most "," irok és a parse-nál nem kell megadom CulterInfot-t. A baj csak az volt hogy az adatbázisba ","-vel vitte be az értékeket és igy törléskor " truncated incorrect double value" hibát kaptam. Ezt egy string replace-el oldottam meg ertek.ToString().Replace(',' , '.') .
    A decimal-ról szóló hozzászólásod sajnos nem olvastam de javitani fogom a hibát! Az adatbázisba való bevitelt is megváltoztattam már úgy ahogy leírtad! Igazság szerint most csak a törléssel volt gondom mivel "," vel irta be az értéket és az sql-nek ez nem tetszett de mint mondtam megoldottam. Nem zavart volna össze ez a parse dolog sem ha az angol területinél nem "," kellet volna beállitani. Hajnalban kicsit rápörögtem a dologra és minden világossá vált

    Szerk: Most azt nem tudom hogy ha decimal-ra váltok akkor a truncated incorrect double value hibaüzenet megmarad-e ha nem csinálok rajta string replace-t?! Na majd kipróbálom.
    Kösz még1x
    Mutasd a teljes hozzászólást!
  • Először is: írtam az előző téma végén, hogy az esetedben veszélyes lehet double-t használni összegek beírására, inkább decimal típust kéne használnod, mind a kódban, mind az adatbázisban, mert amikor összegzed majd a tranzakcióidat, eltérések lehetnek. Ezt olvastad?

    A továbbiakban ugyan double-ról fogok beszélni, de amikor sikerül működésre bírni, erősen ajánlott, hogy átdolgozd a kódod, hogy decimal típusokkal dolgozzon.

    Másodszor: az eredeti kódodban mindenáron egy lépésben akartad a konverziót megoldani.

    command_insert.Parameters.AddWithValue("@ertek",double.Parse(amount_textbox.Text));

    Már ott is írtam, hogy ez rossz gyakorlat: szedd külön a kódot, amely adatbázisba szúr be, és külön amely konvertál és validál. Valahogy így:

    command_insert.Parameters.AddWithValue("@ertek", myDouble);

    ahol a myDouble egy kész double típus. Így külön tudod választani, hogy már a konverziónál keletkezik a hiba vagy az adatbázisba beszúrásnál. Az adatbázis-kezelő résznél már a jó értéket kell, hogy megkapd!

    Kérdés: már a konverzió sem sikeres, vagy az rendben van és az adatbázisba írásnál van gond?

    Amennyiben a konverzió a gond: a beállításokat nem próbálgatni kéne, hanem meg kéne érteni, pontosan mi történik, és aszerint megírni a programodat. Ha követted az előző témában leírtakat, akkor területi beállításoktól függetlenül mindig helyesen kellett, hogy parse-olja a double-t.

    Tehát: ha a felhasználó pontot használhat decimal symbol-ként a TextBox-ban, és a Parse() metódust a CultureInfo.InvariantCulture paraméterrel hívod, akkor teljesen mindegy, mi van a területi beállításokban definiálva, mert mindenképpen a default, azaz az angol pont lesz a decimal symbol. Ez világos?

    De ha így oldod meg, akkor nem használhatsz mást, kizárólag pontot decimal symbol-ként, különben hibás lesz az eredmény! Viszont kaptál példát arra is, hogy mit kell, hogy tegyél, ha mondjuk vesszőt szeretnél decimal symbol-ként használni.

    Innen kezdve példakódot a helyes konverzióra találsz az előző témában, és neked kell kiderítened, hogy a programod melyik részén van bug.

    Ahogy már az előző hozzászólásban is utaltam rá, érdemes megnézni Dante kolléga kiegészítését, azaz TextBox-ba beíráskor a területi beállításoknak megfelelő decimal symbol-t hagyod beírni, nem hard code-olod a pontot vagy vesszőt vagy akármi mást.

    (szerkeszve)
    Mutasd a teljes hozzászólást!
  • Na hello!:) Örülök hogy te irtál!
    Hát ha jól tudom akkor a parse a területi beállitást veszi figyelembe! Az angolnál "." vár a magyarnál ","! Mint ahogy irtad is.
    A kérdésemet meg leírtam. A parse magyar területinél müködik de mint irtam az sql nem jól veszi be az értéket. Az angol is jól müködik addig még a symbolumot nem változtatom át ","-re! Amint megváltoztatom se a ","-vel beirt összeget se a pontal beírt összeget nem menti le és hibát ir! Próbálgattam a
    CultureInfo.InvariantCulture
    de az angol területinél az se vezet megoldásra. A területi beállitás megváltoztatnám én magyar-ra de akkor mit lehetne kezdeni a tizedes számokkal hogy jól vigye be?!
    Mutasd a teljes hozzászólást!
  • Világos, hogy a Parse() metódus mi alapján veszi figyelembe a decimal symbol-t?

    Ha nem, kérdezz, mit nem értesz!

    Ha igen, mi a kérdésed?

    (Plusz olvasd el az eredeti témánál Dante kiegészítését!)
    Mutasd a teljes hozzászólást!
  • Hello!
    Az előzményeket itt megtaláljátok: Előzmény

    Van egy program ami egy SQL szerverhez kapcsolódik. Van egy tranzakciókat végző ablak ahova beirjuk kinek és mennyi összeget küldünk. Eddig az összeg beirása úgy történt hogy a területi beállitásoknál az Angol(US) volt megadva "." decimal symbolum-mal és a textbox-ba is "." symbol került a tizedesek elválasztására. Most annyiban változott az egész hogy a területi beáll. maradt Angol(US) de a decimal symbol ","-re van beállitva és a programban is "," kell beirni a textbox-ba viszont ez igy már nem működik és "input string was not in a correct format" üzenetet kapok. A területi beállitásoknál beállitottam a magyart mivel ott a decimal symbol alapból "," és akkor nem kapok hibaüzenetet viszont az értéket nem jól viszi be az adatbázisba lásd: 500,20 helyet 50020,00 ir be.
    Előre is köszönöm a válaszokat!
    Mutasd a teljes hozzászólást!
abcd