Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako upisati decimalne brojeve u SQL bazu?

[es] :: .NET :: .NET Desktop razvoj :: Kako upisati decimalne brojeve u SQL bazu?

[ Pregleda: 3043 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Kako upisati decimalne brojeve u SQL bazu?19.08.2011. u 13:04 - pre 154 meseci
Imate li iskustva sa pamcenjem decimalnih vrijednosti u SQL bazu?
Da budem precizan: ne pitam koji SQL tip koristite za pamcenje decimalnih vrijednosti (decimal, float).
Pitam: kako upisati decimalne brojeve, koje je korisnik unio, a koji imaju 'zapetu', kao decimalni delimiter?
Znaci, korisnik je unio '23,77' ili '333,88' - koriscenjem INSERT naredbe ovo nece proci, jer je 'zapeta' istovremeno i delimiter u INSERT komandi (SQL Server 2008 javlja gresku: 'Error converting data type varchar to numeric'). Ovo se rjesava tako (barem sam ja, do sada, tako rjesavao) sto se u Control Panel-u podesi da je digitalni delimiter 'tacka'. Znaci, korisnicki unos tipa: '23.77' ili '333.88', se bez problema upisuje u bazu koriscenjem naredbe INSERT.
Sve sto sam do sada radio bilo je za 'domace trziste' i lako bih 'ubijedio' korisnika da prihvati tacku, kao decimalni delimiter, umjesto zapete.

E sad, razvijam jednu aplikaciju, kojom ce se sluziti (trenutno) korisnici na dva kontinenta, sto znaci: razliciti jezicki interfejsi, raznorazna Regionalna i ina podesenja, korisnike (mozda) i bez nekih vecih znanja o racunarima itd ... u prevodu, htio bih da ovaj dio, oko unosa decimalnih brojeva, ne bude zavistan od podesenja u Control Panel-u (ako je moguce)?

Dakle, moje pitanje glasi: da li je, i kako, moguce upisati podatak u SQL bazu, ako podatak sadrzi zapetu(e) ? Znaci, kako upisati, INSERT komandom, podatke tipa: '23,77', 'A,B,C', '333,88', ... dakle bilo sto, sto sadrzi zapetu(e) ?
Ako je odgovor odrecan, sta da radim: da kontrolisem svaki decimalni unos (u kodu) i ako sadrzi zapete, da ih konvertuejm u tacke? A kod ucitavanja i prikazivanja korisniku, da ih konvertujem iz tacaka u zapete? Da li postoji neko rjesenje kod samog SQL servera ?

Hvala unaprijed na odgovoru ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

Dusan Kondic
Programer
ZR "Parametar" Ljubovija
Ljubovija

Član broj: 49961
Poruke: 225
*.adsl-a-3.sezampro.rs.

Sajt: www.drinacoding.com


+14 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?19.08.2011. u 13:43 - pre 154 meseci
Lakše bi bilo da radiš sa "Stored" procedurama jer onda parametrima direktno dodeljuješ vrednosti tipa decimal.
Za slučaj da SQL komande kreiraš dinamički, predlažem da napraviš sopstvenu TextBox kontrolu za decimalne brojeve (npr.TextBoxDecimal). Ova kontrola bi bila nasleđena od TextBox kontrole a dodao bi joj property koji će uvek da ti vrati vrednost sa tačkom
Code:

public string TextDot
{
get { return TextBox.Text.Replace(",", "."); }
}

Na ovaj način ne moraš uvek da gledaš kako je ukucan broj, već prilikom kreiranja komande kucaš npr.: "INSERT INTO Nesto VALUES(" + MojTextBox.TextDot + ")"
Dodatno, kontroli bi mogao da dodaš filter koji bi odbijao neodgovarajuće ukucane znakove (slova ...).
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
*.dynamic.isp.telekom.rs.



+104 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?19.08.2011. u 13:45 - pre 154 meseci
Najbolje rešenje je da koristiš parametre u upitu
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?19.08.2011. u 14:45 - pre 154 meseci
Citat:
vujkev: Najbolje rešenje je da koristiš parametre u upitu

Citat:
Dusan Kondic: Lakše bi bilo da radiš sa "Stored" procedurama jer onda parametrima direktno dodeljuješ vrednosti tipa decimal.
Za slučaj da SQL komande kreiraš dinamički, predlažem da napraviš sopstvenu TextBox kontrolu za decimalne brojeve (npr.TextBoxDecimal). Ova kontrola bi bila nasleđena od TextBox kontrole a dodao bi joj property koji će uvek da ti vrati vrednost sa tačkom
Code:

public string TextDot
{
get { return TextBox.Text.Replace(",", "."); }
}

Na ovaj način ne moraš uvek da gledaš kako je ukucan broj, već prilikom kreiranja komande kucaš npr.: "INSERT INTO Nesto VALUES(" + MojTextBox.TextDot + ")"
Dodatno, kontroli bi mogao da dodaš filter koji bi odbijao neodgovarajuće ukucane znakove (slova ...).


Hvala obojici na brzom odgovoru ...

Za Dusana:
Podaci se ucitavaju iz dataGridView-a. Ako filtriram podatke (prilikom upisa), tako sto cu zapetu da zamijenim sa tackom, sta da uradim kod prikaza podataka (prilikom ucitavanja iz baze): da vratim tacku u zapetu (cisto razmisljam, sta ako je korisniku, koji nije unosio podatke, decimalni separator bas tacka, a ne zapeta)? Vjerovatno je ovo previse da pitam - moracu sam da razmislim ...

Inace, kad god mogu, uvijek koristim uskladistene procedure. Ali, koliko ja znam, njima ne mogu da upisem (ili, barem ja ne znam), da tako kazem, nizove komandi: kad imam situaciju upisa jedan-prema-vise, ili kad treba , kao ovdje, upisati nekoliko rekorda (iscitanih iz, kao sto rekoh, dataGridView-a) ... negdje proljetos sam pokusavao da to rijesim, neko mi je sa ovog foruma dao predlog, da se komanda razbije preko delimitera i tretira kao tabela itd ... ali, da budem posten, nisam uspio da to odradim, tako da u ovom slucaju, dinamicki kreiram SQL komandu ...

A pokusacu i preko parametara - hvala za 'vujkev' ...

Pozdrav
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?19.08.2011. u 14:58 - pre 154 meseci
Bicu slobodan da iskoristim priliku da jos nesto pitam: u okviru ove kontrole, korisnik unosi neke vrijednosti i kontroli dataGridView i u kontroli textBox.

U dataGridView-u, izmedju ostalih, unose se neke decimalne vrijednost, recimo kolone: A, B i C, a na onsovu njih se, recimo, racuna vrijednost kolone D: A x B x C (nebitno).

Sto sam primijetio: da ovo mnozenje (za vrijednost kolone D), da tako kazem, 'prati' setovanja iz Regional Settings (u Control Panel-u): ako je u Regional Settings podeseno da je decimalni delimiter, recimo, zapeta, onda korisnik mora da unese decimalne brojeve sa zapetom , da bi u koloni D dobio korektan rezultat. Recimo, ako unese decimalne vrijednosti sa tackom, nece dobiti korektan rezultat mnozenja, za vrijednost kolone D. Naravno, i obrnuto: ako je u Regional Settings podesena tacka, kao decimalni delimiter, korisnik mora da, u polja dataGridView-a, unosi vrijednosti sa tackom, da bi dobio tacan rezultat mnozenja.

Kako da prevazidjem setovanja iz Regional Settings-a? I da li da ih, uopste, prevazilazim, odnosno, da handlujem odgovarajuci dogadjaj iz daatGridView-a i zapete mijenjam tackama (kao sto je Dusan predlozio) ?
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
82.117.199.*

Sajt: www.dcaric.com


+26 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?19.08.2011. u 15:17 - pre 154 meseci
Pogledaj CurrentCulture:
http://msdn.microsoft.com/en-us/library/syy068tk.aspx
 
Odgovor na temu

Dusan Kondic
Programer
ZR "Parametar" Ljubovija
Ljubovija

Član broj: 49961
Poruke: 225
*.adsl-a-3.sezampro.rs.

Sajt: www.drinacoding.com


+14 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?19.08.2011. u 15:40 - pre 154 meseci
Dejan ti je dao dobar link. Proveri samo da li pored CurrentCulture tekućeg Thread-a treba da podesiš i CurrentUICulture (postupak je identičan).
Za izvršavanje više komandi u odjednom evo jedne ideje.
Code:

        public static void IzvrsiKomandeIzListe(List<SqlCommand> CmdList)
        {
            try
            {
                cn.Open();
                for (i = 0; i < CmdList.Count; i++)
                {
                    CmdList[i].ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show("Došlo je do greške prilikom izvršavanja komande. " + ex.ToString());
            }
            finally
            {
                cn.Close();
            }
        }

Na primer, u for petlji kreiraš komande (ista procedura sa različitim parametrima) i ubacuješ ih u listu. Na kraju izvršiš ovu proceduru iznad prosleđujući joj kreirani niz. Dodatna prednost je ta što se konekcija otvara i zatvara samo jednom.
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?22.08.2011. u 08:53 - pre 154 meseci


Moram da priznam da nisam razumio kako da iskoristim informacije sa ovog linka, u cilju rjesavanja problema koji imam?

Recimo, pronasao sam klasu: NumberFormatInfo, preko koje mogu saznati informacije o formatu numerika (brojeva), u zavisnosti od kulture. Ako sam dobro razumio ono sto pise uz ovu klasu (http://msdn.microsoft.com/en-U...erformatinfo%28v=VS.80%29.aspx), moguce je i 'override'-ovati tekuca podesenja. Da li to znaci da ja mogu (nisam probao) promijeniti property-je, koji se odnose na format numerika (recimo, setovati da je decimalni simbol tacka, a ne zapeta)?

Ako je to svrha primjene ove klase (ili CurrentCulture i slicnih klasa), da li je, ipak, jednostavnije da filtriram korisnicki unos (kao sto je predlozio Dusan Kondic)?

Jos jednom, nisam shvatio sta je ideja primjene CurrentCulture, vezano za moj problem, da ga tako nazovem, tacaka i zapeta, odnosno, prikaza decimalnih brojeva ... ako moze mala pomoc, bio bih zahvalan ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?22.08.2011. u 09:31 - pre 154 meseci


Evo, sada sam probao i ustanovio da aplikacija uvijek 'prati' podesenja iz 'Regional and Language Options'.

Inace, zaboravio sam da napisem, na pocetku rada aplikacije, kada se korisnik loguje, iz baze se cita koji je njegov jezik (trenutno, srpski ili engleski) i setuje se 'CultureInfo', recimo:

private static CultureInfo kultura; // za rad sa kulturama u c#

...
if (logovaniKorisnik.Jezik == "Srpski")
kultura = CultureInfo.CreateSpecificCulture("sr-Latn-CS"); // srpski jezik
else
if (logovaniKorisnik.Jezik == "Engleski")
kultura = CultureInfo.CreateSpecificCulture("en-US"); // engleski jezik
...

Ovo mi sluzi da definisem jezik za UI (koristim .res fajlove i ResourceManager).

Recimo, probao sam da 'srpskom' korisniku dodijelim 'en-US' kulturu, ali kao sto rekoh 'starija' su podesenja iz 'Regional and Language Options' ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?22.08.2011. u 10:30 - pre 154 meseci
Evo sto sam ustanovio u vezi formata decimalnih brojeva:

1. prilikom logovanja korisnika se podesi (recimo da se radi o srpskom korisniku):
CultureInfo kultura = CultureInfo.CreateSpecificCulture("sr-Latn-CS");

2. ako u Control Panel-u (Regional and language Options) podesim 'zapetu', kao decimalni simbol, i unesem decimalne brojeve, recimo: '2,3' i '3,4', onda dobijem tacan rezultat (7,82),

3. ako u Control Panel-u (Regional and language Options) podesim 'zapetu', kao decimalni simbol, i unesem decimalne brojeve, recimo: '2.3' i '3.4', onda dobijem netacan rezultat (782),

4. ako u Control Panel-u (Regional and language Options) podesim 'tacku', kao decimalni simbol, i unesem decimalne brojeve, recimo: '2.3' i '3.4', onda dobijem tacan rezultat (7.82),

5. ako u Control Panel-u (Regional and language Options) podesim 'tacku', kao decimalni simbol, i unesem decimalne brojeve, recimo: '2,3' i '3,4', onda dobijem exception (kod poziva metoda: Convert.ToDouble): 'Input string was not in a correct format'.


Moze li neko da mi objasni zasto dobijam ovaj exception u slucaju 5., a ne dobijam ga u slucaju 3. ?

Mislim da mi je najjednostavnije da na UI ne 'diram' nista (ne uticem na format decimalnih brojeva, onako kako ih korisnik unosi), a da prije unosa u bazu, filtriram decimalne unose, tako sto cu zapetu zamijeniti sa tackom ... a pravo rjesenje je primjena parametara ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
82.117.199.*

Sajt: www.dcaric.com


+26 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?22.08.2011. u 12:10 - pre 154 meseci
CurrentCulture trebaš da settuješ na CurrentThread.
Evo primer:
Code:
decimal d = 12345.548m;
            
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("sr-Latn-CS");
Console.WriteLine(d.ToString());
            
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
Console.Write(d.ToString());

Console.ReadLine();

output:
Code:
12345,548
12345.548

 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?22.08.2011. u 14:14 - pre 154 meseci
Citat:
Dusan Kondic
Za izvršavanje više komandi u odjednom evo jedne ideje.
Code:

        public static void IzvrsiKomandeIzListe(List<SqlCommand> CmdList)
        {
            try
            {
                cn.Open();
                for (i = 0; i < CmdList.Count; i++)
                {
                    CmdList[i].ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show("Došlo je do greške prilikom izvršavanja komande. " + ex.ToString());
            }
            finally
            {
                cn.Close();
            }
        }

Na primer, u for petlji kreiraš komande (ista procedura sa različitim parametrima) i ubacuješ ih u listu. Na kraju izvršiš ovu proceduru iznad prosleđujući joj kreirani niz. Dodatna prednost je ta što se konekcija otvara i zatvara samo jednom.


Dusane,
hvala ti na ideji.
Realizovao sam upis u bazu primjenom sqlparametara i liste komandi.
U doticnoj funkcionalnosti, korisnik unosi podatke u nekom gridu (znaci, radi se o istovremenom upisu vise rekorda), pa sam htio/ne htio, morao da primijenim rjesenje sa listom sqlkomandi (jer se ime sqlparametra ne smije 'duplirati' - a kao sto rekoh, imam upis vise rekorda, sto znaci formiranje sqlkomande u foreach petlji). Znaci, kreirao sam listu sqlkomandi, koju dinamicki popunjavam u foreach petlji,a koja cita grid (i korisnicki unos). Samo sam dodao, u odnosu na kod koji si predlozio, sqltransakciju, s tim da je poziv Commit metoda iza for petlje (u tvom primjeru), u try bloku, a poziv RollBack metoda u catch bloku.

Time sam rijesio upis podataka u sql bazu, u slucaju da podaci sadrze 'zapete' ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Re: Kako upisati decimalne brojeve u SQL bazu?23.08.2011. u 09:07 - pre 154 meseci
Samo da javim kako sam rijesio problem kontrole unosa brojeva u pravilnom formatu - mozda nekome bude od koristi ...

Ja sam ovaj problem rijesio primjenom odgovarajuce verzije metoda: Double.Parse (ja radim u C#-u). Poenta je da ovom metodu proslijedite odgovarajucu vrijednost za 'NumberStyles'. Ja sam to rijesio ovako:

- prilikom logovanja korisnika (to vazi za apliakciju na kojoj radim), ucitaju se iz baze njegova (prethodno unesena) podesenja i podesi se vrijednost za 'CultureInfo', na sledeci nacin:

private static CultureInfo kultura; // za rad sa kulturama u c#
public static NumberFormatInfo infoFormatBrojeva; // format brojeva - VAZNO: prati setovanja iz ControlPanel-a (Regional and Language Settings)
// podaci o ulogovanom korisniku - setuju se u: Prijava.cs
public static Korisnik logovaniKorisnik = new Korisnik();
// setuje jezik, u zavisnosti od logovanog korisnika
public static void podesiJezik(Korisnik logovaniKorisnik)
{
if (logovaniKorisnik.Jezik == "Srpski")
kultura = CultureInfo.CreateSpecificCulture("sr-Latn-CS"); // srpski jezik
else
if (logovaniKorisnik.Jezik == "Engleski")
kultura = CultureInfo.CreateSpecificCulture("en-US"); // engleski jezik
infoFormatBrojeva = CultureInfo.CurrentCulture.NumberFormat; // format brojeva za izabrani jezik ...
}
U 'infoFormatBrojeva' se nalaze zapisi o svim podesenjima, koja se odnose na format brojeva (izmedju ostalog i na decimalni separator. Konkretno, taj 'property' se zove: 'NumberDecimalSeparator').

- jos treba da pozovete metod: Double.Parse (kada konvertujete 'string' u 'double'), na sledeci nacin (ovo je isjecak iz jedne aplikacije):

if (dataGridViewMaterials.Rows[indeks].Cells["Length"].Value != null)
if (dataGridViewMaterials.Rows[indeks].Cells["Length"].Value.ToString().Length != 0)
try
{
length = Double.Parse(dataGridViewMaterials.Rows[indeks].Cells["Length"].Value.ToString(), NumberStyles.Float);
}
catch (FormatException fExc)
{
MessageBox.Show("Niste unijeli broj u odgovarajucem formatu !", "GRESKA ...");
}
Na ovaj nacin cete 'uhvatiti' sve 'pogresne' unose, kao sto su slova, pogresno unesen decimalni separator i slicno ...

Hvala svima na pomoci i pozdrav ...
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Kako upisati decimalne brojeve u SQL bazu?

[ Pregleda: 3043 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.