Delphi i MySQl

0

Witam wszystkich...
Mam nastepujacy problemik:
Obsluguje baze MySql poprzez ODBC. Wrzucilem na forme Database, Table i Query.
Mam procedurke ktore dodaje do tabeli jakies pole i potem liste pol wyswietla na ListBoxie.

cos w tym stylu:

begin
  Query1.SQL.Clear;
  Query1.SQL.text:='ALTER TABLE table1 ADD '+edit1.Text+' VARCHAR(50)';
  Query1.ExecSQL;
  Table1.Open;
  listbox1.Clear;
  table1.Open;
  table1.GetFieldNames(ListBox1.Items);
end;

no i wszystko pieknie ale tylko do pierwszego wcisniecia. Na ListBox pokazuje sie nowo dodane POLE ale po drugim razie i nastepnych juz nie!!!!! chociaz zapytanie do MySQL wysyla i w bazie to pole istnieje.
Glownie chodzi mi o sprawdzanie na bieŻąco przed zapisaniem pola czy takie juz istnieje.

Z gory dzieki za jakiekolwiek sugestie. Moze jakis inny sposobik.

Pozdrawiam

0
  1. zamiast pobierać listę pól z tabeli zrób SELECT * FROM tabel1 i zobacz czy bedziesz miał to dodane pole
  2. tu
  Table1.Open;
  listbox1.Clear;
  table1.Open;

powinien się wysypać - nie da się otworzyć otwartej tabeli. Jeśli łyka takie coś bez błędu to coś jest nie tak

  1. a tak swoją drogą to coś masz nie przemyślaną tą baze jak musisz dodawać pola do bazy w trakcie jej działania
0

Siemka Misiek - przegapiłeś coś :)
Jest

Query1.SQL.text:='ALTER TABLE table1 ADD '+edit1.Text+' VARCHAR(50)';

a powinno być

Query1.SQL.text:='ALTER TABLE table1 ADD '''+edit1.Text+''' VARCHAR(50)';
0
irek napisał(a)

Siemka Misiek - przegapiłeś coś :)

siema :) - wcale niekoniecznie :P

Jest

Query1.SQL.text:='ALTER TABLE table1 ADD '+edit1.Text+' VARCHAR(50)';

a powinno być

Query1.SQL.text:='ALTER TABLE table1 ADD '''+edit1.Text+''' VARCHAR(50)';

z nazwą kolumny jest tak samo jak z nazwą tabeli - może ale nie musi być w ' ' pod warunkiem, że jej nazwa jest jednoczłonowa. Jeśli masz nazwę pola nazwisko uzytkownika to rzeczywiście musi ona byc w ' ' lub " " w zależności od silnika

0

Witam ponownie...
Co do powyzszych odpowiedzi to nie wiele przyniosly..
poza tym co do kodu SQL jest wszystko w porzadku bo dodaje pole.
I baza jest przemyslana tylko tworzona dynamicznie przez program.
A co do Table1.Open to sie nie wysypuje, ale to nie ma znaczenia.
A problem caly czas mam nie rozwiazany.
Pole jest dodawane do bazy, tylko ze nie moge sprawdzic tego w programie. Jak pierwsze pole jest dodawane (w sensie przy pierwszym uruchomieniu programu) to aktualicuje ListBoxa i jest to pole widoczne. Ale po drugim dodaniu pola nie jest ono widoczne w Listboxie, pomimo ze do bazy dodal.

I nie mam pojecia co to moze byc... :(
Pomozcie. Dzieki

0

a po dodaniu pola sprawdzałeś czy jest tak jak prosiłem?

  1. zamiast pobierać listę pól z tabeli zrób SELECT * FROM tabel1 i zobacz czy bedziesz miał to dodane pole

a spróbuj po każdym ExecSQL zrobić DataBase.Commit

I podaj co to za baza!

0

Dodalem zaraz po kodzie dodajacym pole..
Jest dokladnie to samo.

0
arturfir napisał(a)

Dodalem zaraz po kodzie dodajacym pole..
Jest dokladnie to samo.

dobra zacznijmy od początku - co to za baza i jakie komponenty?

0

To zaczynam od poczatku...
Mam Mysql i lacze sie poprzez driver MysqlODBC z baza danych.
Komponenty:

  1. Database (BDE)
  2. Query (BDE)
  3. Table (BDE)
  4. Datasource
  5. DBGRID
  6. Listbox

oczywiscie wszyskie komponenty odpowiednio powiazane.
Mam pusta baze danych w MySql.
Program ma na celu automatyczne tworzenie tabel z pliku tekstowego.
Oczywiscie na poczatku utworzylem tabele z jednym polem.
i mam jedna procedure dla przycisku:

  Table1.Close;
  Query1.SQL.Clear;
  Query1.SQL.text:='ALTER TABLE table1 ADD '+edit1.Text+' VARCHAR(50)';
  Query1.ExecSQL;
  Query1.SQL.Text:='SELECT * from table1';
  Query1.ExecSQL;
  listbox1.Clear;
  Table1.Open;
  table1.GetFieldNames(ListBox1.Items);

i to wszystko...
po wykonaniu programu dodawane jest pole i wyswietla je w DBGridzie i ListBoxie, ale drugie nacisniecie przycisku nie uaktualnia wyswietlania w gridzie i Listboxie, chociaz jest dodane w tabeli.

0
arturfir napisał(a)

To zaczynam od poczatku...
Mam Mysql i lacze sie poprzez driver MysqlODBC z baza danych.
Komponenty:

  1. Database (BDE)
  2. Query (BDE) dodaj drugie query, datasource, połącz je i podepnij do dbgrida
  3. Table (BDE)
  4. Datasource
  5. DBGRID
  6. Listbox

oczywiscie wszyskie komponenty odpowiednio powiazane.
Mam pusta baze danych w MySql.
Program ma na celu automatyczne tworzenie tabel z pliku tekstowego.
Oczywiscie na poczatku utworzylem tabele z jednym polem.
i mam jedna procedure dla przycisku:

  Table1.Close;
  Query1.SQL.Clear;
  Query1.SQL.text:='ALTER TABLE table1 ADD '+edit1.Text+' VARCHAR(50)';
  Query1.ExecSQL;
<b>dodaj DataBase.Commit</b>
  Query1.SQL.Text:='SELECT * from table1'; <b>to wpisz do query2</b>
  Query1.ExecSQL; <b>a tu zamiast tego co jest daj Query2.Open</b>
 <b>zapytania pobierające otwiera się przez Open a nie ExecSQL</b>
  listbox1.Clear;
  Table1.Open;
  table1.GetFieldNames(ListBox1.Items);

owinno działaćak, że po naciśnięciu guzika w dbgridzie masz wynik zapytaniia SELECT * FROM table1, który sie za każdym razem odświeża (po dodaniu kolejnego pola)

0

Wywala sie na linii database.Commit z komunikatem:
No user transaction is currently in progress

ok. juz bledu nie wyswietla (database.OpenTransaction)... ale i tak bez zmian... :(

0

to po Tabela1.close sprubój Database.StartTransaction;

jak nie zadziała to nie mam więcej pomysłów :(

0

Prawie to... ale ten kod zaczyna byc bardzo zamieszany...
Teraz wyswietla wszystkie pola ale tylko w Dbgridzie, bo z nim polaczone jest DataSource2 (Query2).. W sumie to Table w ogóle nie potrzebuje? Bo z funkcji GetFieldsName i tak mi nie wyciaga ostatnio wprowadzonego pola.
Za bardzo nie chcialbym korzystac z wizualnych komponentow do sprawdzania tylko czy istnieje pole czy nie.... troche zagmatwane....

Ale wielkie dzieki, troche mi wiecej wiedzy przybylo :)
Wielkie dzieki jeszcze raz.
Chyba ze moze masz jakis inny sposob na sprawdzenie czy istnieje dane pole???

Pozdrawiam
Artur

P.S.

Ale przeciez moge z dataSource wyciagnac to samo co z Table i wlasnie tak dziala...
Jeszcze raz dzieki.

0

jest := true;
try
query.SQL.Text := 'SELECT nazwa_pola FROM tabela";
query.Open;
except
jest : False;
end;
//jak istnieje pole nazwa_pola to jest = true, a jak nie to false - powinno zadziałać.

0

I wlasnie tego mi bylo trzeba [browar]

Wielkie dzieki.

0

Hallo arturfir!

jest := true;
try
query.SQL.Text := 'SELECT nazwa_pola FROM tabela";
query.Open;
except
jest : False;
end;
//jak istnieje pole nazwa_pola to jest = true, a jak nie to false - powinno zadziałać.

Uwaga:
"jest" bedzie "false" rowniez w przpadku kiedy np. operacja "open" sie nie powiedzie. Co wcale nie znaczy, ze pole o nazwie "nazwa_pola" w tabeli nie istnieje.

Pozdrawiam
Markus
[???]

0

wlasnie zauwazylem ta niedogodnosc, ale to nie przeszkadza, bo baze i tabele otwieram wczesniej... takze mysle ze bedzie dobrze funkcjonowac.

Ale dzieki za rade.

0
MarkusB napisał(a)

Hallo arturfir!
Uwaga:
"jest" bedzie "false" rowniez w przpadku kiedy np. operacja "open" sie nie powiedzie. Co wcale nie znaczy, ze pole o nazwie "nazwa_pola" w tabeli nie istnieje.

ale na takim zapytaniu to raczej nie ma się na czym innym wywalić, chyba że nie będzie tabel. Poza tym można sprawdzić, jaki błąd wystąpił i to załatwi ten problem na 100%

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