Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 10 odgovora
  • 4.843 pregleda

Najnovija ↓

dbExpress i MySQL 08.07.2005. u 15:41 · pre 259 meseci #1
Ćao,

Pokušavam da u Delphiju 6 napravim jednostavan program koji pomoću dbExpress tehnologije prikazuje u gridu podatke iz tabele sa MySQL servera (ver. 3.23.58).
Iskopirao sam neophodni libmysql.dll u windows\system, podesio i aktivirao konekciju, ali ne uspevam da podesim SQLDataSet. Ako Command Type podesim na ctTable u drop-down listi Commnad Texta se ne pojavljuje ni jedna tabela iz selektovane baze a ako izaberem ctQuery i upišem upit onda dobijem grešku tipa access violation at address X in module 'dbexpmys.dll'...

Da li neko iz opisa prepoznaje situaciju i način na koji se može prevazići?
Unapred hvala.
Re: dbExpress i MySQL 08.07.2005. u 21:57 · pre 259 meseci #3
Hvala Toyo, članak zaista sadrži odgovor na ovo pitanje; tj. pošto sam skinuo i upotrebio dbexpmysql.dll sa neta (nema ga u instalaciji Delphija 6) program je korektno proradio.
Re: dbExpress i MySQL 09.07.2005. u 14:26 · pre 259 meseci #4
Imam još samo jedno pitanje u labavijoj vezi sa prethodnim ali se odnosi na dbExpress i MySQL:

Dodao sam DBNavigator kontrolu. Kad pokušam da dodam novi slog iskoči exception da polje id (koje je u MySQL tabeli definisano kao auto increment) ne sme biti prazno. Pokušavao sam da taj field u SQLClientDataSetu redefinišem kao AutoInc ali bez ikakvog efekta (sa istom greškom).

Šta u ovoj situaciji?
Unapred hvala.
Re: dbExpress i MySQL 09.07.2005. u 17:58 · pre 259 meseci #5
Jednostavno u polje ID ne upisuj nista, odnosno u upitu ili tabeli nemoj da ga tretiras.
Re: dbExpress i MySQL 10.07.2005. u 11:59 · pre 259 meseci
izmenjeno 1 put, poslednji put rms 10.07.2005. u 12:00
  1. rms10.07.2005. u 12:00zapis iz teksta poruke
#6
Pa, to sam i ja pomislio po nekoj analogiji sa PHP-om. Na žalost Dekys, čak i kad to polje izbacim iz FieldDefs SQLDataSeta dobijam istu grešku!
Re: dbExpress i MySQL 10.07.2005. u 13:33 · pre 259 meseci #7
DBExpress tehnologija uopšte nije loša (naprotiv), samo što su ljudi ostavili neke stvari malo nedorađene. Jedna od tih stvari je i insert/updtate problem AutoInc Fielda, koje radi korektno samo kad je ciljni RDBMS Interbase/firebird. Više o tome ima na Borland Developers Network , a ja obično rešavam problem na sledeći način.
1. Postavi se sledeći "niz" komponenti: TSQLDataSet (dbExpress paleta) -> TDataSetProvider (DataAcess paleta) -> TClietDataSet (DataAcess komponenta) -> DataSource.

2. Kao "Command Text" TSQLDataSeta se napiše text upita;

3. U "BeforeUpdateRecord" eventu TDataSetProvidera se upiše sledeći kod:


....
var i:integer;
nValue:variant;
tmpStr:string;
actiontype:integer;
Kveri: TSQLQuery;
SQLInsert, SQLUpdate, SQLDelete: String;
begin

Kveri:=TSQLQuery.Create(Self);

With Kveri do
begin
SQLConnection:=SQLConn;

case updatekind of
ukinsert:
begin
SQL.Clear;
SQL.Text:=SQLinsert;
actiontype:=0;
end; // insert
ukmodify:
begin
SQL.Clear;
SQL.Text:=SQLupdate;
actiontype:=0;
end; // update

ukdelete:
begin
SQL.Clear;
SQL.Text:=SQLdelete;
actiontype:=1;
end; // delete
end;

case actiontype of
0: begin
for i:=0 to deltads.FieldCount-1 do
begin
nvalue:=deltads.Fields.NewValue;
tmpstr:=deltads.Fields.FieldName;
if (assigned(Params.FindParam(tmpstr))) then
begin
Params.ParamValues[tmpstr]:=deltads.Fields.Value;
if VarIsEmpty(nvalue) then
Params.ParamValues[tmpstr]:=deltads.Fields.OldValue
else
Params.ParamValues[tmpstr]:=nvalue;
end; // if
end; // for
end; //case 0

1: begin
for i:=0 to deltads.FieldCount-1 do
begin
tmpstr:=deltads.Fields.FieldName;
if (assigned(Params.FindParam(tmpstr))) then
Params.ParamValues[tmpstr]:=deltads.Fields.Value;
end;// for
end; //case 1

end; // case

ExecSQL(false);
applied:=True;

end; // with Kveri

Kveri.Free;
end;

SQLInsert, SQLUpdate & SQLDelete su upiti za operacije Ubacivanja, menjanja odnosno brisanja podataka iz odgovarajuće tabele, i njih morate definisati samui u slučaju da koristite ovaj pristup, jer DbExpress "ne ume" sam da generiše ove sql upite kad su autinc polja u pitanju.

Ova zavrzlama važi u slučaju da vam je autoinc polje iz baze podataka potrebno iz nekih razloga u vašoj aplikaciji. Ukoliko nije, postupak je mnogo lakši :)
Kao CommandText property TSQLDataseta navedete u select upitu sva polja iz tabele SEM AUTOINC polja (npr. umesto select * from Zaposleni, treba select Ime, Prezime,...... from Zaposleni, ukoliko recimo tabela Zaposleni ima AutoInc polje IDZaposlenog), i to je to. U tom slučaju nema potrebe za modifikacijom BeforeUpdateRecord eventa TDatasetProvider komponente.

BTW, ovih dana bih trebao da završim DBExpress - HOWTO (Čim prođe EXIT i sa gajbe mi se raziđe hipi komuna :)), tako da to mogu da postujem ovde ukoliko ima zainteresovanih.
Re: dbExpress i MySQL 10.07.2005. u 16:10 · pre 259 meseci #8
Citat:
burner:
BTW, ovih dana bih trebao da završim DBExpress - HOWTO (Čim prođe EXIT i sa gajbe mi se raziđe hipi komuna :)), tako da to mogu da postujem ovde ukoliko ima zainteresovanih.

Please!
Re: dbExpress i MySQL 13.07.2005. u 17:33 · pre 259 meseci #9
Ćao,

U vezi gore pomenutog problema sa insertom i auto increment poljem u MySQL tabeli...
Pošto se prilikom inserta MySQL server žali da neće prazno auto increment polje, rekoh 'ajde da mu poturim 0 i to radi!

Evo šta treba:
Code:

procedure TForm1.SQLClientDataSet1AfterPost(DataSet: TDataSet);
begin
  SQLClientDataSet1.ApplyUpdates(-1);
  SQLClientDataSet1.Refresh;
end;

procedure TForm1.SQLClientDataSet1AfterInsert(DataSet: TDataSet);
begin
  SQLClientDataSet1.FieldByName('id').Value := 0;
end;

end.

Re: dbExpress i MySQL 14.07.2005. u 00:26 · pre 259 meseci
izmenjeno 1 put, poslednji put burner 14.07.2005. u 00:27
  1. burner14.07.2005. u 00:27zapis iz teksta poruke
#10
Da... to može da bude rešenje, ali ne u opštem slučaju:( Konkretno, kod MSSQL servera ovo ne pali nikako. Jedna od ideja datih na BDN-u je da se unutar Data Modula i li forme koja sadrži ClientDataSet, deklariše neka integer promenljiva (inicijalna vrednost -1) koja će posle svakog AfterInsert eventa biti umanjena za -1. Probaj insert više slogova u DataSet, pa onda uradi ApplyUpdates i vidi šta se dešava. Nemam instaliran trenutno MYSQL, baš me zanima šta se dešava u višestrukom insertu :)
Re: dbExpress i MySQL 17.07.2005. u 09:53 · pre 259 meseci
izmenjeno 1 put, poslednji put rms 17.07.2005. u 09:57
  1. rms17.07.2005. u 09:57zapis iz teksta poruke
#11
@burner

Citat:

Nemam instaliran trenutno MYSQL, baš me zanima šta se dešava u višestrukom insertu :)


Ćao,

Radi bez problema uz obavezan poziv Refresh metode. Naravno, svaka baza je priča za sebe.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme