Insert i decimal

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 ?

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.

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 :)

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.

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 ?

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.

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?

0
  1. Zle przeczytales poprzedni przyklad i dodajesz sobie pracy
  • zwroc uwage na tresc komendy w moim przykladzie
  • CommandType.StoredProcedure
  1. 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).

  2. 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.

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!

0

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

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!

0

No cos za cos. Albo masz ogolna obsluge procedur z rozpoznawaniem typow parametrow i automatycznym tlumaczeniem na sql (co pociaga za soba ustalenie wszystkich parametrow, zeby z ogolnego przypadku zrobil sie szczegolny) albo masz specjalna funkcje obslugujaca ta tylko procedure, ale nie jest uniwersalna.

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