[C#][SQL] Usuwanie rekordu


(Times1991) #1

Witam.

Chcę w moim programie umieścić przycisk który usuwa wiersz z tabeli. Niestety od kilku godzin nie mogę nic wymyślić ,a wszystkie sposoby z internetu zawodzą albo moja wiedza jest za mała aby je przystosować do moich warunków.

Kod który udało mi się napisać wygląda tak:

string conString =

                     @"Provider=Microsoft.JET.OLEDB.4.0;"

                      + @"data source=pacjenci.mdb";


            OleDbConnection connection = new OleDbConnection(conString);

            connection.Open();


            string kwerenda = "DELETE FROM PACJENCI WHERE ID_Pacjenci = '2'";    

            OleDbDataAdapter adapter = new OleDbDataAdapter(kwerenda, connection);

            connection.Close();

Program jaki używam to Microsoft Visual Studio, język C# (WPF), a program od bazy to Microsoft Access.

Pozdrawiam i liczę na pomoc:)


(Krakers87) #2

Dobrze jakbyś podał treść błędu. Nie wiem jak C# + MA, ale wg standardu jeżeli po WHERE mamy warunek dotyczący pola liczbowego nie umieszczamy go w apostrofach.


(Times1991) #3

Właśnie nie wywala żadnego błędu. Program kompiluje się bez przeszkód.

Próbowałem z apostrofami oraz bez - niestety nie pomogło.


(M@ster) #4

Jeśli ID_Pacjenci jest typu liczbowego to faktycznie nie potrzebne są apostrofy, ale ich zastosowanie nie może być przyczyną błędu, po prostu nastąpi w tym momencie rzutowanie kolumny ID_Pacjenci na postać ciągu znaków co spowolni nieco proces.


(Fiołek) #5

Takie pytanie: gdzie wywołujesz to zapytanie? I po co używasz adaptera danych jeśli żadnych danych nie dostajesz(no dobra, oprócz liczby usuniętych wierszy)?

OleDbCommand cmd = new OleDbCommand(kwerenda, connection);

cmd.ExecuteNonQuery();

(Times1991) #6

Fiołek, nie wiem gdzie wywołuje to zapytanie. Staram się to zrobić po omacku, a w c# bawię się od niedawna więc prawie wszystko jest tu dla mnie czarną magią. Adapter został po przerobieniu zapytania na dodawanie danych, nie wiedziałem czym to mogę zastąpić.

Nie jestem pewien gdzie mam wkleić Twój kawałek kodu. Gdy wlepiłem go zamiast adaptera program się skompilował ale nadal nie chce działać poprawnie (zawiesza się a program pokazuje na linię kodu "cmd.ExecuteNonQuery();" z komentarzem "Nieodpowiedni typ danych w wyrażeniu kryterium."

Po modyfikacji wyglądało to tak:

private void buttonDodajUsun_Click(object sender, EventArgs e)

        {

            string conString =

                      @"Provider=Microsoft.JET.OLEDB.4.0;"

                      + @"data source=pacjenci.mdb";


            OleDbConnection connection = new OleDbConnection(conString);

            connection.Open();


            string kwerenda = "DELETE FROM PACJENCI WHERE ID_Pacjenci = '2'";

            OleDbCommand cmd = new OleDbCommand(kwerenda, connection);

            cmd.ExecuteNonQuery();


            connection.Close();

        }


    }

hmm.. ID_pacjenci jest kluczem w tabeli, może to jest przyczyną problemu?


(Fiołek) #7

Nie "zatrzymuje się" tylko metoda OleDbCommand.ExecuteNonQuery rzuca wyjątek z błędem. Teraz masz błędy w zapytaniu SQL(niepoprawny typ danych, 2 nie może być pomiędzy apostrofami jeśli ID_Pacjenci jest typem liczbowym). Nie jestem pewien jak to jest z MS Access + OleDB ale upewniłbym się co do nazw tabel bo mogą być case-sensitive. AFAIK nazwy bez ` lub " są konwertowane na małe litery.


(Times1991) #8

Aaa...działa! :smiley:

Gdy zmieniałem ID_Pacjenci na coś co przechowuje litery (np Imię) zadziałało. Teraz wystarczy tylko wykombinować aby usuwał po PESELU i będzie hulać jak powinno:)

Wielkie dzięki za pomoc! masz u mnie piwo, Fiołek!