MySQL i Delphi

0

Mam pytanie, jak dodać rekord do tabeli w bazie MYSQL poprzez komponent ADOQuery lub ADOCommand,
Mam ustanowione połączenie z serwerem MySQL 5.0 poprzez MyODBC Connectora/MySQL i zapytania typu SELECT wysyłane do bazy działają, ale gdy próbuje wstawić rekord polecenie INSERT INTO wywala mi błąd składni. Tabela Programy w bazie wygląda tak:
Pola : id int auto_increment not null, a pozostałe pola nazwa_programu, kategoria, opis_programu,numer_DVD są typu varchar i not null.

składnia poleceń, jaką próbowałem wykonać za pomocą komponentu ADOQuery wygląda tak:

with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO programy (nazwa_programu,kategoria,opis_programu,numer_DVD) VALUES ('+Edit1.Text+','+ComboBox1.Items.Strings[ComboBox1.ItemIndex]+','+Memo1.Lines.Text+','+Edit3.Text+')');
ExecSQL;

end;

Chciałbym wiedzieć czy polecenie jest dobrze napisane i jak wygląda sprawa z polem id, które jest typu auto_increment w MySQL, gdyż polecenie INSERT INTO wykonane za pomocą klienta MySQL nie wymaga
podawania pozycji id, gdyż robi to za nas serwer, ale nie wiem jak wygląda ta sprawa w przypadku zewnętrznej aplikacji typu delphi lub C++ builder.
Aha jeszcze jedno czy wymagane są jakieś konwersje stringów zawartych w kontrolkach Edit, Memo, ComboBox czy też nie w odniesieniu do pól tabeli typu varchar?
Jeśli ktoś zna odpowiedzi na te pytania, prosiłbym o odpowiedź. [???]

0

Po 1:
Poczytaj o parametrach!
Po 2:
Delphi to nie PHP, tutaj mamy po to datasety aby było łatwiej więc ich używaj! To naprawdę jest łatwiejsze i poza tym oddziela silnik bazy od aplikacji.
Po 3:
Do wprowadzania danych służą kontrolki z palety DataControls: np DBEdit, zajmą się one za Ciebie np formatem danych.

Pozdrawiam

0

Dosyć ciekawe, ale tak naprawdę to nic to nie daje, chcę to zrobić za pomocą zwykłych kontrolek a nie będę się bawił w podpinanie do każdej kontrolki wybranych pól, a zwłaszcza, gdy będę próbował dodać rekord a jedno pole jest typu Auto increment wszystko zacznie się sypać!!!!

0

Ja do tego celu używałem ADOCommand zamiast ADOQuery i działało bez problemu.

Var
Q: String;
begin
Q := 'insert into programy (nazwa_programu, kategoria, opis_programu, numer_DVD) ' + 
     'values("%s", "%s", "%s", "%s")';
Q := Format(Q, [Edit1.Text, ComboBox1.Items[ComboBox1.ItemIndex], Memo1.Text, Edit3.Text]);
ADOCommand1.CommandText := Q;
ADOCommand1.Execute;
end;

jeżeli pole jest typu autoincrement to możesz je pominąć przy insercie a wtedy id zostanie wygenerowane przez bazę.

Napisałeś że wszystkie pola są typu varchar to musisz uważać żeby nie zapisywać więcej nnaków niż jest to określone w bazie.
Musisz też pamiętać żeby odpowiednio zapisywać znaki specjalne. W PHP była funkcja bodajże AddSlashes która odpowiednio zapisywała tekst w bazie danych w delphi musisz sobie taką funkcję napisać no i oczywiście konwersja polskich znaków.

0

Dzięki polecenie działa, ale jak mam teraz zrobić, aby odświeżyć siatkę DBGrid i mieć w niej aktualny stan bazy, gdyż po wykonaniu polecenia wywala się jakiś błąd co z multirecordami. Powiedzcie jakie komponenty mam użyć,a by wyświetlić poprawnie w DBGrid uaktualnioną tabelę, w swoim projekcie mam
ADOCommand, DataSource, ADOQuery, ADOConnection, ale przypuszczam, że ten zestaw jest nieodpowiedni.

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