Koneksi Database Dengan Delphi, MySQL & ZEOS

Tahukah Anda, bahwa posting ini telah dipindahkan ke Tutorial Membuat Koneksi Database Menggunakan Delphi, Zeos & MySQL di website baru kami? Komentar di blog ini tidak akan kami layani lagi. Silahkan bertanya atau tinggalkan komentar pada link di atas. Viva Delphier!

Setelah tutorial 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 : https://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 Settings\user>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 Settings\user>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

  1. Ekstrak file ZEOSDBO-6.6.3-stable.zip hasil download ke sebuah folder, taruhlah, di C:\ZEOSDBO-6.6.3-stable.
  2. Masuk ke dalam folder tersebut. Cek apakah folder Packages\DelphiX\Build 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 Packages\Delphi6\Build. Jika folder Build belum ada, buatlah dulu.
  3. Jalankan Delphi. Dari Delphi, buka file ZeosDbo.bpg dari folder Packages\DelphiX. Kompile semua project dari menu Project>Compile All. Berikut Binary Package yang harus terkompilasi:
    • ZCore60.bpl
    • ZParseSql60.bpl
    • ZPlain60.bpl
    • ZDbc60.bpl
    • ZComponent60.bpl

  4. Sudah? Close All. Tambahkan path folder C:\ZEOSDBO-6.6.3-stable\Packages\DelphiX\Build 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-stable\Packages\DelphiX\Build 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.

  5. Tinggal menginstal komponen-komponen akses data di Component Palette. Buka file ZComponentDesign.dpk dalam folder C:\ZEOSDBO-6.6.3-stable\Packages\DelphiX. 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.

  1. Buat sebuah aplikasi baru.
  2. 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.
  3. Atur tata letak komponen-komponen agar enak dilihat. Saya membuatnya seperti ini:
  4. 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.
  5. Atur juga properti TZConnection yang lain seperti gambar berikut:
  6. 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.
  7. 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 tutorialLink 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:

Selamat Mencoba. Untuk Mba’ Euis Marlina, thanks berat atas postingnya.

177 thoughts on “Koneksi Database Dengan Delphi, MySQL & ZEOS

  1. Yohanes

    Terima kasih infonya. saya baru mulai pake postgres dan zeos.
    Sekalian nanya nih, emang cara penulisan syntax di sql nya mesti pake tanda kutip ya untuk nama tabel, nama field baik untuk insert, update dan delete?

    Reply
  2. jokorb Post author

    Buat Gaptek_club:
    Bisa Boss….
    Ganti dulu tuh ekstensi filenya dari ppt ke zip.

    Buat Yohanes:
    Gak juga kok. Kalau PostgreeSQL punya aturan sendiri yang mesti pake tanda petik, ya, saya juga baru dengar. Kebanyakan itu opsional kalau dalam nama tabel dsb. ada spasi.

    Reply
    1. wawan

      mas,mau tanya nich,,database ku waktu tak akses pada komputer client kug muncul tulisan gini ya ” SQL Error: Can’t connect to MySQL server on ‘127.0.0.1’
      padahal pada ZConnection1 bagian host name udah tak isi IP Address server.apa ada bagian2 lain yang harus disetting ya mas???
      tolong bantuannya ya mas…

      Reply
      1. Joko Rivai Post author

        Periksa Firewall di komputer server. Pastikan MySQL Server (dan port 3306) telah dizinkan oleh Firewall untuk diakses dari komputer lain.

    2. wawan

      terima kasih bozz…oy mau tanya kalo prosedur ngopy file pada delphi gimana ya?.contohnya gini: misalkan aku punya file “a”, trus ketika program aplikasi tak run,maka secara ototmatis file “a” itu ngopy ke drive sesuai dengan setting pada program aplikasi yang udah aku buat…

      Reply
      1. Joko Rivai Post author
        CopyFile(PAnsiChar('c:\a.txt'), PAnsiChar('F:\b.txt'), False);
        {
        buat melakukan kopi file dari a.txt ke b.txt
        }
        
    3. wawan

      terima kasih atas tutorialnya mas,,,sekarang database ku di server udah connect ke client…semoga sukses selalu buat ms joko..

      Reply
  3. yohana

    mau tanya neh….
    kalau misalnya, ada 2 user yang berbeda, meng-edit record yang sama, akan terjadi error pada saat penyimpanan data.
    apa yang harus dilakukan yah?
    tanpa harus disconnect zconnection nya.
    help me plz…..
    thx

    Reply
  4. jokorb Post author

    Yohana, Server databasenya pake apa? Hampir semua RDBMS baik yang lokal maupn yang n-tier sudah mendukung konsep locking dan transaksi. MySQL, MS Access, secara default menyediakan mekanisme locking yang memproteksi sebuah record diedit bersamaan. Caranya dengan mencatat sebuah perubahan di penyimpanan sementara (tergantung locking-method) saat user lain melakukan perubahan. Perubahan kedua baru akan dilakukan ke record sesungguhnya saat yang pertama selesai.

    Untuk menjamin integritas data, opsi transaksi bisa dipertimbangkan, sehingga kolisi (tabrakan perubahan data) bisa diminimalkan.

    Untuk database BDE bawaan Delphi, file PDOXUSRS.NET di drive C:\ digunakan untuk tujuan locking, meskipun sudah tidak direkomendasikan lagi penggunaanya.

    gaptek_club,
    Menurut saya, ZEOS adalah yang termudah, kecuali proses instalasinya. Anda bisa mencoba MyDAC (DAC For MySQL) dan MySQLDAC. Websitenya saya lupa, silahkan googling dulu dah :-). DBExpress tentu saja jangan dilupakan, hanyasanya, dukungan versi MySQL kadang membingungkan. Untuk penggunaan DBExpress + Delphi + MySQL, Anda bisa cek di sini.

    Trims atas komentarnya…
    Salam.

    Reply
  5. yohana

    aku pake db firebird dan zeos utk koneksinya ke delphi.
    cm, biasanya klo terjadi lock kya gitu, kita kan tinggal refresh zquery nya. ini koq gak bisa yah? harus disconnect dl zconnectionnya baru bs refresh data.
    pny ym gak?
    plz add me: johana_tiro
    i need ur help.
    thx a lot

    Reply
  6. Endri Wiguna

    Allow cmuanyanya..
    Critanya aku simpan server database nya di kompi1, pake wamp v2.

    trus diakses pake zeos di kompi 2(satu jaringan),kok gk bisa ya??

    ada tulisan eror +- “SQL error : Host xxxx not allowed to connect to this MYSQL server”

    Mohon pencerahan para sesepuh…

    Reply
  7. jokorb Post author

    Silahkan cek apakah MySQL Server mengijinkan akses dari kompi2? Defaultnya cuma localhost. Selain localhost, hanya bisa dengan akun ROOT dan password .

    Silahkan cek di database mysql, tabel users.

    HTH dan salam kenal.

    —————————————–

    Untuk Yohana, saya ga’ coba Zeos dengan FB. Jadi belum bisa saya jawab dengan pasti. Kalau ZQuery.Requery() ga bisa juga? Atau ZQuery.ReOpen()?

    Reply
  8. jokorb Post author

    Mohon maaf sebelumnya, Mas Izal. Beberapa saat lalu saya pernah ditanya yang mirip, jadi jawabannya sama: Saya belum pernah pake Crystal Report di Delphi, juga development tool lainnya.

    Tapi berikut link yang mungkin bisa membantu Anda:
    Crystal Report Tutorial PDF.

    Reply
  9. Eka

    Trims, Mas. Blognya bagus juga. Kebetulan saya juga Delphi user. Oh ya, Mas. Kalau boleh tanya, gimana caranya bikin database jaringan di MySQL? Soalnya saya bingung cari record lock-nya kok nggak ada, padahal di foxpro ada? apa mesti pakai Lock Tables ya?

    Trims.

    Reply
  10. jokorb Post author

    MySQL sudah otomatis lock. FoxPro masih menggunakan metode locking konvensional, menggunakan metode file-sharing, sedang MySQL sudah lebih advanced dan selalu berbentuk client-server, kecuali untuk kasus-kasus tertentu, misalnya untuk embedded version.
    🙂

    MySQL menggunakan table-level locking untuk tabel-tabel bertipe ISAM, MyISAM dan Memory Tables atau HEAP Tables. Untuk tipe DBD, MySQL menggunakan page-level locking. Untuk locking per record (row-level locking), MySQL mengaplikasikannya pada tipe table InnoDB, yang merupakan jenis terbaik untuk transaksi skala besar dan frequensi update data yang tinggi. Tentu saja dengan beban pada komputer mesin server MySQL yang lebih besar. Masing-masing dengan lebih-kurangnya lah 🙂

    Reply
  11. nunks_is_man

    Ass…Kum Salam kenal Semuanya.

    Mas, gimana caranya membuat aplikasi client server menggunakan delphi & mysql klo ada modulnya emaillin ke saya donk. Jadi Gini mas aplikasinya bisa dipake bareng2 dlm waktu yg bersamaan. Soalnya Saya butuh buat bikin Laporan KP & yang nantinya bisa diteruskan ke Skripsi

    Tks

    Reply
  12. jokorb Post author

    Soal modul sih, ga ada 😦

    Tapi untuk software kayak yang dimaksud, contoh-contoh yang tersedia di internet sangat banyak. Silhakan di sini. Contoh yang terdapat di sini juga sudah bisa digunakan, tinggal dikembangkan saja :-).

    Dan ya, FYI, semua software database client-server dengan database MySQL adalah multi-user alias bisa dipake banyak user secara bersamaan.

    Demikian, semoga membantu. Dan salam kenal 🙂

    Reply
  13. nunks_is_man

    Tks Infonya

    Oia saya mo nanya lagi neh
    Saya instal komponen zoes di PC yang satu sukses terinstall & berjalan dgn mulus trus saya instal lagi di PC yang satu lagi dgn step yang sama kok error trus ya.

    Reply
  14. Cak Rodhi

    Mas aku pengen tanya…mohon dibantu ya..
    1. saya koneksi database mysql pakek zeos, yang terdiri banyak form, dan zconnectionnya aku taruh di menu utama, ketika zconnectionya aku putus koneksinya “zconnection.disconnect” dan saya masuk ke form yang lain dan terkoneksi databasenya dengan zconnection yang ada di menu utama, kok masih aktifya..walaupun udah disconnect. apa karna lain form ya..”koneksi tabel yang lain melalui zconnection yang ada di menu” ex. zquery.connection:=fmenu.zconnection
    2. gimana mas cara integrasi file help chm di delphi..

    Terima kasih atas bantuanya.

    Reply
    1. jokorb Post author

      Bila Dataset diaktifkan sementara ZConnection sedang tidak aktif, ZConnection akan diaktifkan secara otomatis oleh Datasetnya.

      Tentang penggunaan/integrasi file help dengan aplikasi Delphi, saya sudah menulisnya di sini.

      Reply
  15. mayo

    bos2..
    mau tanya kalo cara koneksi dari postgreSQL menggunakan delphi 7 bagaimana yah?
    tolong dibimbing seperti koneksi dari mySQL ke delphi…
    thx b 4…

    Reply
    1. jokorb Post author

      Mohon maaf bos, saya ga pake PostgreeSQL, jadi untuk tutorialnya mungkin ga bisa sekarang. Tapi pada dasarnya, koneksinya sama saja dengan MySQL, yang berbeda (signifikan), hanyalah setting koneksinya:

      1. Pada ZEOS, perbedaan terletak pada protokol koneksi yang dipake, yang lainnya, seperti host, username, password dan database, pada dasarnya sama saja.

      2. Pada DBExpress, yang berbeda adalah setting koneksi saat Anda membuat koneksi baru, yaitu tipe koneksi, yang lainnya beda-beda tipis saja 🙂

      Sorry tutorialnya belum bisa sekarang….

      Reply
  16. Roni

    Jumpa lagi Mas Joko di Thread yang berbeda…
    Mudah-mudahan ngga bosen, saya yakin Mas Joko semakin bertambah ilmunya dengan menjawab semua pertanyaan di Forum yang Mas buat, bahkan sampai di kirimi e-mail secara khusus untuk menjawab pertanyaan yang sekiranya panjang…

    Mau tanya tentang metode LOCKING database MySQL. Udah otomatis atau perlu di konfigurasi manual (atau request ke Server MySQL agar melakukan LOCKING). Locking kan biasanya diterapkan hanya pada satu record pada sebuah tabel. Bagaimana jika memiliki relasi antar tabel??? Apakah semua tabel-tabel yang saling berrelasi di-locking sesuai dengan record yang sedang aktif??? NNNN, kalo boleh tau MySQL menerapkan method lockingnya apa??? Thanks….

    Saya dulu dapet kuliahannya, cuman lupa… (Maklum, saya anak Matematik, bukan ILKOMP)…

    RAVE
    Apakah bisa mendesain RAVE saat run time… Karena koneksi ke database juga dilakukan saat run time..

    Apakah Ada Quick Report yang stabil??? Saya pakai bawaan Delphi 7. Koq banyak banget BUGS-nya, terutama FONT dan tampilan… Setting Printer juga ngga nyambung….

    Makasih atas jawabannya…

    Reply
    1. jokorb Post author

      MySQL otomatis melakukan locking saat terjadi update. Teramasuk untuk multitable. Tapi untuk yang multitable (relasi) update, sebaiknya manfaatkan transaksi. Silahkan kunjungi MySQL website untuk info lebih lengkap.
      Setau saya, Transaksi optimal pada MySQL jika Anda menggunakan tipe InnoDB untuk tabel-tabelnya. MySQL menggunakan row dan table, serta isolation level locking. Tergantung tipe tabel. Untuk MyISAM dan in-memory table, MySQL mengunakan table-level, sedang InnoDB, MySQL menggunakan row-level locking.

      Rave sudah lama saya tidak gunakan, soalnya ga fokus ke database sih. QuickReport memang mengandung BUG. Rave juga, kadang ada halaman yang ga keprint. Baiknya sih pake FreeReport/FastReport.

      Maksud Rave disesain saat runtime bagaimana? Koneksi DB bisa kok saat design time. Ntar kalau sudah jadi, baru dimatikan lagi buat nanti runtime koneksinya.

      Reply
    2. jokorb Post author

      MySQL otomatis melakukan locking saat terjadi update. Teramasuk untuk multitable. Tapi untuk yang multitable (relasi) update, sebaiknya manfaatkan transaksi. Silahkan kunjungi MySQL website untuk info lebih lengkap.
      Setau saya, Transaksi optimal pada MySQL jika Anda menggunakan tipe InnoDB untuk tabel-tabelnya. MySQL menggunakan row dan table, serta isolation level locking. Tergantung tipe tabel. Untuk MyISAM dan in-memory table, MySQL mengunakan table-level, sedang InnoDB, MySQL menggunakan row-level locking.

      Rave sudah lama saya tidak gunakan, soalnya ga fokus ke database sih. QuickReport memang mengandung BUG. Rave juga, kadang ada halaman yang ga keprint. Baiknya sih pake FreeReport/FastReport.

      Maksud Rave disesain saat runtime bagaimana? Koneksi DB bisa kok saat design time. Ntar kalau sudah jadi, baru dimatikan lagi buat nanti runtime koneksinya.

      Reply
  17. Roni

    Saya mencium sesuatu yang memusingkan… (ABOUT InnoDB dan Transaksi…)

    Rave desain saat runtime?? Maksud saya, di sana ada semacam QRDBText (kalo di Quick report), saya bisa mengatur Field-nya saat run time. Tapi, karena di rave disimpan di file terpisah (.rav) saya tidak bisa mengatur layaknya sebuah variabel…

    About back up??

    Reply
  18. bejitalun

    aku coba koneksi ko kluar ini ya…

    ERROR 1251: Client does not support authentication protocol requested by server; consider upgrading MySQL client

    gimana caranya om??biar g eror lagi…

    thanks..

    Reply
    1. jokorb Post author

      Penggunaan Server MySQL yang ebih baru dari yang didukung client (dalam hal ini LibMySQL.dll yang dipakai oleh Delphi) biasanya akan memunculkan pesan seperti ini, terutama saat login.
      Anda dapat menggunakan LibMySQL.dll yang terdapat dalam folder %MySQLServerFolder%\Bin, dikopi ke %Windows%\System32 untuk menjalan program sebagai RTL, dan kopi juga ke %DelphiFolder%\Bin untuk keperluan desain pada Delphi.
      Penanganan lebih lanjut dapat Anda peroleh di http://lists.mysql.com/mysql/179529

      Reply
  19. jokorb Post author

    Untuk permasalahan Range Check Error, menurut developer ZEOS DBO, merupakan bug yang pada versi 6.6.3 (yang saya gunakan dalam tutorial ini) telah diperbaiki.

    Bila Anda menggunakan versi yang lebih lama, cobalah mengupgrade dari dengan versi 6.6.3 atau yang lebih baru.

    Reply
  20. bejitalun

    saya menggunakan zeos terbaru
    ZEOSDBO-6.6.4-stable
    dan kedua pesan eror di atas (yg pernah saya tulis seblumnya) ada…kalo yg 6.6.3 seperti yg mas joko pakai…saia belum mencobanya…

    Reply
    1. jokorb Post author

      @BEJITALUN:
      Bagaimana dengan LibmySQL? Perlu Anda informasikan versi Delphi, MySQL Server dan versi ZEOS. Jika ZEOS sudah OK, coba cek lagi MYSQL servernya versi berapa. Saya tidak ingat pasti, tapi ada versi MySQL yang tidak disupport oleh Delphi versi tertentu. Zeos bisa membantu mengatasi perbedaan ini, tapi pastikan LibMYSQL.dll yang digunakan oleh ZEOS maupun delphi dan juga saat runtime nanti benar-benar sesuai dengan versi MySQL.
      Saya sarankan, gunakan LibMYSQL yang terdapat pada folder %MYSQL_FOLDER%\Bin.

      Reply
  21. pcdwi

    halow…
    saya jg baru belajar koneksi mysql dg zeos 6.6.1 beta dan delphi 6 …saya udah mencoba buat aplikasi sederhana sama sperti yg ada di ‘Contoh Aplikasi Menggunakan Zeos Database Object’ yg jokorb buat….tp pada saat di F9
    muncul 3 baris error yaitu:

    1.[Warning] ZDbcConnection.pas(763): Return value of function ‘TZAbstractConnection.PingServer’ might be undefined

    2.[Error] ZPlainMySqlDriver.pas(988): Undeclared identifier: ‘ValueFromIndex’

    3.[Fatal Error] ZDbcMySql.pas(64): Could not compile used unit ‘ZPlainMySqlDriver.pas’

    ada yg bisa bantu gak salahnya dimana..?
    bingung 😦
    saya udah nambahin semua file dll yang ada di foler master zeos \ lib\mysql\

    Reply
    1. lodvan

      mau tanya gan,,,,cara koneksikan zeos ke mysql hosting bagai mana ya gan,,saya coba2 ga bisa2

      Reply
  22. jokorb Post author

    @PCDWI:

    Ada unit yang diperlukan oleh Aplikasi Anda tapi tidak ditemukan oleh Delphi. COba perhatikan lagi langkah-langkah instalasinya, terutama pada library path yang harus disertakan (Langkah 4.). Bila Anda kurang yakin, tambahkan saja semua subfolder dalam folder ZEOS ke Library Path.

    Bila masih error, download lagi ZEOS DBO yang baru untuk memastikan tidak ada file yang hilang/korup.

    Reply
  23. pcdwi

    Trimakasih untuk jawabannya…kalo mau install ulang, gmana dg component zeos yg udah ada di component pallete?
    apakah dibiarkan saja …? lalu melakukan langkah instalasi dari pertama lg?…terimakasih

    Reply
  24. pcdwi

    halow saya bertanya lagi yah….
    saya bingung langkah ke 4 yang menyatakan
    1.”close all” berarti menutup delphi juga ya…?
    2.”Klik tombol elipsis yang dilingkari, pilih folder C:\ZEOSDBO-6.6.3-stable\Packages\DelphiX\Build di mana Anda meletakkan Zeos DBO hasil kompilasi.”

    hasil kompilasi maksudnya yg mana ya..?

    Reply
  25. jokorb Post author

    @pcdwi:
    Instalasi ulang sebaiknya mengikuti petunjuk upgrade daari ZEOS developer (biasanya disertakan dalam paket download).

    Ini untuk memudahkan, sebab, ada upgrade yang tidak menambahkan folder baru dan komponen baru, dan ada juga yang menyertakan komponen baru/folder baru.

    Untuk menghapus komponen di komponen palette, coba lewat menu COmponent>Configure Packages, dan hapus komponen-komponen milik Zeos.

    1. Close All berarti klik menu “FILE>CLOSE ALL” 🙂
    2. Hasul kompilasi maksudnya hasil kompilasi package (file-file *.BPL). Bila langkah 3. telah dilakukan dengan benar tanpa error, dalam folder “C:\ZEOSDBO-6.6.3-stable\Packages\DelphiX\Build” akan tersimpan file-file *.BPL hasil kompilasi pada langlah 3.

    Demikian, HTH.

    Reply
  26. pcdwi

    dear
    thanks untuk jawabannya…saya udah nyobain lg udah berhasil menginstall…lalu sy coba buat aplikasi menyertakan zconnection,ztable,datasourcer,dbgrid…pd zconection udah bisa conek tp saat di f9…
    muncul error…wah jd mkn pusing…

    [Fatal Error] Unit1.pas(7): Unit ZConnection was compiled with a different version of ZDbcIntfs.IZConnection

    saya skrg pake zeos 6.6.4 stable,mysql server 5,delphi 6..

    terimakasih sblmnya…

    Reply
  27. salam kenal mas..

    Salam sejahtera bos..
    saya mau tanya . Pertanyaan saya sama dengan
    Endri Wiguna

    ketika hostnamenya saya ganti dengan ip address dan kebetulan saya memakai wamp server terdapat tulisan eror +- “SQL error : Host xxxx not allowed to connect to this MYSQL server”

    Mohon pencerahan para sesepuh…

    Reply
  28. jokorb Post author

    Anda harus mensetting nama user yang Anda gunakan untuk koneksi.
    misalkan usernya “contoh”, Anda harus menggrant akses untuk user contoh pada host “localhost’ dan “%” (sembarang host).

    Navicat MySQL atau SQLFront for MySQL dapat membantu. Atau bila tidak, PHPMyAdmin bawaan WAMP juga bisa membantu Anda melakukan granting akses ini. 🙂

    Reply
  29. pcdwi

    hai bang joko..jumpa lagi..
    gini mau berbagi aja,sy bingung setelah berhasil menginstall zeos ke component pallete delphi,sya coba buat aplikasi spt yg anda buat tp saat sya jalankan muncul error.

    [Fatal Error] ZComponent.inc(54): File not found: ‘..\Zeos.inc’

    sya udah copy file tsb ke foler tmp project sy, tp tetap muncul terus..sya sblmnya udh tambah file2 dari folder src tp stuck tetap di error di atas..
    sbnarnya sy salah dimananya yah … ??
    bisa tolong dibantu gak..ato bang joko tau situs lain yg bisa jadi rujukan..? thanks

    Reply
  30. Arie Barata

    Saya donwload ZeosDBO versi 6.6.4 itu di dalam file .zip tidak ada folder lib yang untuk dicopykan di C:\Windows\System32 lalu itu gimana? Karena DB yang saya gunakan yaitu MySQL 5.x

    Reply
  31. erix

    mw tanat klo buat form login ahar dapat nyambung dengan database gimana ya??

    misalnya:
    id :
    password :

    ,login,

    lha agar bisa konek ke table gimana ya??

    Reply
  32. Ohay

    gimana cara merefresh Ztabel menggunakan thread, sering muncul acces violation
    Karena update memakai ZQuery. penegn langsung tau perubahannya di DBGrid otomatis Ztable mesti di refresh (ZTable->datasource->dBGrig)

    kendalanya sring muncul “acces violation…..”

    Trime kasih

    Reply
  33. henry

    mas saya ambil artikelnya ya…..terima kasih sebelumnya….dan sukses selalu untuk anda dan jangan berhenti untuk menulis…saya mendukungmu…..

    Reply
  34. afdal

    mas tolong dong gimana tuh cara koneksi database yang bertype paradox ama program delphi yang saya buat ???plis dong beri pencerahan ???

    Reply
  35. jokorb Post author

    Yang benar adalah file LibMYSQL.dll, harus disertakan satu folder dengan file exe aplikasi yang kita buat. Atau, diletakkan di folder %WINDOWS%\System32 biar lebih aman.
    🙂

    Reply
  36. cecep

    mas saya mau nanya nih
    saya coba mau koneksi db dg zeos
    setelah properti2 pendukung tuk koneksi ke db saya isi
    trus saya isi properti connection menjadi true keluar pesan

    dynamic library libmysqlclient.so not found

    itu knapa ya?
    mohon bantuannya
    terima kasih

    Reply
  37. Roni

    Sy pake ADO untk koneksi ke MySQL dg driver MySQL ODBC 3.51 Driver. Sy punya SQL Script, sy load, kemudian dimasukkan ke ADOQuery (dgn bbrp teknik). Nah, jika ada baris perintah untk INSERT sementara terjadi duplikasi Primary Key, maka Program menampilkan pesan kesalahan bhw tlh trjadi duplikasi, lalu program keluar. Bgmn caranya agar program tdk langsung keluar, tetapi mengeksekusi perintah SQL brktnya. Sy sdh pake try…finally g ngebantu. Please?

    Reply
  38. jokorb Post author

    @Cecep: Loh? kok libmysqlclient.so?
    itu kan hanya untuk Linux-based Delphi (Kylix)? Yang under Windows, Zeos hanya memerlukan LibMySQL.dll…
    Coba baca komen2 yang lebih awal di atas, tentang masalah tidak ditemukannya LibMySQL.dll

    @Roni:
    1. Primary Keynya Apa? Bila int(x) dengan opsi Auto_Increment, maka nilai field ini pada script SQL sebaiknya dihilangkan untuk menghindari duplikasi.

    2. Error Trapping pada Delphi , ya, Try..Finally dan try.. Except.
    Sejauh info di komen Anda, saya gak bisa mendiskusikan lebih lanjut. Kecuali Anda menyertakan potongan skripnya, untuk saya lihat terlebih dulu….

    Reply
  39. Roni

    Permasalahan sebenarnya, apakah Ada suatu prosedur pada Delphi yang bisa menangkap error yang diakibatkan oleh kesalahan pada Query. Istilahnya, setelah terjadi error langsung continue ke perintah query berikutnya. Biasanya kalo ada eror seperti itu, Delphi langsung break dan terminated the application. Ini saya sertakan potongan scriptnya:

    var
    SQLScript : string;
    //script SQL diload ke dalam memo
    procedure TForm1.LoadSQLScript1Click(Sender: TObject);
    begin
    if OpenDialog1.Execute then begin
    SQLScript := OpenDialog1.FileName;
    Memo1.Clear;
    Memo1.Lines.LoadFromFile(SQLScript);
    end else begin
    SQLScript := EmptyStr;
    Memo1.Clear;
    end;
    end;

    //Saya gunakan istilah InjectData (merge data, dari external tabel ke tabel yang sudah ada)
    procedure TForm1.InjectData1Click(Sender: TObject);
    var
    i : integer;
    s : string;
    begin
    if Memo1.Lines.Count > 0 then begin
    i := 0;
    repeat
    s := ”;
    //salin script hanya yang merupakan perintah
    //CREATE atau INSERT
    repeat
    s := Memo1.Lines[i];
    inc(i);
    until (Pos(‘CREATE’,s) 0) OR (Pos(‘INTO’,s) 0);
    dec(i);
    s := ”;
    repeat
    s := s + Memo1.Lines[i];
    inc(i);
    until (copy(s,length(s),1) = ”) OR (copy(s,length(s),1) = ‘;’) OR (i > Memo1.Lines.Count) OR (copy(s,length(s),2) = ‘-‘);

    if (Pos(‘CREATE’,s) 0) OR (Pos(‘INTO’,s) 0) then begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add(s);
    ADOQuery1.ExecSQL; //Disini, kalau s merupakan
    //perintah INSERT dan terjadi
    //duplikasi key, maka delphi
    //akan mem-break program
    //Saya inginnya, Delphi tidak
    //melakukan apa-apa, cukup
    //perintah tersebut tidak diekse
    //kusi. Jadi langsung mengerja
    //kan perintah berikutnya
    //(pakai repeat).

    inc(i);
    until i > Memo1.Lines.Count;
    end else
    ShowMessage(‘There”s no SQL Script loaded.’);
    end;

    Tengkyu…(maaf, saya posting comment di atas pakai HP, jadi ngga mungkin nulisin script yang panjang gitu…)

    Reply
  40. Roni

    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?

    Reply
  41. jokorb Post author

    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.

    Reply
  42. Roni

    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

    Reply
  43. Roni

    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)+’bin\script.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)+’bin\script.sql’) then
    DeleteFile(ExtractFilePath(Application.Exename)+’bin\script.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…

    Reply
  44. indri

    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

    Reply
    1. Joko Rivai Post author

      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 🙂

      Reply
  45. Roni (onny Thea)

    @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)+’bin\script.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….

    Reply
  46. ManzTiara

    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,
    :mrgreen:
    Man’z

    Reply
    1. Joko Rivai Post author

      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?

      Reply
  47. Roni

    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?

    Reply
    1. Joko Rivai Post author

      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 🙂

      Reply
  48. Roni

    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?

    Reply
  49. ROni

    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.

    Reply
  50. Roni

    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.

    Reply
  51. KukhuRuyuK

    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 ???

    Reply
  52. Roni

    @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…

    Reply
  53. Roni

    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..

    Reply
    1. Joko Rivai Post author

      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 🙂

      Reply
  54. delphier

    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

    Reply
      1. delphier

        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

  55. Joko Rivai Post author

    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 🙂

    Reply
  56. stefen

    gimna ya caranya menggunakan ZQuery buat mengirim sql ke mysql..?? Mis. kl mau input data, update data, dan hapus data…

    Reply
    1. Joko Rivai Post author

      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 🙂

      Reply
      1. Andre

        Bisa kok mas dengan Zquery
        contoh :
        strSql := ‘INSERT INTO tablea(id,nama)VALUES(isi_id,isi_nama)’;
        ZQuery1.Append(strSql);
        ZQuery1.ExecSql;

      2. Joko Rivai Post author

        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 🙂

  57. Bliss

    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

    Reply
  58. Joko Rivai Post author

    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:

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Ztable1.Append;
      //ZTable1['id']:=0; --> bisa dipastikan id ini adalah aouto increment 🙂
      Ztable1['waktu']:= Time();
      ZTable1['suhu']:=35.63;
      ZTable1.Post;
    end;
    

    Saya berasumsi Mas menggunakan Zeos DBO (TZTable), melihat komentar Mas pada posting tentang Zeos 🙂

    Reply
  59. Albert

    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?

    Reply
  60. Bliss

    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?

    Reply
  61. bliss

    errornya kayak gini mas “is not valid floating point value”
    kalo delphi sama vb bedanya dimana mas dan kenapa mas lebih memilih delphi?

    Reply
    1. Joko Rivai Post author

      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 🙂

      Reply
  62. Joko Rivai Post author

    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:

    Suhu := UbahKeFloat(Edit1.Text);
    

    HTH 🙂

    Reply
  63. wawan

    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..

    Reply
  64. amri

    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

    Reply
    1. Joko Rivai Post author

      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;
      
      Reply
  65. yudhi

    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

    Reply
  66. yudit

    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

    Reply
  67. ratno

    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

    Reply
  68. niki

    bang, aku mw tanya…

    kalo muncul pesan error “Acces violation at address 00000000. Read of address 00000000”
    masalahnya apa ya?

    mohon bantuannya… thx b4

    Reply
    1. Joko Rivai Post author

      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;
      
      Reply
  69. Harry

    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..

    Reply
  70. Joko Rivai Post author

    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 🙂

    Reply
  71. mukti

    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

    Reply
    1. Joko Rivai Post author

      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

      Reply
      1. mukti

        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

      2. Joko Rivai Post author

        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.

  72. riagil

    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.

    Reply
    1. Joko Rivai Post author

      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:
      https://jokorb.wordpress.com/2008/09/14/koneksi-database-dengan-delphi-mysql-zeos/#comment-911

      Reply
  73. riagil

    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…

    Reply
    1. Joko Rivai Post author

      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;
      
      Reply
  74. riagil

    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…

    Reply
    1. Joko Rivai Post author

      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? 🙂

      Reply
  75. Riagil

    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…

    Reply
  76. riagil

    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;

    Reply
  77. Joko Rivai Post author

    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.

    Reply
  78. Riagl

    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….

    Reply
    1. Joko Rivai Post author

      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 🙂

      Reply
    1. Rivalina

      @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.

      Reply
      1. sandi

        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

  79. Indra

    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)?

    Reply
  80. Rivalina

    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 🙂

    Reply
  81. saiful anwar

    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.

    Reply
  82. Rivalina

    Coba lihat langkah-langkah instalasi Zeos di atas. Perhatikan nomor 4., yang menunjukkan penambahan file-file library Zeos ke Delphi Library (Win32). Bila Anda melakukan dengan benar, error tersebut tidak akan muncul.

    Soal listing, sebenarnya sama saja

    ZQuery1.Append;
    ZQuery1.FieldByName(‘Nama’).AsString := ‘Nama Saya.’;
    ZQuery1.Post;

    Ada beberapa perbedaan, tapi secara umum sama saja.

    Reply
  83. saiful anwar

    makasih mas sekarang sudah bisa…. tapi ada yang lain nih mas, dalam penginputan data sebaiknya menggunakan dbEdit atau Edit ya mas… terus kalau saya memfilter data dengan perintah:
    ZQuery1.Filtered:=False;
    ZQuery1.Filter:=’tgl_layanan like’+QuotedStr(‘%’+Edit1.Text+’%’);
    ZQuery1.Filtered:=True;
    kok error ya mas… “…Access violation at address 005D6529…” padahal sebelum saya pindah menggunakan mysql lancar-lancar aja. sebelumnya saya pakai database access dan ado sebagai koneksinya, tapi sesuai panduan dan komentar dari blok anda saya sekarang coba dan bisa pakai zeos dan mysql server. tapi tetap saja banyak kendalanya… o’ya mas… ada ngga buku yang menjelaskan database mysql server dengan delphi.
    makasih ya atas penjelasannya

    Reply
  84. Rivalina

    Pastikan data tanggal dalam Edit1.Text berformat “yyyy-MM-dd”, misalnya “2011-06-29”..

    Reply
  85. saiful anwar

    maaf ya saya konsul terus….sekarang saya lagi coba buat program kecil klinik gigi saudara saya yang akan digunakan oleh 3 user sekaligus, tolong masukannya dong karena saya belum pernah membuat program multi user. yg jadi pertannyaan saya… koding multi user dengan koding single user apakah sama atau ada penambahan yang belum saya ketahui… sekali lagi saya mohon maaf karena konsul terus…. tolong pencerahannya ya… alat bantu yg akan saya gunakan delphi6-zeos6-mysql yg ada di xamp.

    Reply
  86. saiful anwar

    dear mas… mas posting di atas tanggal 30 May 2011 at 12:12 pm nerangin pembuatan file *.INI, lalu file tersebut dibaca pertama kali saat program runing, lalu membuat dua user, tolong lebih rinci neranginya dong…. saya menggunakan delphi dan xamp…. makasih ya atas penjelasannya….

    Reply
  87. yunidotcom

    Maaf, numpang tanya Mas, gimana ya caranya saya mendeteksi adanya record baru di mysql (pakai timer atau ada event khusus?..) di delphi ?… , jadi ketika ada record baru program akan memberitahukan dalam bentuk ‘alert’ lalu langsung menampilkan record baru tersebut saat itu juga secara realtime. Terima kasih…

    Reply
  88. Buyut Joko Rivai

    Tergantung tujuannya.
    Tempo hari saya paka SQL Logger (Di Zeos ada namanya TZSQLMonitor, jangan lupa tambahkan unit ZSQLMonitor ke uses list…). Jadi tiap ada eksekusi perintah sql, SQLMonitor akan mentrace SQL. SQL ini diparse untuk memeriksa jenis SQL (apakah update, insert, delete atau select). Kemudian baru ditampilkan warningnya.

    Sekarang, di MySQL versi baru, saya cenderung memilih trigger. Cara ini agak repot karena di semua tabel harus dipasang trigger, tapi akurasi lebih terjamin. Cara SQL Monitor akan keliru jika SQL sudah dieksekusi dan ditrace, tapi ternyata gagal di database (back-end).

    Untuk memulai, cobalah pake TZSQLMonitor.

    Set Active ke True. Trus event OnTrace:

    procedure TForm3.ZSQLMonitor1Trace(Sender: TObject; Event: TZLoggingEvent;
    var LogTrace: Boolean);
    var
    tmp:String;
    begin
    LogTrace := False;
    tmp := uppercase(copy(Trim(Event.Message), 1, 6));
    if (tmp = ‘INSERT’) then
    ShowMessage(Event.Message);
    end;

    Semoga dapat membantu.. 🙂

    Reply
  89. yunidotcom

    Terima kasih pencerahannya Mas, terus setelah muncul alert juga menampilkan record baru tersebut (misal ditampilkan di Memo..) bagaimana caranya Mas ?.. maaf banyak tanya,maklum masih newbie..

    Reply
  90. harnika

    mas. mohon bantuan nya .. saya mau buat aplikasi yang database nya berisi gambar . untuk nampilin nya dan agar database juga isa update gimana ya .. mohon referensinya ..

    Reply
  91. varquits

    Hallo mas joko.., bagaimana membuat progress bar pada saat loding data saat query di jalankan pada zeos….
    mohon pencerahaanya

    Reply
  92. Pingback: Cenadep.org » Tutorial Koneksi Ke 3 Server Database Relasional: MySQL, PostgreSQL & MS. SQL Server

  93. wahyu

    Bos nanya ni .. klo koneksi mysql5 ke aplikasi delphi di windows 7 64-bit gimana ya. aku coba trus koneksi failed. apa harus ada tambahan komponennya ya atau ada pengaturan configurasi lainnya ?? mohon pencerahannya

    Reply
  94. hang

    mas saya dah coba tapi kok pas tak klik cawang nya pada db navigator
    muncul peringatan

    project project1.exe raised exeption class EZdatabaseerror with message ‘field nama peserta’ is required but not supplied’

    mohon bantuannya mas

    Reply
  95. supriadi

    Pak saya pakai Zeos waktu mengetik angka tanpa koma bisa namun mengetik koma ngak bisa, bagaimana caranya agar bisa ngetik pakai koma Contohnya 0.2 ?
    Makasih

    Reply
  96. decky

    gan mau nanya kalo pas zquery di aktifin knp ada tulisan (Unknown MySQL data type)

    Mohon pencerahannya ^_^

    Reply
  97. Farid

    Salam Joint

    Mas Joko saya newbi di delphi, ada kosep yang belum terpecahkan tehnisnya, saya sangat berterimakasih jika dibantu.
    Saya bikin aplikasi dengan Java untuk android, database nya menggunakan SQlite database , konsep saya SQlite database dikonversi ke
    Sql database melalui dump file. Mohon pencerahan konsep program menggunakan delphi XE3 untuk merangkum proses mulai access SQlite Database, make dump file dan export ke Sql (PhpMyadmin).
    Terimakasih banget atas bantuannya.

    Reply
  98. rudy

    Mohon pencerahannya…. saya sudah berhasil install dan running program….juga mengkoneksikan data dengan zeos….tetapi ketika saya tekan tombol simpan…..muncul pesan source file not found zdbcmysqlutils.pas…. kira2 apa ya masalahnya.
    Apakah di coding di tombol simpan…ataukan instalasi zeos yg bermasalah….mhon pencerahannya…
    sya menggunakan win7 64,delphi 7 dan zeoslib 6.6.6

    Reply
  99. Sandi Nugroho

    gan
    [ask]
    mastah,, mo nanya kalo kaya gini masalahnya ap yak
    ane pake komponen zconection, dipengaturan propertis ane pada bagian user ane isi sama kaya defoult yuser pc ane,, jdinya err gini ,

    (SQL Error:acces denied for user ‘devuser’@localhost'(yusing pasword:yes)),

    pake pengaturan user defoult dari mysql ane juga erornya sama,,, server pake usbwebserver v8.6, mohon pencerahan nuwun,,

    Reply
  100. Pingback: Menyimpan Data Gambar dan Dokumen Di Database MySQL Menggunakan Delphi | KPPDI Group Archive

Leave a reply to semutgondrong Cancel reply