Dodawanie danych do bazy za pomoca OleDb

0

Witam

Mam problem z wykonaniem zapytania INSERT w c#.

Zrobilem sobie baze danch w ktorej jest tabela clients sklada sie ona z 3 pol clients_id[autonumerowanie],
clients_name, clients_address.
Nastepnie w MS Visual Studio ustanowilem polaczenie z ta baza. Zapytania select dzialaja wiec z polaczeniem jest ok.

Gdy natomiast chce po klikniecu w button dodac nowy rzad do bazy to wyskakuje error:
Parametr ?-1 nie ma wartosci domyslen.

Oto kod:

 private void dodButton_Click(object sender, EventArgs e)
        {
            string n = nazwaUczelni();
            string a = adresUczelni();

            dodajConnection.Open();
    
            dodajAdapter.InsertCommand.Parameters.Add("client_id",  System.Data.OleDb.OleDbType.Integer, 20, "");
            dodajAdapter.InsertCommand.Parameters.Add("client_name", System.Data.OleDb.OleDbType.VarChar, 20, n);
            dodajAdapter.InsertCommand.Parameters.Add("client_address", System.Data.OleDb.OleDbType.VarChar, 20, a);

            dodajAdapter.InsertCommand.ExecuteNonQuery();
           
            dodajConnection.Close();
        }

Dodam jeszcze ze polaczenia, dataAdapter oraz dataSet robilem za pomoca creatora.
Jezeli dobrze rozumiem blad to zle inicjalizuje parametry w zapytaniu.
Jezeli ktos moglby mnie nakierowac co robie nie tak to bylbym wdzieczny za pomoc.

Z gory dzieki
pozdrawiam
Piter

0

Nie mozesz ustawiac parametru id, bo jest autonumerowany. Sprobuj wykomentowac linijke z dodawaniem tego parametru.

pozdrawiam
johny

0

Zakomentowalem ten pierwszy parametr ale dalej ten sam exception [???] [???] [???]

0

W takim razie zprobuj czegos takiego:

(new SqlCommand(String.Format("insert into tabela (client_name. client_address) values('{0}','{1}')", n,a), dodajConnection).ExecuteNonQuery();

Juz nie pamietam jak to szlo z Adapterami, ale tam bylo dosc pokrecone. Osobiscie wole uzywac tej formy co powyzej.

pozdrawiam
johny

0

Dzieki wielkie

Zrobilem tak jak sugerowales zmienilem tylko clase bo byla SQlCommand a mi chodzilo o OleDbCommand i dziala. Widze ze bede musial samemu pisac zapytania i kod bo te kreatory Visuala to o du** mozna rozbic :D

Jeszcze raz big thx!

Pozdrawiam
Piter28

0

No ja tez preferuje ta forme, bo widac jak na dloni jakie zapytanie jest wywolywane. W kreatorach nigdy nie bylem pewien gdzie blad, bo tak naprawde nie wiadomo co zostalo wyslane (chyba ze podslucham serwer). Poza tym trzeba sie opisac, zeby wyskladac nawet najprostsze zapytanie - np. 30 kolumn w tablicy to wcale nie tak duzo - a ja mialem 30 linijek, zeby zdefiniowac zapytanie select i podobnie dla update'a i delete - podziekowalem :). Jakos nie mialem nerwow by sie w to zaglebiac. Tym sposobem napisalem juz sporo aplikacji i zadnych zastrzezen nie mam.

pozdrawiam
johny

0

A czy w tym wszystkim nie trzeba korzystać z DataSet?

0

Witam.
Żeby nie zakładać nowego tematu bo problem jest podobny opisze tutaj mój problem.
Napisałem taką metodę:

public void dodaj()
        {
            int cos;
            OleDbConnection conn = new OleDbConnection(BazaDanych.GetPolaczenie());
            conn.Open();
            string zapytanie = "insert into Ksiazka values(default, @tytul, @autor, " +
                "@wydawnictwo, @miejsce_wydania, @nr_wydania, @ISBN, @rok_wydania, " +
                "@liczba_stron, @format_ksiazki, @znak_miejsca, @znak_UKD, " +
                "@hasla_przedniotowe, @podtytul, @tlumaczenie, @ilustracje, " +
                "@dokumenty, @cena, @seria, @uwagi)";

            
            OleDbCommand cmd = new OleDbCommand(zapytanie, conn);

            cmd.Parameters.AddWithValue("@tytul", _tytul);
            cmd.Parameters.AddWithValue("@autor", _autor);
            cmd.Parameters.AddWithValue("@wydawnictwo", _wydawnictwo);
            cmd.Parameters.AddWithValue("@miejsce_wydania", _miejsceWydania);
            cmd.Parameters.AddWithValue("@nr_wydania", _nrWydania);
            cmd.Parameters.AddWithValue("@ISBN", _isbn);
            cmd.Parameters.AddWithValue("@rok_wydania", _rokWydania);
            cmd.Parameters.AddWithValue("@liczba_stron", _liczbaStron);
            cmd.Parameters.AddWithValue("@format_ksiazki", _formatKsiazki);
            cmd.Parameters.AddWithValue("@znak_miejsca", _znakMiejsca);
            cmd.Parameters.AddWithValue("@znak_UKD", _znakUKD);
            cmd.Parameters.AddWithValue("@hasla_przedniotowe", _haslaPrzedmiotowe);
            cmd.Parameters.AddWithValue("@podtytul", _podtytul);
            cmd.Parameters.AddWithValue("@tlumaczenie", _tlumaczenie);
            cmd.Parameters.AddWithValue("@ilustracje", _ilustracje);
            cmd.Parameters.AddWithValue("@dokumenty", _dokumenty);
            cmd.Parameters.AddWithValue("@cena", _cena);
            cmd.Parameters.AddWithValue("@seria", _seria);
            cmd.Parameters.AddWithValue("@uwagi", _uwagi);
            
            cos = cmd.ExecuteNonQuery();
            conn.Close();
        }

Ale nie chce działać. Wywala mi że "Nie podano wartości dla jednego lub kilku wymaganych parametrów." Wiem, że chodzi wartość default, czyli pierwszy atrybut tabeli gdzie występuje autonumerowanie. Przy MySql powinno to działać ale przy access nie chce. Próbowałem tam juz wpisywać (null; '') ale nadal nic, więc poszukałem i znalazłem ten temat. Zmieniłem metodę tak:

public void dodaj()
        {
            int cos;
            OleDbConnection conn = new OleDbConnection(BazaDanych.GetPolaczenie());
            conn.Open();
            string zapytanie = "insert into Ksiazka(Tytul, Autor, " + 
                "Wydawnictwo, Miejsce_wydania, Nr_wydania, ISBN, Rok_wydania, " + 
                "Liczba_stron, Format_ksiazki, Znak_miejsca, Znak_UKD, " + 
                "Hasla_przedmiowowe, Podtytul, Tlumaczenie, Ilustracje, " + 
                "Dokumenty, Cena, Seria, Uwagi) " + 
                "values(default, @tytul, @autor, " +
                "@wydawnictwo, @miejsce_wydania, @nr_wydania, @ISBN, @rok_wydania, " +
                "@liczba_stron, @format_ksiazki, @znak_miejsca, @znak_UKD, " +
                "@hasla_przedniotowe, @podtytul, @tlumaczenie, @ilustracje, " +
                "@dokumenty, @cena, @seria, @uwagi)";
           
            cmd.Parameters.AddWithValue("@tytul", _tytul);
            cmd.Parameters.AddWithValue("@autor", _autor);
            cmd.Parameters.AddWithValue("@wydawnictwo", _wydawnictwo);
            cmd.Parameters.AddWithValue("@miejsce_wydania", _miejsceWydania);
            cmd.Parameters.AddWithValue("@nr_wydania", _nrWydania);
            cmd.Parameters.AddWithValue("@ISBN", _isbn);
            cmd.Parameters.AddWithValue("@rok_wydania", _rokWydania);
            cmd.Parameters.AddWithValue("@liczba_stron", _liczbaStron);
            cmd.Parameters.AddWithValue("@format_ksiazki", _formatKsiazki);
            cmd.Parameters.AddWithValue("@znak_miejsca", _znakMiejsca);
            cmd.Parameters.AddWithValue("@znak_UKD", _znakUKD);
            cmd.Parameters.AddWithValue("@hasla_przedniotowe", _haslaPrzedmiotowe);
            cmd.Parameters.AddWithValue("@podtytul", _podtytul);
            cmd.Parameters.AddWithValue("@tlumaczenie", _tlumaczenie);
            cmd.Parameters.AddWithValue("@ilustracje", _ilustracje);
            cmd.Parameters.AddWithValue("@dokumenty", _dokumenty);
            cmd.Parameters.AddWithValue("@cena", _cena);
            cmd.Parameters.AddWithValue("@seria", _seria);
            cmd.Parameters.AddWithValue("@uwagi", _uwagi);
            
            cos = cmd.ExecuteNonQuery();
            conn.Close();
        }

Czyli wypisałem atrybuty tabeli i pominołem pierwszy atrybut autonumerowania (Nr_egzemparza) i teraz mi wywala "Liczba wartości kwerendy i liczba pól docelowych nie są takie same." czyli rozumiem, że liczba atrubutów(pól) w zapytaniu jest rózna od liczby atrybutów(pól) w tabeli. Hmmm niby logiczne tylko dlaczego kolegom wyżej tak działa? Dodam, że jeśli za Default wpisałem daną liczbę, przyjoł to poprawnie.

Proszę o pomoc.

0

W drugim kodzie pomin default. Druga konstrukcja jest typu:

insert into tabela (lista_kolumn) values (lista_wartosci)

wiec obydwie listy musza miec tyle samo elementow, zeby silnik wiedzial, ktora wartosc odpowiada ktorej kolumnie.

0

aj aj faktycznie. Skopiowałem to i zapomiałem usunąć. Nawet nie zwróciłem na to uwagi. Teraz działa. Dzieki.
A czy w pierwszym kodzie można wpisać coś w miejsce default aby OLE DB dla access zrobił autoinkrementacje? tak jak to jest (default) w MySql?

0

Accessa unikam jak ognia wiec nie odpowiem, ale z zasady lepiej uzywac tej drugiej konstrukcji, mimo ze dluzsza. Jest bardziej przydatna w przypadku, gdy dodajesz nowe pole do tabeli (na etapie implementacji malych/srednich projektow to dosc czeste).

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