Zapisywanie danych z DataGridview do Bazy MsSQL

0

Witam! mam pewien problem -jak w temacie z zapisywaniem danych do bazy mssql mianowicie mam kod:

con.Open();
int licznik = 0;
dataGridView2.CurrentCell = dataGridView2[0, 0];
for (int j = 0; j < dataGridView2.RowCount; j++)
{
DodanieIlosci.ExecuteNonQuery();
dataGridView2.CurrentCell = dataGridView2[0, licznik];
licznik++;
}
con.Close()

a także zapytanie:
DodanieIlosci.CommandText = string.Format("Insert Into ElementyKompletu (IDTowaru, IDKompletu, IloscPotrzebnaDoProdukcji) Select Towary.IDTowaru, Komplety.IDKompletu, '" + /*dataGridView2.CurrentCell.Value.ToString()+ i tu wchodzi druga linijka grida... */ "15' From Towary, Komplety Where Towary.NazwaTowaru='" + dataGridView2.CurrentCell.Value.ToString() + "' and Komplety.NazwaKompletu = '" + NazwaKompletuBox.Text + "'");

kod -w teorii powinien powodowac zapisywanie się wartości z dataGridView do bazy danych mssql -zapytanie jest dobrze, -zamiast CurrentValues wprowadziłem wartości i puściłem na serwerze- problem leży w tym, że zapytanie ma zapisać parę wartości - stąd ta pętla w kodzie, zapisuje, owszem, ale za każdym zapisem ma wypełniać bazę innymi danymi- wierszami z pierwszej kolumny DGV -a wypełnia tylko wierszem pierwszym tyle razy ile wierszy w bazie... Nie wiem co robić, 2 dni sie męczyłem, nie potrafie nic wykombinować... może ma ktoś jakiś pomysł?

0
  1. istnieją także inne znaki przestankowe niż myślnik. można też robic łamania linii, akapity, wcięcia itp..
  2. słyszałeś kiedys taki termin jak "obiekt zapytania" i "parametry zapytania"? jezeli tak, albo jezeli nie - to tym bardziej - zainteresuj sie klasa SqlCommand i jej .Parameters, a nastepnie ZAPOMNIJ DO CIĘŻKIEJ CHOLERY że możesz +'em, .Append, StringBuilderem czy innymkolwiekczymś, recznie wklejać parametry do tekstu zapytania. NIE, NIE, NIE, daaameee desuu. pomysl: co sie stanie jak wpiszesz jako NazwaKompletu napis: apostrof srednik DROP TABLE ElementyKompletu srednik ? lub cos podobnego?
  3. naprawde chcesz powiedziec, ze przez dwa dni patrzysz na tę pętle i czytasz nią ciągle komórki dataGridView2[0, licznik]; i nie wpadłeś na to, żeby opakowac to w drugą pętle i czytac komorki dataGridView2[licznikwierszy, licznikkolumn]; ?
0

Dzięki za rady, cenie sobie konstruktywną krytykę :), fakt, o parametrach słyszałem, ale przyznam, że nie używałem... Żeby tego nie zmieniać mógłbym na przykład zrobić validację, aby uniknąć wprowadzania wartości w cudzysłowie? Da rade? A jaka jest różnica między przekazywaniem przez parametr a tym gównem które ja zrobiłem, po za tą oczywistą kwestią bazpieczeństwa jest jakaś jeszcze na przykład zwiększa szybkość?

0

Tak, dobrze myslisz - raz, ze wszelkie walidacje, a raczej tlumaczenia znakow na oescapeowane wersje sa juz zrobione i gotowe w 'silniku' parametrow, a dwa, ze "jest szansa" ze z ich uzyciem kod bedzie szybszy. Raczej nie bedzie wolniejszy, gdyz w istocie to co silnik zrobi w minimalnej wersji, to bedzie takie samo posklejanie stringow, tylko ze bezpieczne. Jest szansa na szybkosc natomiast, poniewaz:

  • tekst zapytania (ktory ma jawnie podane parametry) moze zostac przez serwer zapamietany, skompilowany i scacheowany. to oznacza ze nastepne takie samo zapytanie, z innymi parametrami, wykona sie szybciej, bo serwer juz nie musi go sprawdzac/kompilowac, tylko podmienia parametry
  • parametry moga leciec bokiem. connector do bazy danych/provider bazy nie musi wklejac parametrow do stringa zapytania. wyobraz sobie sytuacje insert-into-tab(id, obrazek), gdzie obrazek to jpg pol megabajta. wklejanie tego w zapytanie to bezsens. takie cos, jezeli connector/provider jest napisany sensownie, do bazy poleci inserto-into tab(id), a obrazke poleci jako strumien binarny kompletne "bokiem". czysciej i brak niepotrzebnej konwersji na hex-string zapytania
  • i temu podobne..

generalnie, w zaleznosci od tego z jakiego connectora/providera korzystasz, mysql, mssql, odbc/access, itp, formaty zapytan z parametrami troche sie roznia, ale szablon jest ten sam, dwa znaczace przyklady

ADO/MSSQL: [czyli, System.Data.SqlClient podlaczony przez SqlConnection/ConnecitonString do jakiegos serwera MsSqlServer]

var query = new SqlCommand(@"
    select *
    from tabela
    where
         imie = @imie_osoby
    and typ = @zawod
    and pesel = @pesel
");   ////  @blahblah  oznacza w T-SQL parametr o nazwie 'blah'. znak @ nie jest czescia nazwy parametru

query.Parameters.AddWithValue('zawod', 'lekarz');   // parametry nie musza byc podawane
query.Parameters.AddWithValue('pesel', 12345678);  // w kolejnosci, ale ich nazwy
query.Parameters.AddWithValue('imie_osoby', 'jacek'); // musza sie zgadzac

ale juz przy takim ODBC, i paru innych silnikach, okazuje sie ze nie pomyslano, ze parametry moga potrzebowac nazw..:

// zapytanie parametryczne ma tutaj postac
    select *
    from tabela
    where
         imie = ?
    and typ = ?
    and pesel = ?
////  ? oznacza ze tu ma byc wstawiony parametr

// a same parametry MUSZA byc podawane w kodzie bez nazw,
// i w dodatku w poprawnej kolejnosci! beda przez silnik wziete po kolei
// i wstawione wg. kolejnosci pojawiania sie ? w zapytaniu

linki:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx
http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx

PS. uwazaj w cmd.Parameter.Add na podobne metody: Add i AddWithValue. W wiekszoci wypadkow chcesz uzyc tej drugiej!
PS2. sorry, jendak nie poskladalem na szybko drugiego przykladu, zapomnialem ze SqlClient nie obsluguje ODBC, tylko ze od tego jest inny klient - bodajze System.Data.ODBC.. i juz mi sie odechcialo
PS3. silnik/provider/... Twojej bazy SQL musi w ogole obslugiwac parametry! sa takie, ktore tego nie obsluguja, ale sa juz na wymarciu. Baza danych lub provider bedzie przetwarzac zapytanie posiadajace @blah albo ?, i z tego powodu NIE MOZESZ wstawiac pytajnika czy @param w dowolne miejsce. Nie widzialem jeszce silnika bazy danych na ktorym zadzialaloby "sprytne' zapytanie postaci: SELECT * FROM @TABLICA. To nie do tego sluzy! parametry maja dostarczac konkretnych wartosci do porownan z komorkami tabel i/lub do wstawienia w komorki tabeli i nie sluza jako "wklejki" z kawalkami zapytan!

0

Dzięki, dzięki, dzieki! Postaram się dostosować i w przyszłości tak właśnie pisać.

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