Koneksi Database Dengan Delphi, MySQL & ZEOS
Setelah koneksi database dengan Delphi & MySQL, kini kita akan mengikuti sebuah tutorial membuat koneksi database dengan Delphi, MySQL dan Zeos Database Object. Kita tahu, Zeos tidak hanya untuk MySQL, tapi juga Interbase, Firebird, SQLite dan lainnya. Namun kita batasi saja pada MySQL, ya. Mengingat ruang dan yang paling penting, MySQL adalah database open source terbaik dan paling populer saat ini.
Instalasi Zeos DBO v.7.0.0 pada Delphi 2009 dan Delphi 2010 (Unicode) dapat dilihat di : http://jokorb.wordpress.com/2011/01/03/install-zeos-dbo-7-0-0-alpha-di-delphi-2010/
Kita awali dengan spesifikasi software yang saya gunakan dalam tutorial ini. Saya menggunakan Delphi 6, Zeos DBO 6.6.3-Stable dan MySQL 5 Comunnity Server.
Saya asumsikan Anda sudah memiliki MySQl yang terinstall di PC Anda. Jika belum, silahkan download MySQL 5 Comunnity Server. Langkah-langkah di sini mungkin bisa membantu Anda menginstall MySQL. Untuk Zeos, silhakan kunjungi website development Zeos untuk mendownload. Zeos versi 6.6.3-stable yang telah diperkecil – dengan membuang resource yang tidak diperlukan – bisa Anda download di akhir tulisan ini.
OK. Pertama, kita buat database contoh sebuah tabel pelanggan di dalamnya untuk kita gunakan dalam tutorial ini. Masuklah ke command prompt dan jalankan mysql client. Saya menggunakan perintah-perintah berikut:
### jokorb adalah user name saya di MySQL. Sesuaikan punya Anda.###
C:Documents and Settingsuser>mysql -u jokorb -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 10
Server version: 5.1.22-rc-community MySQL Community Server (GPL)
Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.
mysql> create database contoh;
Query OK, 1 row affected (0.00 sec)mysql> use contoh;
Database changed
mysql> create table pelanggan(
-> id int(6) not null auto_increment,
-> nama varchar(30) not null default ‘anonymous’,
-> alamat varchar(50),
-> telepon varchar(15),
-> primary key (id)
-> );
Query OK, 0 rows affected (0.09 sec)
mysql> exit;
Bye
C:Documents and Settingsuser>exit
Setelah mengetik exit yang terakhir di command prompt, jendela command prompt akan ditutup. Kita telah punya sebuah database contoh dan sebuah tabel pelanggan di dalamnya. Kita lanjut dengan instalasi Zeos DBO di Delphi.
Instalasi Zeos Database Object
- Ekstrak file ZEOSDBO-6.6.3-stable.zip hasil download ke sebuah folder, taruhlah, di C:ZEOSDBO-6.6.3-stable.
- Masuk ke dalam folder tersebut. Cek apakah folder PackagesDelphiXBuild sudah ada. DelphiX berarti Delphi6, Delphi7 atau versi lainnya sesuai versi Delphi yang akan Anda gunakan. Berhubung saya menggunakan Delphi 6, maka folder yang harus saya cek adalah PackagesDelphi6Build. Jika folder Build belum ada, buatlah dulu.
- Jalankan Delphi. Dari Delphi, buka file ZeosDbo.bpg dari folder PackagesDelphiX. Kompile semua project dari menu Project>Compile All. Berikut Binary Package yang harus terkompilasi:
- Sudah? Close All. Tambahkan path folder C:ZEOSDBO-6.6.3-stablePackagesDelphiXBuild ke Delphi Library Path. Caranya masuk ke menu Tools>Environment Options. Pada dialog yang muncul, klik tab Library, dan klik tombol elipsis di samping kanan combobox Library path. Dialog Directories akan muncul.

Klik tombol elipsis yang dilingkari, pilih folder C:ZEOSDBO-6.6.3-stablePackagesDelphiXBuild di mana Anda meletakkan Zeos DBO hasil kompilasi. Tombol Add akan menjadi aktif. Klik Tombol Add, kemudian klik OK. Kembali ke dialog Environment Options. Klik OK lagi.
- Tinggal menginstal komponen-komponen akses data di Component Palette. Buka file ZComponentDesign.dpk dalam folder C:ZEOSDBO-6.6.3-stablePackagesDelphiX. Jika file ini tidak Anda temukan, pilih saja file ZComponent.dpk. Klik tombol Install. Jika tak ada error melintang, Anda telah mempunyai Zeos DBO terinstall di Component Palette Delphi Anda. Amin
Contoh Aplikasi Menggunakan Zeos Database Object
Tentu saja bagian ini ga’ boleh lewat. Langsung saja.
- Buat sebuah aplikasi baru.
- Tambahkan sebuah TZConnection, TZTable dari page Zeos Access ke form.
Tambahkan juga sebuah TDataSource dari page Data Access. Juga sebuah TDBGrid dan sebuah TDBNavigator, keduanya dari page Data Controls. - Atur tata letak komponen-komponen agar enak dilihat. Saya membuatnya seperti ini:

- Atur setting koneksi TZConnection. Protocol diset ke MySQL. Ada beberapa pilihan, tapi buat jaga-jaga dengan versi MySQL yang berbeda, kita gunakan MySQL thok saja.

- Atur juga properti TZConnection yang lain seperti gambar berikut:

- Jika sudah, set properti Connected ke True. Kini atur proprerti connection milik TZTable ke ZConnection1. Atur properti TableName menjadi pelanggan. Set properti Active ke True. Lanjutkan dengan mengeset properti DataSet milik DataSource1 menjadi ZTable1. Terakhir, atur properti DataSource milik DBNavigator1 dan DBGrid1 menjadi DataSource1.
- Jika tidak ada error, aplikasi Anda sudah terkoneksi dengan MySQL server via Zeos DBO. Tekan F9 Untuk menjalankan aplikasi Anda. Cobalah menginputkan beberapa data.

Download
Download Zeos DBO 6.6.3-stable-packed-down
Download Source code tutorial – Link Alternatif (File Zip)
Zeos DBO versi 7.0.0 untuk Delphi 2009/2010 dapat didownload di sini. Cara instalasi dan penggunaannya sama saja.
Seperti biasa, file-file hasil download harus diganti ekstensinya dari .ppt menjadi .zip. Dan yang tidak kalah penting, scan dulu file-file hasil ekstraksi sebelum Anda gunakan.
Referensi
Berikut beberapa alamat web yang bisa Anda jadikan referensi terkait dengan tutorial ini:
- Tip-Tip Koneksi Delphi & MySQL oleh Euis Marlina (Adeisti)
- Zeos Di Delphi
- Oracle 10g & MySQL dengan Delphi
- Maseko’s MySQL Tutorials
- Delphi vs. MySQL on Diskusiweb
Tutorial instalasi Zeos pada Delphi
oleh Euis Marlina (adeisti.blogspot.com)
Selamat Mencoba. Untuk Mba’ Euis Marlina, thanks berat atas postingnya.


Periksa duplikasi dengan Copyscape.
Download Al-Qur'an Digital
View Al-Qur'an Digital Online




Aku dh coba cara lain, dan cukup brhasil. Kira2 langkahnya kyk gn:
1. Load SQL Script. Sisipkan perintah ‘DROP DATABASE IF EXISTS TEMP; CREATE DATABASE TEMP;USE TEMP’ dibagian atas script, load selain perintah CREATE DATABASE.
2. Buat koneksi k Database TEMP, tampilkan tabel pada combobox.
3. Setip ComboBox dipilih, tampilkan isi tabel pd DBGrid melalui DataSource
4. Untk menginject data dr tabel yg dipilih trlbh dahulu dibaca struktur tabel, dan temukan primary key.
5. Bandingkan setiap record dgn tabel target. Dgn memanfaatkan primary key tadi, bs di cek apakah data pd record aktif ada pada tabel target? Jika tdk ada, susun script SQL untk meng INSERT data (perhatikan struktur tabel)
Ada yg punya solusi lbh jitu?
Gak usah pake combobox, dbgrid atau Control lainnya, lambat.
ADOConnection1.GetTableNames(); -> Tabel
ADOConnection1.GetFieldNames(); -> Fields
Untuk pemanfaatan primary key buat deteksi data ada atau tidak di tabel target, menurut saya sudah cocok. Kalau primary key sudah ada, mungkin perlu perintah UPDATE sebagai pengganti INSERT buat mengedit data.
Yang jadi pertimbangan, apakah perlu mengecek primary key, sementara ada script DROP DATABASE dan CREATE DATABASE? Otomatis database yg baru dibuat kosong dan primary key tidak ada.
Sebagai catatan, untuk mempermudah, buat membackup data sebaiknya jangan pake SQL script, tapi dibuat tool sendiri, misalnya pake TClientDataSet, agar format data lebih terstruktur dan lebih stabil.
Wah klo pake drop database ntar smua tabel hilang? Pdhl cm tabel trtntu yg dipilih dr ComboBox (ADOConnection1.GetTableName(ComboBox1.Items). Jd mnrt sy tetep perlu cek primary key. Kasusnya gn, SQL Script diperoleh dr hsl export data yg diinput, tp tdk lgsg trhubung dgn kmptr server. Sy backupnya pakai mysqldump, jd memanfaatkan ShellExecute
Ntar dech aq kirimin script lengkapnya. Maklum, lg pake HP.
iya dong, pake drop table lebih ok
Berarti bukan merge atau InjectDB donk…? Kalo pake Drop Tables, malah jadinya replace data donk.. Trus data yang udah ada dikemanain?? Ini script punya saya:
//——————————————————————1st
unit UnitImportNew;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, StdCtrls, ShellAPI, ADODB;
type
TfmImportNew = class(TForm)
GroupBox1: TGroupBox;
Button1: TButton;
Edit1: TEdit;
GroupBox2: TGroupBox;
Label1: TLabel;
ComboBox1: TComboBox;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
tb_target: TADOTable;
ADOQuery1: TADOQuery;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmImportNew: TfmImportNew;
implementation
uses UnitDataModule;
{$R *.dfm}
var
Batch,
SQL : TextFile;
server,
user,
password,
database,
driver,
s : string;
procedure TfmImportNew.Button1Click(Sender: TObject);
var
ConnStr : string;
begin
if OpenDialog1.Execute then begin
Edit1.Text := OpenDialog1.FileName;
ComboBox1.Items.Clear;
AssignFile(SQL,ExtractFilePath(Application.Exename)+’binscript.sql’);
Rewrite(SQL);
Writeln(SQL,’DROP DATABASE IF EXISTS TEMP;’);
Writeln(SQL,’CREATE DATABASE IF NOT EXISTS TEMP;’);
Writeln(SQL,’USE TEMP’);
AssignFile(Batch,Edit1.Text);
Reset(Batch);
while not EOF(Batch) do begin
Readln(Batch,s);
if (uppercase(copy(s,1,3)) ‘USE’) AND (uppercase(copy(s,1,15)) ‘CREATE DATABASE’) then
Writeln(SQL,s);
end;
CloseFile(Batch);
CloseFile(SQL);
AssignFile(Batch,ExtractFilePath(Application.Exename)+’batch.bat’);
Rewrite(Batch);
writeln(Batch,’@echo off’);
writeln(Batch,’CD bin’);
writeln(Batch,’mysql -uroot -ppwd < script.sql');
CloseFile(Batch);
ShellExecute(0, 'open', PChar(ExtractFilePath(Application.Exename)+'batch.bat'), nil, PChar(ExtractFilePath(Application.Exename)), 2);
ADOConnection1.Connected := False;
connStr := 'Provider=MSDASQL.1;Extended Properties="DATABASE=TEMP;DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;PORT=0;SERVER=localhost;UID=root;PASSWORD=pwd"';
ADOConnection1.ConnectionString := connStr;
ADOConnection1.Connected := True;
end;
end;
procedure TfmImportNew.ComboBox1Change(Sender: TObject);
begin
ADOTable1.Close;
ADOTable1.TableName := ComboBox1.Text;
ADOTable1.Open;
DataSource1.DataSet := ADOTable1;
end;
procedure TfmImportNew.Button3Click(Sender: TObject);
begin
Close;
end;
//Tombol Import di Click
procedure TfmImportNew.Button2Click(Sender: TObject);
var
i : integer;
Nama_Tabel : TStrings;
Ada : Boolean;
PriKey : array of string;
str : string;
n_OK,
n_ALL : integer;
begin
SetLength(PriKey,1);
Nama_Tabel := TStringList.Create;
DM.ADOConnection1.GetTableNames(Nama_Tabel);
Ada := False;
for i := 0 to Nama_Tabel.Count-1 do
if Nama_Tabel[i] = ADOTable1.TableName then
Ada := True;
if not Ada then
Application.MessageBox('Tabel yang Anda pilih tidak terdapat pada database server!','Tabel tidak ada',MB_OK or MB_ICONEXCLAMATION)
else begin
tb_target.Close;
tb_target.Connection := DM.ADOConnection1;
tb_target.TableName := ADOTable1.TableName;
tb_target.Open;
if tb_target.FieldCount ADOTable1.FieldCount then
Application.MessageBox(‘Kedua tabel tidak memiliki kolom yang sama!’,'Kolom tidak sama’,MB_OK or MB_ICONEXCLAMATION)
else begin
n_OK := 0;
n_ALL := 0;
//get primary key
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(‘DESC ‘+tb_target.TableName);
ADOQuery1.Open;
i := 0;
while not (ADOQuery1.Eof) do begin
if ADOQuery1.Fields[3].AsString = ‘PRI’ then begin //field yang merupakan primary key
PriKey[i] := ADOQuery1.Fields[0].AsString;
inc(i);
SetLength(PriKey,i+1);
end;
ADOQuery1.Next;
end;
//Lakukan iterasi
ADOTable1.First;
while not ADOTable1.Eof do begin
str := ”;
for i := 0 to high(PriKey) – 1 do
str := str + PriKey[i] + ‘ = ‘ + QuotedStr(ADOTable1.FieldByName(PriKey[i]).AsString) + ‘ AND ‘;
Delete(str,length(str)- 4,5);
DM.qrTemp.Close;
DM.qrTemp.SQL.Clear;
DM.qrTemp.SQL.Add(‘SELECT * FROM ‘+ADOTable1.TableName+’ WHERE ‘+Str);
DM.qrTemp.Open;
inc(n_ALL);
if DM.qrTemp.RecordCount = 0 then begin
DM.qrTemp2.Close;
DM.qrTemp2.SQL.Clear;
DM.qrTemp2.SQL.Add(‘INSERT INTO ‘+ADOTable1.TableName+’ VALUES (‘);
str := ”;
for i := 0 to ADOTable1.FieldCount – 1 do
if (ADOTable1.Fields[i].DataType = ftDate) OR (ADOTable1.Fields[i].DataType = ftDateTime) then
str := str + QuotedStr(FormatDateTime(‘yyyy’,ADOTable1.Fields[i].AsDateTime)+’-'+FormatDateTime(‘mm’,ADOTable1.Fields[i].AsDateTime)+’-'+FormatDateTime(‘dd’,ADOTable1.Fields[i].AsDateTime)) + ‘,’
else
str := str + QuotedStr(ADOTable1.Fields[i].AsString) + ‘,’;
Delete(str,length(str),1);
DM.qrTemp2.SQL.Add(str);
DM.qrTemp2.SQL.Add(‘)’);
DM.qrTemp2.ExecSQL;
inc(n_OK);
end;
ADOTable1.Next;
end;
MessageDlg(‘Result :’#13#10+IntToStr(n_ALL)+’: record(s) scanned’#13#10+IntToStr(n_OK)+’: new record(s) merged’, mtInformation, [mbOK], 0)
end;
end;
Nama_Tabel.Free;
end;
procedure TfmImportNew.Button4Click(Sender: TObject);
begin
ADOConnection1.GetTableNames(ComboBox1.Items);
ComboBox1.ItemIndex := -1;
end;
procedure TfmImportNew.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
DM.qrTemp.Close;
DM.qrTemp.SQL.Clear;
DM.qrTemp.SQL.Add(‘DROP DATABASE IF EXISTS TEMP’);
DM.qrTemp.ExecSQL;
end;
procedure TfmImportNew.FormDestroy(Sender: TObject);
begin
if FileExists(ExtractFilePath(Application.Exename)+’batch.bat’) then
DeleteFile(ExtractFilePath(Application.Exename)+’batch.bat’);
if FileExists(ExtractFilePath(Application.Exename)+’binscript.sql’) then
DeleteFile(ExtractFilePath(Application.Exename)+’binscript.sql’);
end;
end.
//Sedangkan untuk script export, aku pake seperti ini:
procedure TfmUtama.ExportDatabase1Click(Sender: TObject);
var
command : string;
Batch : TextFile;
begin
command := ‘mysqldump -uroot -ppwd -h localhost -B mydb > “‘;
saveDialog1.FileName := server+’_'+DateToStr(Date);
if SaveDialog1.Execute then begin
command := command + SaveDialog1.FileName+’”‘;
AssignFile(Batch,ExtractFilePath(Application.Exename)+’batch.bat’);
Rewrite(Batch);
writeln(Batch,’@echo off’);
writeln(Batch,’CD bin’);
Writeln(Batch,command);
writeln(Batch,’exit’);
CloseFile(Batch);
ShellExecute(0, ‘open’, PChar(ExtractFilePath(Application.Exename)+’batch.bat’), nil, PChar(ExtractFilePath(Application.Exename)), 2);
end;
end;
//Semoga memahami maksud saya…
mas,,mau tanya..
gimana cara manipulasi data pake syntax..
kan klo pake ADO tuh penulisan misal syntaknya :
with dm.ADOQ_coba do
begin
Close;
Open;
SQL.Clear;
SQL.Add(query);
ExecSQL;
Active:=True;
end;
klo pake Zeos gimana syntaknya?soalnya klo saya pake syntak d atas tuh pasti minta ZDbcPostgreSqlUtils.pas
Jangan lupa menambahkan semua folder yang ada dalam subfolder ZeosDBO ke dalam Library Path.
Untuk statemen update atau insert, gunakan
ZConnection.ExecuteDirect( SQL ), jangan menggunakan
ZQuery atau ZReadOnlyQuery.
HTH
@Mas JOKO
Kalau pakai DROP TABLE, berarti semua data yang terdapat pada tabel tujuan hilang semua dunk???!!! Padahal kan mau merge…???!!! Kalo DROP TABLE Guampang bangets…
Ini script punya saya (99% work):
//LOAD Script SQL
procedure TfmImportNew.btLoadSQLClick
(Sender: TObject);
var
ConnStr : string;
begin
if OpenDialog1.Execute then begin
Edit1.Text := OpenDialog1.FileName;
ComboBox1.Items.Clear;
AssignFile(SQL,ExtractFilePath(Application.Exename)+’binscript.sql’);
Rewrite(SQL);
Writeln(SQL,’DROP DATABASE IF EXISTS TEMP;’);
Writeln(SQL,’CREATE DATABASE IF NOT EXISTS TEMP;’);
Writeln(SQL,’USE TEMP’);
AssignFile(Batch,Edit1.Text);
Reset(Batch);
while not EOF(Batch) do begin
Readln(Batch,s);
if (uppercase(copy(s,1,3)) ‘USE’) AND (uppercase(copy(s,1,15)) ‘CREATE DATABASE’) then
Writeln(SQL,s);
end;
CloseFile(Batch);
CloseFile(SQL);
AssignFile(Batch,ExtractFilePath(Application.Exename)+’batch.bat’);
Rewrite(Batch);
writeln(Batch,’@echo off’);
writeln(Batch,’CD bin’);
writeln(Batch,’mysql -uroot -pmypwd < script.sql');
CloseFile(Batch);
ShellExecute(0, 'open', PChar(ExtractFilePath(Application.Exename)+'batch.bat'), nil, PChar(ExtractFilePath(Application.Exename)), 2);
ADOConnection1.Connected := False;
connStr := 'Provider=MSDASQL.1;Extended Properties="DATABASE=TEMP;DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;PORT=0;SERVER=192.168.0.1;UID=root;PASSWORD=mypwd"';
ADOConnection1.ConnectionString := connStr;
ADOConnection1.Connected := True
ADOConnection1.GetTableNames(ComboBox1.Items);
ComboBox1.ItemIndex := -1;
end;
end;
//Script Merge Data
procedure TfmImportNew.Button2Click(Sender: TObject);
var
i : integer;
Nama_Tabel : TStrings;
Ada : Boolean;
PriKey : array of string;
str : string;
begin
SetLength(PriKey,1);
Nama_Tabel := TStringList.Create;
DM.ADOConnection1.GetTableNames(Nama_Tabel);
Ada := False;
for i := 0 to Nama_Tabel.Count-1 do
if Nama_Tabel[i] = ADOTable1.TableName then
Ada := True;
if not Ada then
Application.MessageBox('Tabel yang Anda pilih tidak terdapat pada database server!','Tabel tidak ada',MB_OK or MB_ICONEXCLAMATION)
else begin
tb_target.Close;
tb_target.Connection := DM.ADOConnection1;
tb_target.TableName := ADOTable1.TableName;
tb_target.Open;
if tb_target.FieldCount ADOTable1.FieldCount then
Application.MessageBox(‘Kedua tabel tidak memiliki kolom yang sama!’,'Kolom tidak sama’,MB_OK or MB_ICONEXCLAMATION)
else begin
//get primary key
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(‘DESC ‘+tb_target.TableName);
ADOQuery1.Open;
//DataSource1.DataSet := ADOQuery1;
i := 0;
while not (ADOQuery1.Eof) do begin
if ADOQuery1.Fields[3].AsString = ‘PRI’ then begin
PriKey[i] := ADOQuery1.Fields[0].AsString;
inc(i);
SetLength(PriKey,i+1);
end;
ADOQuery1.Next;
end;
//Lakukan iterasi
ADOTable1.First;
while not ADOTable1.Eof do begin
str := ”;
for i := 0 to high(PriKey) – 1 do
str := str + PriKey[i] + ‘ = ‘ + QuotedStr(ADOTable1.FieldByName(PriKey[i]).AsString) + ‘ AND ‘;
Delete(str,length(str)- 4,5);
DM.qrTemp.Close;
DM.qrTemp.SQL.Clear;
DM.qrTemp.SQL.Add(‘SELECT * FROM ‘+ADOTable1.TableName+’ WHERE ‘+Str);
DM.qrTemp.Open;
if DM.qrTemp.RecordCount = 0 then begin
DM.qrTemp2.Close;
DM.qrTemp2.SQL.Clear;
DM.qrTemp2.SQL.Add(‘INSERT INTO ‘+ADOTable1.TableName+’ VALUES (‘);
str := ”;
for i := 0 to ADOTable1.FieldCount – 1 do
if (ADOTable1.Fields[i].DataType = ftDate) OR (ADOTable1.Fields[i].DataType = ftDateTime) then
str := str + QuotedStr(FormatDateTime(‘yyyy’,ADOTable1.Fields[i].AsDateTime)+’-'+FormatDateTime(‘mm’,ADOTable1.Fields[i].AsDateTime)+’-'+FormatDateTime(‘dd’,ADOTable1.Fields[i].AsDateTime)) + ‘,’
else
str := str + QuotedStr(ADOTable1.Fields[i].AsString) + ‘,’;
Delete(str,length(str),1);
DM.qrTemp2.SQL.Add(str);
DM.qrTemp2.SQL.Add(‘)’);
DM.qrTemp2.ExecSQL;
end;
ADOTable1.Next;
end;
end;
end;
Nama_Tabel.Free;
end;
NOTE:
DM adalah DataModule yang berisi ADOConnection1, qrTemp, dan qrTemp2. ADOConnection1 melakukan koneksi ke database target.
Itulah kira-kira script saya. Mohon masukannya….
Jangan lupa libmysqlxx.dll disertakan … karena untuk versi sekarang 6.6.5-stable dan trunk 680 ( 7.x beta ) harus disertakan libmysql nya sesuaikan dengan versi.
Good simple Post
Salam,
Man’z
Saran yang bagus
.
Sorry all, saya lupa yang satu ini…. xixixixix..
Maha guru MySQL nih
Apakah ZEOS Stabil dan Cepat dibandingkan MySQL ODBC?
Tentu saja.
Cepat, mudah, stabil dan murah.
Anda bisa membandingkan:
1. Delphi->ADO->ODBC->ODBC MySQL Driver->MySQL Server.
dengan
2. Delphi->ZeosDBO->MySQL Server.
Mana mantap?
Sy br download versi 6.6.5-stable dr sourceforge, tp msh tetep ada eror
1. Range check error
2. Unknown mysql datatype
secara bergantian. Pd koneksi, sy set protocol k mysql dan port 80. Satu lg, klo sy mau buat app clien-server, apkh properti host yg diganti dg IP server? Ato gmn?
Sampai saat ini saya masih menggunakan versi 6.6.5-Stable (versi terakhir), dan saat developing Sistem Informasi Kepegawaian PDAM Kota Makassar, tidak ada error sama sekali pada Zeos DBO.
Saya menggunakan pada Delphi6, Delphi7 (yang saat ini saya gunakan buat developing) dan Turbo Delpgi Explorer Edition (BDS 2006). Malah, pada Turbo Delphi Explorer portable dari http://www.andyaska.com pun berjalan dengan baik.
Sebagai catatan, port 80 adalah port HTTP, sedangkan MySQL secara default menggunakan port 3306. Angka ini jarang diubah, dengan maksud menstandarkan interkoneksi berbagai tipe klien dan host MySQL.
Untuk klien server, memang benar, Anda harus mengganti nama host dengan IP/HostName komputer di mana MySQL server diinstal.
HTH
Untk koneksi brhasil connect. Sy gunakan ZTable, pd properti table name, smua nama tabel bs dilihat. Tp, sy di ‘Active’ ko eror? Sy blm coba pakai ZQuery. Any suggestion?
Saya juga sudah pakai ZQuery, dan masih mengalami hal yang sama ketika query di ‘open’….
Dalam form yang sama, saya coba menambahkan ADOConnection dan ADOQuery… Ngga ada masalah dengan Server MySQL-nya. Mohon pencerahannya….
Saya tidak menemukan libMySQLxx.dll di folder manapun dari hasil ekstraksi file Zeos? Dimana saya bisa menemukannya. Saya hanya menemukan libmysql.dll di %WINDIR%System32.
Pesan errornya apa?
libmysql.dll terdapat dalam folder %MySQL%bin, bukan bagian dari Zeos
Sm spt saat menggunakan ZTable: Range check error, atau Unknown MySQL Datatype.
Sy pengen merubah koneksi yg sy pake di aplikasi yg sdg sy buat (Sistem Automasi Perpustakaan), sementara ini sy pakai ADO. Brjalan dgn baik cuma aga lambat, trutama ktika menjalankan Query yg cukup banyak. Sy liat di thread ini Zeos cukup menarik untk dipelajari, sekaligus mengubah dominasi ADO pd program database yg pernah sy buat.
Pada query saya ada penggabungan text yang field nya berupa varchar, nah ketika program dijalankan kenapa hasilnya dalam DBGrid menjadi (memo). Mohon bantuannya biar gak jadi memo. atau gimana caranya melakukan trim ???
@KukhuRuyuK
Misal saya buat tabel dengan DDL sebagai berikut:
CREATE TABLE contoh (text1 varchar(30), text2 varchar(30)) TYPE = MyISAM;
Untuk menggabungkan 2 string atau lebih, gunakan perintah CONCAT:
SQL := ‘SELECT CONCAT(text1, ‘+QuotedStr(‘ ‘)+’, text2) as gabungan FROM contoh’;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(SQL);
Query1.Open;
Query di atas menggabungkan text1 dan text2 dengan pemisah berupa spasi. Jadi, jika text1 bernilai ‘Hallo’ dan text2 bernilai ‘Apa kabar’, maka field gabungan akan bernilai ‘Hallo Apa kabar’. Anda bisa mengubah struktur ekspresi CONCAT sesuai kebutuhan Anda.
Setahu saya jika DBGrid menampilkan value (memo) pada salah satu field-nya, berarti hasil dari Query tersebut adalah EmptySet (atau kosong).
Demikian, semoga membantu…
Sory, ada yang kurang pada tulisan :
Setahu saya jika DBGrid menampilkan value (memo) pada salah satu field-nya, berarti hasil dari Query tersebut adalah EmptySet (atau kosong).
Dikoreksi menjadi:
Setahu saya jika DBGrid menampilkan value (memo) pada salah satu field-nya, berarti Data Set-nya adalah EmptySet (atau kosong). Jika Data Set berupa table, artinya EmptyTable (tabel kosong), jika berupa query artinya query return an empty set.. Bisa jadi diakibatkan oleh pernyataan querynya atau memang tabel yang di refer oleh query tersebut juga kosong..
Sebenarnya, kosong atau tidak bukan penyebabnya…
Jika @KukhuRuyuK menggabungkan dua field dengan CONCAT(), maka hasil query selalu berupa string, bukan memo. Anda dapat mengecek kembali property FieldDefs milik Query Dataset, dengan mengklik ganda dataset tersebut. Bila terdapat FieldDefs, cek apakah hasil Field hasil gabungan bertipa apa. Ubah ke string jika perlu.
Hal lainnya, perhatikan jenis encoding yang dipake oleh MySQL disupport oleh Delphi atau tidak.
Contoh sql yang ditulis mas Roni tentu saja sudah benar, dan sebagai pembanding, Anda dapat memposting sql Anda.
HTH
Makasih mas…..
bro / sis ….
mohon pencerahannya plissss ….
aq koneksi ke mysql pke DAC for mySQL, tp wkt akses databasenya, terutama proses table pake :
while not table.eof do
begin
……
proses
……
table.next;
end;
rasanya lambat, meskipun data tidak terlalu banyak. hal ini apa karena komponennya ato bgm ya bro / sis … ???
thx b4
prosesnya mengerjakan apa? Itu intinya. Bila dapat diperjelas, mungkin akan lebih mudah dibahas
proses report bro … tentunya ada beberapa kondisi field yg harus di cek & akan diambil tindakan sesuai kondisi. ato wkt create user rights, dimana setiap record baru ada sekitar 43 field yg harus diisi, rasanya lambat bro, karena jalannya progress bar pelan, padahal itu tanpa kondisi, hanya append record, isi field (43 field) & post.
tapi klo pke query memang cepat sih, cuma klo pke query bgm bro utk menampilkan progress bar setiap record di akses ??
btw … aq cb komponen zeos, tapi …. di tabel kok ga ada fundtion FINDKEY bro ???? trus bgm cek duplicate key ? klo pke query kan kebanyakan coding bro, klo setiap findkey harus coding :
query.close;
query.sql.clear;
query.sql.add (‘select * from TABEL where (FIELD1=cFIELD1) ….
query.execsql;
if query.isempty then
// duplicate key
else
// enry record
oh ya … di DAC for mySQL, sebelum query diexecusi kan bisa di PREPARE dulu, di zeos ga perlu ya ???
thx b4
1. Zeos DBO lebih lambat dari DAC for MySQL.
2. FindKey() spesifik dataset tertentu, misalnya TTable (BDE) dan ClientDataset. Anda bisa coba Locate(); untuk Zeos.
3. Hindari FieldByName(‘x’).AsInteger/asApaAja. Sebaiknya gunakan Fields[i].AsInteger.
4. Prepare hanya untuk query berparameter. Query tanpa parameter tidak perlu diprepare.
HTH
gimna ya caranya menggunakan ZQuery buat mengirim sql ke mysql..?? Mis. kl mau input data, update data, dan hapus data…
Wah sorry baru liat komennya Mas.
Zquery gak dukung DML (Data Menipulation Language) kayak query untuk delete, update & insert.
Saya pake ZConnection, malah, untuk DML execution:
ZConnection1.ExecuteDirect('delete from user wehere id = 1');HTH
Bisa kok mas dengan Zquery
contoh :
strSql := ‘INSERT INTO tablea(id,nama)VALUES(isi_id,isi_nama)’;
ZQuery1.Append(strSql);
ZQuery1.ExecSql;
Benar sekali Mas Andre
Saya nggak tau apakah bug Zeos ataukah masalah lain. Pada banyak kasus (insert yang kompleks) seperti jurnal-jurnal transaksi pada software akuntansi, ZQuery.ExecSQL() tidak berhasil, dengan error message bahwa Tabel dalam kondisi read-only. Namun dengan ZConnection.ExecuteDirect(), saya tidak pernah menemukan masalah.
Jadi setelah cukup banyak menemukan kasus ini, pertanyaan mas @Stefen di atas saya jawab dengan “cara yang aman…”
Btw, makasih koreksinya
Misi Mas, kalo mau input database secara otomatis gimana ya.., misal masuknya tiap 1 detik sekali dengan tabel mis: | id | Waktu | Suhu | mAKLUM pEMUla. MaKasih SEbelumnya
Pake TTimer mas.
TTimer terdapat di componen palette, page System. Tambahkan ke form dan atur intervalnya menjadi 1000 (1000 = 1000 miliseconds= 1 second = 1 detik). Trus klik ganda pada Timer1 tersebut, berikut contoh kodenya:
Saya berasumsi Mas menggunakan Zeos DBO (TZTable), melihat komentar Mas pada posting tentang Zeos
Saya pake TurboDelphi, Zeos 6.6.2-RC, FB 1.5.5.
Ketika mau coba akses FB dari komputer lain, database dapat terhubung, tapi ketika mau melakukan query, muncul error sbb:
SQL Error: Dynamic SQL Error SQL error code = -901 feature is not supported. Error Code: -901. Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements The SQL: SELECT * FROM LOGIN;
Di komputer pengakses, FB client sudah diinstall.
Kira2 apa yang jadi masalah ya?
Wah, belum pernah dapat kasus begini bos.
Akhirnya, saya ganti pake MySQL kelihatannya gak ada masalah..
Misi Mas mau bertanya lagi, saya ngambil data dari mikro ke delphi, nah waktu buat grafik listingnya kayak gini
procedure TForm1.Timer2Timer(Sender: TObject);
var time:string;
suhu:double;
begin
suhu:=strtofloat(edit1.Text); –> disini untuk ngambil datanya kok gak mau ya?
time:=timetostr(now);
chart1.series[0].Add(suhu,time,clblue);
end;
apa ada cara lain untuk buat grafik di Delphi, Mohon bimbingannya Makasih?
Yang jadi pertanyaan adalah:
Ada pesan error gak? Kalo ada, apa pesan errornya??
errornya kayak gini mas “is not valid floating point value”
kalo delphi sama vb bedanya dimana mas dan kenapa mas lebih memilih delphi?
Misalkan kita ingin mampu berbahasa inggris, cara termudah pelajarilah bahasa Inggrisnya orang Amerika, karena banyak terdapat di filem dan internet. Tapi banyak kata kurang sopan, tidak beraturan bahkan salah. Demikian juga bila saya belajar VB, banyak aturan semantik bahasa, aturan penulisan dan OOP yang tidak sesuai bahkan tidak pada tempatnya.
Bila Anda cinta bahasa Inggris, belajarlah bahasa Inggrisnya orang Inggris. Memang lebih susah dan rumit, tapi lebih teratur, lebih enak didengar dan lebih sopan serta jauh dari misunderstanding.
Dengan analogi tersebut, Anda cukup paham kenapa saya memilih Delphi
Btw, yang terpenting, tentang yang mana yang Anda suka. Saya suka Delphi. Saya memujanya. Saya memilihnya. That’s All
Ya. Biasanya, angka dalam kotak teks adalah “2.566,35″ padahal yang diinginkan untuk konversi ke float adalah “2566.35″ sehingga mengakibatkan error. Perhatikan tanda titik pemisah ribuan dan koma pemisah desimal.
Anda dapat menggunakan fungsi berikut:
function UbahKeFloat(AString: String): Double; var AngkaTerformat: String; Ubah:String; f: Double; begin Ubah:=''; AngkaTerformat:=AString; if Pos('(', AngkaTerformat) > 0 then begin Ubah:='-'; Delete(AngkaTerformat,1,1); Delete(AngkaTerformat,length(AngkaTerformat),1); end; AngkaTerformat:=StringReplace(AngkaTerformat, '.','',[]); AngkaTerformat:=StringReplace(AngkaTerformat, ',','.',[]); Ubah:=Ubah+ AngkaTerformat; Result:=StrToFloat(Ubah); end;Penggunaanya cukup mudah:
HTH
mas, mau tanya lagi neh.. punya penjelasan mengenai fungsi pada masing-masing komponen zeos access pa ga?
atau link yang menjelaskan masing-masing komponene zeos access..
Gak ada Mas…
Dokumentasi Zeos sangat sedikit dan sulit dicari…
Namun keterangan singkat masing-masing komponen dapat dilihat di:
1. Dalam folder ZEOSDocReadme.html
2. Download dOxygen-generated documentation di sini.
st:=’DELETE FROM system_log WHERE log_id=42; INSERT INTO system_log( log_id) VALUES(41);’;
ZConnection1.ExecuteDirect(st);
Muncul error ‘SQL error : you have an error in your SQL syntax’
Gimana cara execute banyak command dalam sekali execute. ?
Thx
Jangan pake ZConnection atau ZQuery. Untuk rangkaian perintah SQL, gunakan ZSQLPeocessor.
ZSQLProcessor1.Script.Clear; ZSQLProcessor1.Script.Add('drop table if exists tes;'); ZSQLProcessor1.Script.Add('create table tes ( nomor int(8) );'); ZSQLProcessor1.Script.Add('insert into tes values (1);'); ZSQLProcessor1.Script.Add('insert into tes values (2);'); ZSQLProcessor1.Script.Add('insert into tes values (3);'); ZSQLProcessor1.Script.Add('insert into tes values (4);'); ZSQLProcessor1.Execute;mas ,saya mau tanya tentang zeos 6.6.6 + delphi 7 + Mysql 5.0….gini mas saya mencoba menampilkan data field Time ’00:00:00′ di dbGrid/dbText dan semacamnya tapi untuk data yang diatas tidak muncul ya, padahal di database mysqlnya data tersebut ada…tapi untuk data selain ’00:00:00′ semua muncul, sebenarnya masalahnya ada dimana ya? mohon pencerahannya…makasih…wassalam
mz, mo minta pendapat apakah cukup dimungkinkan membuat bank image di db mysql ver 5 menggunakan zeos disimpan di blob bagaimana penganturan biar aksesnya cepat terutama di baca di client .atau pendapat lain cara tekniknya..?
bagaimana juga mengsiasati pada saat queri dbnya itu ada semacam progres bar atau semacamnya agar user bisa tahu sedang menunggu proses baca data dari server. Ok sebelumnya Mz JOKO terimakasih
Mas Joko , saya mohon dibantu untuk mengambil peristiwa insert table di mysql sebagai sebuah event di form delphi , menggunakan zeos. Saya sudah coba pakai event afterinsert milik ztable kok tidak jalan ya?
Misal , mysql versi 5 milik saya ada 1 table berisi 2 kolom yang enum ( ‘merah’, ‘biru’ ) . jika client lain mengisi dengan merah , maka form merah saya akan close , jika client lain mengisnsert biru , maka form saya yang berwarna biru akan close..
Mohon berikan 2 contoh sederhana ..he.h.e..he…..Terimakasih sebelumnya
Salam kenal mas
saya juga pengguna Delphi dan Zeos
Saya lagi mau coba Zeos di Delphi 2010, kalau ada maslah bolenh dong tanya-tanya…
Thanks
sip Mas.
Good luck
bang, aku mw tanya…
kalo muncul pesan error “Acces violation at address 00000000. Read of address 00000000″
masalahnya apa ya?
mohon bantuannya… thx b4
Biasanya karena tidak kompatibelnya komponen dengan versi Delphi.
Apalagi Delphi 2006 ke atas.
Hal-hal umum seperti penggunaan PChar, penggunaan ShortString & AnsiString, dan array yang tidak sesuai aturan Delphi merupakan penyebab paling sering.
Contoh paling sederhana
procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; { sementara Form 2 belum dicreate, alias Form2 menunjuk ke memory 00000000 } end;Mas Joko thx infonya, aku mo nanya.. kalo aku pake Hostname: Localhost bisa konek.. tapi kalo aku pake Hostname: 192.168.xxx.xxx koq muncul pesan = SQL Error : Host …. is not allowed to connect to this MySQL server.
itu kenapa ya mas? mohon penjelasannya mas… thx..
Untuk tiap user, MySQL mengenal dua macam host yang terkoneksi ke server, yaitu localhost dan other host.
Localhost berarti koneksi user dari host yang sama di mana MySQL diinstall.
Otherhost berarti koneksi user tersebut dari host lain.
Kedua-duanya harus didaftarkan dalam Granted Access Table (GAT) atau tabel users di MySQL.
Anda harus membuat user baru dengan nama yang sama yang Anda gunakan saat ini, kecuali field “host” diisi dengan IP yang dijinkan untuk konek. Jadi bila Anda akan melakukan koneksi dari lima host/komputer berbeda, Anda harus mendaftarkan kelima host tersebut ke tabel users MySQL.
Ribet? Tentu saja. Jadi cukup dibuat 2 saja:
username/uid: tes
password: tesjuga
host: localhost –>> akses host lokal
username/uid: tes
password: tesjuga
host: % –>> akses dari semua host selain lokal.
Untuk membuat user seperti ini, dapat mengunakan PHPMyAdmin, Navicat For MySQL atau SQLFront For MySQL (aka. MySQLFront). Favorit saya adalah HeidiSQL yang opensource, download di sini.
HTH
Wwesyuh, cape deh.. terima kasih banyak mas bro saya udah pake cara itu hanya saya salah masukin hostnya
Salam kenal Mas Joko…
Saya cuman mo tanya sedikit, saya pakai Delphi 7 dan databesenya MSSQL server dengan ODBC untuk koneksi database. Ketika data tanggal di save ada message”[microsoft][ODBC SQL Server Driver] Optional feature not implemented” Pertanyaannya : Apakah ODBC tidak mendukung simpan data type date?, ada ngga solusinya untuk kasus seperti ini?. Terima Kasih
setau saya, baru sejak SQL 2008 yang mendukung field bertipe Date dan Time. Jadi, pada Delphi 7, fitur Date dan Time belum ada. Bila Anda menggunakan Delphi 7 Dengan SQL Server terbaru yang memiliki tipe field Date, maka umumnya akan error. Perlu penanangan khusus.
Delphi sendiri baru Delphi 2010 ke atas yang dapat mengatasi masalah ini.
Di Delphi 7, field Date di SQL Server versi-versi baru akan diubah ke TWideString, bukan TDate, sehingga akan membingungkan ADO.
Nah, saran saya, cobalah ubah tipe Date menjadi DateTime/TimeStamp di SQL Server, karena Delphi telah mendukungnya bahkan sejak Delphi 6.
Atau, coba gunakan komponen seperti UniDAC atau Zeos
Sudah saya coba ganti tipe data date menjadi DateTime/TimeStamp, tp masih eror juga. Sebenarnya kalo langsung konek ke MSSql server 2000 sih bisa untuk Save tipe data Date, tp karena konek dengan ODBC jadi eror. Saya konek data dg ODBC karena kadang coding prg delphi 7 di komp A kadang di komp B yg masing2 punya nama sql server yg berbeda, shg prg jadi eror. Terima kasih
Mas Mukti, coba samakan dulu versi SQL Servernya.
Kalau masih error, pastikan semua DLL yang dibutuhkan ADO untuk koneksi ke MS SQL Server sudah terinstal di %SYSTEM32%.
Bila masih juga error, gunakanlah ZEOS. Selain lebih cepat, juga lebih flexibel saat instalasi ke user.
mas saya mau tanya untuk koneksi pake zeos ada error pas connected tak ganti true, “Access violation blaa… blaaa… at address 0000000″, saya pake xampp dg mysql versi 5.1… terima kasih bantuannya.
Perhatikan protokol Zeos. Bila Anda menggunakan versi 5.1.x, coba property Protokol dari TZConnection diubah ke “mysqld-5″. Bila bingung, gunakan saja “mysql”.
Dan perlu saya tanya, versi Delphi berapa yang Anda gunakan. ZEOS yang tersedia di sini sangat cocok dengan Delphi 6 dan Delphi 7. Versi BDS 2006 sampai RAD Deplhi XE, tidak cocok. Ini karena Delphi 6 & Delphi 7 masih menggunakan string ANSI, sedangkan versi RAD sudah menggunakan default string WideChar/Unicode.
Bila Anda menggunakan versi BDS Delphi 2006 ke atas, gunakan ZEOS versi 7.0.0 (hasil oprekan Anak Bangsa).
Zeos versi 7.0.0 dapat didownload di sini: https://jokorb.wordpress.com/2010/11/05/download-zeos-dbo-for-delphi-200920010/
Komentar ini mungkin jadi informasi:
http://jokorb.wordpress.com/2008/09/14/koneksi-database-dengan-delphi-mysql-zeos/#comment-911
makasih mas joko, ternyata nginstallnya yg salah, hee3x
oiya mas, caranya insert data ke tabel, misal di grid tersebut ada data 5 baris, kemudian kita centang baris ke 2 dan 4. Kemudian hanya data yang dicentang tersebut yang akan di insert ke tabel. Saya menggunakan SMDBgrid. Tak cari di google pake TBookmarkstr, Mohon pencerahannya y mas…
Biasanya dengan looping pada tiap record yg ditandai pada SMDBgrid.
procedure TForm2.Button1Click(Sender: TObject); var BM: TBookmark; i:integer; begin if SMDBGrid1.SelectedRows.Count = 0 then exit; SMDBGrid1.DataSource.DataSet.DisableControls; Bm:=SMDBGrid1.DataSource.DataSet.GetBookmark; try for i := 0 to SMDBGrid1.SelectedRows.Count -1 do begin //Tandai record di dataset: SMDBGrid1.DataSource.DataSet.Bookmark := SMDBGrid1.SelectedRows.Items[i]; //insert data: ADOTable1.Append; Adotable1.Fields[0].AsString := SMDBGrid1.DataSource.DataSet.Fields[0]; // lanjutkan.... dengan field2 yg. lainnya. ADOTable1.Post; end; finally SMDBGrid1.DataSource.DataSet.GotoBookmark(BM); SMDBGrid1.DataSource.DataSet.EnableControls; end; end;Makasih mas, ilmunya manfaat banget!!
yg tak tanyakan kemarin kan tentang insert mas ya, kalo kasusnya gini :
saya punya 2 form dg SMDBgrid yg datasourcenya dr 2 tabel, form 1 tabel A, form 2 tabel B, jika di form 1 data d pilih d Grid lalu button “Ambil” dklik maka terjadi proses insert ke tabel B(Clear).
Pertanyaanya kalo tabel A terdapat jumlah barang, ketika button “Ambil” dklik maka jumlah barang yg dplih tadi berkurang (default 1 buah), hasil klik button “Ambil” akan ditampilkan d form 2. Ma’f mas agak mbulet…
Berarti tabel A harus diedit, ya?
Setiap insert ke tabel B, tabel A diedit, misalnya:
Tabel1.Edit; Tabel1.FieldByName('Jumlah').AsInteger := Table1.FieldByName('Jumlah').AsInteger - 1; Tabe1l.Post;Harus dipikirkan, jika jumlah di tabel 1 kosong, maka tidak bisa diinsert ke tabel 2. Btw, Point of Sale nih?
Iya mas betul3x….
Aq mau KKN mas, bingung mau buat apa… akhirnya buat SIM Perpustakaan sederhana, dpet materi delphi g full jd hrus cr referensi sndri….
Makasih yo mas, ma’f ngrepotin…. Newbie ne…
mas kodingq salahnya dmn? kok setiap lebih dr 1 row yg tak contreng lalu tak klik button “hapus” jumlah yg d tabel A bertambah sesuai yg tk contreng, tapi record yg berikutnya g bertambah..
misal :
* 5 ==> 5
* 5 ==> 7
harusnya :
* 5 ==> 6
* 5 ==> 6
ini codingnya :
procedure tkonfirmasi.tambah;
var
BM: TBookmark;
i:integer;
begin
if DBGrid.SelectedRows.Count = 0 then exit;
DBGrid.DataSource.DataSet.DisableControls;
Bm:=DBGrid.DataSource.DataSet.GetBookmark;
try
for i := 0 to DBGrid.SelectedRows.Count -1 do
begin
//Tandai record di dataset:
DBGrid.DataSource.DataSet.Bookmark := DBGrid.SelectedRows.Items[i];
dm.ZQuery.Edit;
dm.ZQuery.FieldByName(‘jml_buku’).AsInteger := dm.ZQuery.FieldByName(‘jml_buku’).AsInteger + 1;
dm.ZQuery.Post;
end;
finally
DBGrid.DataSource.DataSet.GotoBookmark(BM);
DBGrid.DataSource.DataSet.EnableControls;
end;
end;
Mungkin saya salah: Ini bug pada SMGDbrid. Bookmarknya gak karuan. Saya lagi kontak Mike Shkolnik (Michael Shkolnik), pembuat SMDBGrid. Semoga ada penjelasan dan perbaikan. Kita tunggu saja
Oh ya, bila Anda ingin alternatif, DBGridEh (dari EhLibrary) sangat bagus. Tidak sebagus SMDBGrid, tapi sangat stabil.
ok mas, tak coba dlu…
makasih infonya…
1. Zeos DBO lebih lambat dari DAC for MySQL.
2. FindKey() spesifik dataset tertentu, misalnya TTable (BDE) dan ClientDataset. Anda bisa coba Locate(); untuk Zeos.
3. Hindari FieldByName(‘x’).AsInteger/asApaAja. Sebaiknya gunakan Fields[i].AsInteger.
4. Prepare hanya untuk query berparameter. Query tanpa parameter tidak perlu diprepare.
kelemahan utk no 3 ap mas joko? aku pake fieldbyname, hasilnya field not found terus….
Databasenya apa?
Kalau MySQL, Anda harus menuliskan nama field persis seperti di tabel dalam database, termasuk huruf besar/kecilnya. Apit pula dengan tanda tilde [~], yang terdapat pada sebelah kiri tombol angka 1 pada keyboard Anda (QWERTY KEYBOARD).
Contoh:
NamaUser sama dengan namauser, sama juga dengan NAMAUSER,
tapi
`NamaUser` berbeda dari `namauser`, berbeda juga dari `NAMAUSER`.
Untuk nama field yang mengandung spasi, contoh Nomor Induk, tanda tilde ini fardhu/wajib digunakan.
Contoh :
`Nama Pegawai`, `nomor induk`, `Nilai Rerata`.
Moga membantu
Lazarus+Zeos+Linuxnya mana ya? Zeos 666 stble belum bisa dimasukin lazarus 9.3 niii
@guruler: Maaf. Karena kami tidak menggunakan Linux, pertanyaan Anda sulit kami jawab. Tapi yang kami tahu, Lazarus + Zeos (v.7.0.0) sangat OK (di Windows). Lazarus harus d-build ulang karena Lazarus hanya mendukung static package (terkompilasi ke IDE), tidak seperti Delphi yang mendukung dynamic package.
misis mbak numpang nanya
. . .
mbak lazarus +zeos(v.7.0.0) di windows udah saya tes dan instal, nah waktu mengaktfkn true pada zconnction n ztble/zquery udah OK, tapi wktu sy cba hubngkan ztbl/zquery tersebut ke datasource n dr datasource ke dbgrid, lazarusny compile ulang trus gx bisa debug,. . . jd gmn mbak solusinya agar brhasl wktu dhbngkan,.
oy stu lagi, android pada lazarus gmn tuh nyetingnya,, mhn bntu annya
Maaf Mas numpang tanya, saya masih pemula dalam dunia pemrograman dan Delphi. Saya punya kasus, saya pernah memprogram aplikasi database di Delphi dengan menggunakan database MySQL di komputer saya. Setelah dicompile dan dirun program tersebut saya copy ke komputer temen, nah ketika saya jalankan file exe-nya ternyata tidak bisa jalan. Kata temen saya, saya harus setting dan compile ulang di komputer teman saya itu dengan tool Delphi dan MySQL agar file exe-nya bisa jalan. Yang ingin saya tanyakan bagaimana caranya agar file exe yang saya buat bisa jalan di komputer lain yang tidak ada tool Delphi dan MySQL-nya (tanpa disetting dan dicompile ulang)?
Sebenarnya pada komen-komen di atas sudah ditanyakan dan sudah pula dijawab.
Aplikasi yang dibuat dengan Delphi & MySQL sebaiknya menyertakan setting koneksi secara portabel, agar di manapun dijalankan, bisa.
1. Aplikasi
Property HostName, User, Password dan Database disimpan di file eksternal, misalnya file SETTING-KONEKSI.INI dan dibaca saat aplikasi dijalankan. Saat kompilasi untuk di-deploy ke komputer lain, pastikan bahwa koneksi dalam keadaan tidak aktif. Jadi tidak akan muncul error karena setting koneksi default yang tidak ditemukan. Barulah kemudian aplikasi membaca file SETTING-KONEKSI.INI, memasukkannya ke property yang sesuai pada Zeos Connection, dan memanggil prosedur ZConnection1.Connect;
2. Depencies
File library MySQL yang dibutuhkan harus disertakan dalam satu folder dengan aplikasi. Yaitu file LibMYSQL.dll.
3. MySQL Server
Pastikan bahwa MySQL mengijinkan koneksi dari host luar. Misalkan Anda menggunakan user name “theadmin” dan password “thepassword” untuk koneksi MySQL saat mengembangkan aplikasi, user name ini harus dipastikan memiliki akses dari host selain localhost. Jadi buatlah dua user yang memiliki setting yang sama, kecuali pada field host. Yang satu berisi “localhost” dan satunya lagi berisi “%” (semua host). Dengan begini, user name “theadmin” dapat login dari komputer mana saja asalkan terhubung dengan komputer di mana MySQL Server berada.
Nah, tiga poin inilah yang perlu diperhatikan. Bila sudah diatur dengan benar, sangat mudah untuk memindahkan aplikasi antar PC. Bahkan Anda tidak perlu lagi mengedit file SETTING-KONEKSI.INI selama aplikasi Anda masih mengakses MySQL Server yang sama…
Semoga membantu, dan, sukses selalu buat Anda
dear mas joko dan team,
saya lagi belajar mysql, zeos delphi 6 nih mas, koneksi sudah berhasil tapi pas di run kok kenapa ada error dgn pesan “[fatal error]……..file not found ZAbstractRODataset.dcu. cara mengatasinya bagaimana ya mas. terus listing untuk simpan, tambah data, edit… sama dengan adoquery ngga, soalnya saya punya contohnya yg menggunakan adoquery. terima-kasih atas pencerahannya. sukses untuk anda dan team.