Dodawanie danych do bazy za pomoca OleDb

Odpowiedz Nowy wątek
Piter28
2006-09-27 14:57
Piter28
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

Pozostało 580 znaków

2006-09-27 17:20

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

0

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

pozdrawiam
johny


You need to learn how to walk
before you can run

Pozostało 580 znaków

Piter28
2006-09-27 19:50
Piter28
0

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

Pozostało 580 znaków

2006-09-27 23:21

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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


You need to learn how to walk
before you can run

Pozostało 580 znaków

Piter28
2006-09-27 23:37
Piter28
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

Pozostało 580 znaków

2006-09-27 23:41

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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


You need to learn how to walk
before you can run

Pozostało 580 znaków

Dominik07
2007-06-13 15:43
Dominik07
0

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

Pozostało 580 znaków

2008-03-10 16:43

Rejestracja: 12 lat temu

Ostatnio: 11 lat temu

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.

Pozostało 580 znaków

2008-03-10 20:32

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-03-10 20:53

Rejestracja: 12 lat temu

Ostatnio: 11 lat temu

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?

Pozostało 580 znaków

2008-03-10 20:56

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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


You need to learn how to walk
before you can run

Pozostało 580 znaków

Odpowiedz

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