Insert i decimal

Odpowiedz Nowy wątek
2008-01-17 23:40

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

Witam
Mam taki problem. Chce dodac nowy rekord do bazy SQL. I wszystko bylo by ok gdyby nie to, ze wartosci DECIMAL wstawia mi z przecinkiem.

decimal nr=10.12;
decimal nrt=100.11;

string zap = "execute dodaj "+nr+","+nrt;
SqlCommand adapter = new SqlCommand(zap, objConn);
objConn.Open();
int wynik = adapter.ExecuteNonQuery();

I szlag mnie trafia, bo przy debagowaniu zap wyglada tak:
"execute dodaj 10,12,100,11"

Oczywiscie, MS SQL wrzeszczy, ze jest za duzo argumentow, ba zamiast kropki sa wstawiane przecinki !
Jak to rozgryzc ?

Pozostało 580 znaków

2008-01-18 07:41

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Wykonaj procedure tak jakby byla procedura, a .net sam sie zajmie przetlumaczeniem tego na 'sql serverowy' ;), np.:


SqlCommand command = new SqlCommand("dodaj", conn);
command.CommandType = SqlTypes.StoredProcedure;
command.parameters.AddWithValue("@nazwa_pierwszego_parametru", wartosc_liczbowa);
command.ExecuteNonQuery();



gdzie @nazwa_pierwszego_parametru musi byc taka jak w samej procedurze w sqlu.
A jak wolisz jednak stringiem (tak jak teraz) to dodawaj apostrofy naokolo parametru. Ale powyzsza metoda jest latwiejsza, jesli masz do czynienia np. z datami, bo nie zajmujesz sie ich konwersja.

You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-01-18 10:06

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

Dzieki za pomoc!

A co do apostrofow, to niestety to nie dziala z Decimal. Wtedy SQL zwraca info. , ze nie mozna zamieniac wartosci typu varchar na numeric. No ale pierwszy przyklad, dziala jak nalezy :)

Pozostało 580 znaków

2008-01-18 10:15

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Z apostrofami musialbys jeszcze dodac w sql cast('string' as numeric), ale to jest mniej wiecej to co robi za Ciebie wywolanie z parametrami jako procedury skladowanej.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-01-18 10:24

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

Ok, rozumiem

No to jeszcze jedno pytanko. Wywolujac procedure "dodaj", dodaje w ten sposob nowy rekord.
W tej procedurze po komendzie insert mam tez dodane zapytanie "select max(id) from tabela".
Czy jest jakas mozliwosc aby po wykonaniu command.ExecuteNonQuery(), odczytac wartosc wykonanego zapytania ?

Pozostało 580 znaków

2008-01-18 10:51

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Nie, wykonaj executeReader, jesli chcesz odczytac dane. Ewentualnie zmien procedure tak, by przyjmowala parametr wyjsciowy (out), podaj go w wywolaniu i odczytaj pozniej jego wartosc. Skoro i tak odczytujesz tylko jedna wartosc to otwieranie readera, czytanie calego wiersza, zamykanie wydaje sie byc sztuka dla sztuki ;) Ja bym zrobil z parametrem.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-01-18 11:18

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

No ok

ale cos jest nie tak. Cala procedura wyglada tak:

zap = "execute doda @stcena,@idbaza";
SqlCommand adapter = new SqlCommand(zap, objConn);
SqlParameter param1 = new SqlParameter("@stcena", System.Data.SqlDbType.Decimal);
param1.Value = 10.10;
adapter.Parameters.Add(param1);
SqlParameter param2 = new SqlParameter("@idbaza", System.Data.SqlDbType.Int);
param2.Value = 0;
adapter.Parameters.Add(param2);
objConn.Open();
int wynik = adapter.ExecuteNonQuery();
int idbaza = Convert.ToInt16(param2.Value.ToString());

a po stronie serwera wyglada to tak:

CREATE PROCEDURE dodaj
@cena numeric(10,2),
@idbaza int
as
insert into tabela @cena
set @idbaza=(select max(id_baza) from tabela)

i niestety wartosc zwrotna wynosi 0, chociaz powinna byc zalozmy 10.
Czy cos zle robie? Pewnie tak skoro wraca mi 0, tylko co jest nie tak?

Pozostało 580 znaków

2008-01-18 12:46

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0
  1. Zle przeczytales poprzedni przyklad i dodajesz sobie pracy

    • zwroc uwage na tresc komendy w moim przykladzie
    • CommandType.StoredProcedure
  2. Jesli zrobisz tak jak zrobilem w pierwszym przykladzie to bedziesz mogl wykorzystac parametr zwrotny (bo wtedy .net bedzie wiedzial, ze to w ogole procedura skladowana, a nie jakies tam zapytanie).

  3. parametr w procedurze powinien miec modyfikator out, zeby sql wiedzial, ze ma go zwrocic. To samo tyczy sie (chyba, o ile mnie pamiec nie myli) parametru dodawanego w kodzie.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-01-18 12:59

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

No i teraz zadzialalo :)
Ale wcale mi sie to nie podoba :/
Ta procedura dodaje wiecej niz jedna zmienna (jest ich 12), i teraz wychodzi na to, ze bede musial az 12 razy tworzyc deklarace parametrow, a potem kolejno je dodawac :/
Nie mowiac juz o deklaracji zwrotu wartosci z bazy.

Czy nie ma jakiegos krotszego rozwiazania?
W VFP wystarczy doslownie jedna linijka aby dodac cos do bazy,i druga linijka aby odczytac wartosci zwrotne, a tutaj zajmie to jakies 40 razy wiecej miejsca!

Pozostało 580 znaków

2008-01-18 13:11

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

No bo przekombinowales. Jak sobie rzucisz okiem na moj kod to zauwazysz, ze dodanie parametru zajelo mi dokladnie jedna linijke - a Tobie 3.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-01-18 13:40

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

Masz racje.
Teraz zrobilem to dokladnie tak samo jak ty, ale nadal cala procedura zajmuje sporo miejsca :/

Szkoda, ze nie ma mozliwosci skrocenia tego kodu :/

Alec coz.... przynajmniej dobrze, ze dziala :)

Dzieki za pomoc!

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0