[C#] String traktowany jako całość

0

Witam.
Mam problem z wprowadzaniem danych do bazy, ponieważ wprowadzając test należy podać go w ' '. Jednak jak wprowadzam nazwę L'OREAL to się sypie z wiadomego powodu. Jak zrobić, aby tekst był traktowany jako całość. Kombinowałem coś z @ przed "", ale nadal mam problemy.

string ss = "L'OREAL"
query = "Insert into tabela VALUES(' "+ss+" ') ";

PdR

0

Użyj parametrów.

0

no dzięki, ale nie wiem o co ci chodzi ....

0

Zamiast składać zapytania możesz użyć Parametry. Przydaje się to szczególnie dlatego, że ktoś może Ci wpisać jako np. nazwę produktu tekst "; drop table products;" or else. Jest to tzw. zastrzyk SQL (SQL injection) który powoduje, że użytkownik może tak zmodyfikować treść Twojego zapytania, że może np. skasować Ci bazę danych, albo wprowadzić inne dane, albo coś odczytać itd (zależnie od uprawnień użytkownika na którym łączysz się z bazą).

Dlatego wymyślono własnie parametry. Poniższy przykład to metoda dodawania produktu, która jest odporna na podstawowe ataki SQL Injection i wykorzystuje parametry. Zauważ, że metoda AddWithValue bierze jako argumenty dwie rzeczy: nazwę parametry (zawsze z @ na początku) i wartością.

Klasa SQLCommand sama dba o odpowiednie opakowanie danych w zapytaniu, żeby nie doszło do ataku.

        public void DodajMaseczke(string NazwaMaseczki, string CenaMaseczki, SqlConnection Polaczenie)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.Text;
            cmd.Connection = Polaczenie;
            cmd.CommandText = "Insert into tabela values (nazwa=@nazwa, cena = @cena)";
            cmd.Parameters.AddWithValue("@nazwa", NazwaMaseczki);
            cmd.Parameters.AddWithValue("@cena", CenaMaseczki);
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();
        }
0

Z tą @ to się nie zgodzę. U mnie działa bez.
cmd.Parameters.AddWithValue("nazwa", NazwaMaseczki);

0

Parametry zawsze zaczynają się od @.

0

Z tym znaczkiem "@" to różnie. Zleży od sterownika albo wersji frameworka.
Np. Finisar.SQLite pod .NET 1.1 wymaga go.

0

oke, zrobilem to zapytanie z parametrami, ale otrzymuje w bazie wynik -1 ?

OleDbCommand command = new OleDbCommand();
                command.Connection = new OleDbConnection(connString);
                command.Connection.Open();
                foreach (OrdersAdelaila.productType prod in order.order_details.products)
                {
                    command.CommandText = "INSERT INTO Produkty VALUES(Id_Zam=@Id_Zam, Nr_Zam=@Nr_Zam,"
                    + "Id=@Id, Nazwa=@Nazwa, Kod_Produktu = @Kod_Produktu , Kod_Zewnetrzny=@Kod_Zewnetrzny, "
                    +"Id_Magazynu=@Id_Magazynu, Ilość=@Ilość, Waga=@Waga, VAT=@VAT,"
                    +"Cena_Brutto_W_Panelu=@Cena_Brutto_W_Panelu, Cena_Brutto_W_Zam=@Cena_Brutto_W_Zam)";
                    command.Parameters.AddWithValue("@Id_Zam", check(order.id.ToString()));
                    command.Parameters.AddWithValue("@Nr_Zam", check(order.sn.ToString()));
                    command.Parameters.AddWithValue("@Id", check(prod.id.ToString()));
                    command.Parameters.AddWithValue("@Nazwa", check(prod.name.ToString()));
                    command.Parameters.AddWithValue("@Kod_Produktu", "0");
                    command.Parameters.AddWithValue("@Kod_Zewnetrzny", check(prod.product_sizecode));
                    command.Parameters.AddWithValue("@Id_Magazynu", check(prod.stock.ToString()));
                    command.Parameters.AddWithValue("@Ilość", check(prod.quantity.ToString()));
                    command.Parameters.AddWithValue("@Waga", check(prod.weight.ToString()));
                    command.Parameters.AddWithValue("@VAT", check(prod.vat.ToString()));
                    command.Parameters.AddWithValue("@Cena_Brutto_W_Panelu", check(prod.panel_price.ToString()));
                    command.Parameters.AddWithValue("@Cena_Brutto_W_Zam", check(prod.order_price.ToString()));
                    command.ExecuteNonQuery();
                }
                command.Connection.Close();
0

jaki znowu wynik? to jest insert, on nie zwraca "wynikow"..

0

insert wstawia do bazy dane tak ? to wlaśnie jest ten wynik. I otrzymuje -1 zamiast wartości oczekiwanych. To jest kod błędu, tylko nie wiem z czego on wynika. Jeżeli chodzi o zmienne order.id.ToString() itp., to sprawdziłem w debuggerze i są tam prawidłowe wartości. Jest jakiś problem z przesyłaniem danych do bazy

0
decek_1984 napisał(a)

insert wstawia do bazy dane tak ? to wlaśnie jest ten wynik. I otrzymuje -1 zamiast wartości oczekiwanych. To jest kod błędu, tylko nie wiem z czego on wynika. Jeżeli chodzi o zmienne order.id.ToString() itp., to sprawdziłem w debuggerze i są tam prawidłowe wartości. Jest jakiś problem z przesyłaniem danych do bazy

szczerze mowiac nie spotkalem sie jeszcze zeby jakikolwiek serwer sql w momencie napotkania bledu konwersjii czy innego sam sobie wybieral wartosci. zazwyczaj w sytuacji bledu, serwer odrzuca żądanie albo wstawia null'e..
skoro wartosci zmiennych sa ok.. to moze funkcje CHECK zwracaja bledne wartosci? sprawdzales?

johny - to skladnia TSQL z SqlServer 2000/5/8 - jesli decek uzywa czegos innego, np. mysql czy pro/post/gresql to mozliwe ze one akceptuja taka.. przeciez jesli skladnia bylaby zla, to w ogole zaden wiersz by sie chyba nie dodal?? gdyby sie dodal przy zlej skladni zapytania, to to dopiero bylby wałek a nie serwer..

0

@up: w sumie to nie zauwazylem, ze nie podal silnika [wstyd].
@autor: W ktorym miejscu w bazie otrzymujesz -1? We wszystkich kolumnach wiersza? W jakiejs konkretnej?

0

Na pewno nie chodzi o wynik INSERTA ? Zapytanie INSERT zwraca tabele 1x1, w jedynej komórce jest ilość zmienionych wierszy.
ExecuteNonQuery zwraca pierwszą komórkę pierwszego wiersza z tego co zwróci zapytanie.

Druga sprawa, może twoje "check" jest coś nie teges ? Co ono robi ?

Trzecia sprawa dlaczego wszystko jako string pakujesz ? Nie można tak, to sterownik musi przeprowadzić konwersję aby formatowanie liczb, dat itd. było zgodne z tym co oczekuje baza. Ty nie dbasz o formatowanie tylko prosto ToString pakujesz.

I jeszcze taka uwaga - wagę i cenę licz i pamiętaj jako decimal czy currency.

0

witam
-1 dostaje we wszystkich kolumnach w tabeli docelowej.
Funkcja check sprawdza czy string jest pusty, jak tak to zwraca 0;
Co do stringów, to używam ich w sumie wszędzie i dopóki nie zacząłem używać parametrów wszystko było okej.
adf88 - to że pakuje w stringi to jakiś duży problem ?

0
decek_1984 napisał(a)

adf88 - to że pakuje w stringi to jakiś duży problem ?
Tak.

Funkcja check sprawdza czy string jest pusty, jak tak to zwraca 0;
Ale po co ? Nie widzę sensu w tym.

Pokaż struktury order, prod i pokaż jakiego typu są kolumny tabeli Produkty (np. zapytanie tworzące tą tabelę).

0

czy to ważne. Problem jest innej kwestii.

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