Delphi - mydac - mysql embed veritabanı sorunu

Diğer veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
anoedi
Üye
Mesajlar: 33
Kayıt: 20 Nis 2009 05:20

Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen anoedi » 09 Eki 2013 03:58

Merhaba dostlar;

Uzun yıllar delphi projelerimde access veritabanı kullanmış ve saçma sapan access hatalarından bıkmış biri olarak bir süredir mysql veritabanı kullanıyordum. Yalnız bilirsiniz ki mysql kullanarak hazırladığınız uygulamayı karşı bilgisayara atmak için orada da mysql yüklü olması gerekiyor. Bu sepepten mysql embedded özelliğini kullanmaya karar verdim ve tam bu sırada, bana günlerdir saçımı başımı yolduran "sorunlar dizisi" meydana gelmeye başladı ve ben de kalan son sabır kırıntılarım ile üstadlara danışmaya karar verdim.

Kullandığım yazılımlar;
Rad studio XE - delphi XE
MyDAC 7.6.11
MySQL 5.5.24 (sanal host [localhost] olarak kullandığım "wamp server" isimli bir program ile birlikte geldi. Wamp server'ın delphi ile alakası yok, web sitesi tasarlarken kullanıyorum.)
Windows 7 ultimate x64 işletim sistemi. (Alakası var mı bilemiyorum ama.)

MyDAC bileşenin demolar kısmında bir tane embed projesi var. Projenin içinde embed uyumlu bir veritabanı da var. O projeyi tekrar derleyerek o hazır gelen embed uyumlu veritabanına bağlanabildim. "libmysqld.dll" taşınabilir kütüphanesi sayesinde, veritabanını exe dosyası ile taşımak mümkün.

Ancak kendi phpmyadmin'imi kullarak yeni bir veritabanı oluşturup onu embed haline getiremiyorum. Embed özelliğinde bir veritabanı oluşturmak için günlerdir kaç farklı program denedim, sayısını dahi bilmiyorum ama beceremedim. Bu konuda yardımınıza ihtiyacım var.

Embed uyumlu mysql veritabanı nasıl oluşturulur?

Yardımlarınız için şimdiden teşekkür ederim, saygılarımla...

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4731
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen mrmarman » 09 Eki 2013 04:10

Merhaba.

Bu linkteki bağlantı şemasını kendinize uyarlayıp, dll dosyasını alıp programınızın dizinine kopyalayıp dener misiniz. :idea:
Resim Resim

anoedi
Üye
Mesajlar: 33
Kayıt: 20 Nis 2009 05:20

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen anoedi » 09 Eki 2013 05:02

Üstadım öncelikle ilginiz için teşekkür ederim.

Bağlantı şemasını uyarlamak derken tam olarak neyi kastettiğinizi anlayamadım. Benim veritabanım herhangi bir sunucu üzerinde değil.
Phpmyadmin kullanarak oluşturduğum veritabanının dosyalarını kopyalayıp uygulamanın exe dosyasının olduğu klasörde, "data" isimli bir klasör açıp onun içine attım. "libmysqld.dll" dosyası ile lokal olarak çalıştırmayı denemiştim. Sizin öneriniz üzerine de, verdiğiniz linkteki "libmysql.dll" dosyası ile tekrar denedim ancak sonuç yine aynı.

* Tmyembconnection nesnesini veritabanına bağlayabiliyorum.
* Daha sonra tmytablo bileşeninin connection özelliğine myembconnection1 ataması yapıyorum ve bileşenin "tablename" özelliğine "tablo1" diye atama yapıyorum. (Dbnin içindeki tabloları görüyor ve listeden seçmeme izin de veriyor.)
* Daha sonra mytable1 nesnesinin active özelliğine true değeri aktardığımda "incorrect information in file "D:\uygulama\data\deneme\tablo1.frm" uyarısını veriyor.

Bu sebepten ben tablonun embed uyumsuz olduğunu düşünmüştüm.
Son olarak benim kullandığım dll dosyası ile sizin gönderdiğiniz dll dosyası da farklı.
-> libmysql.dll
-> libmysqld.dll

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4731
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen mrmarman » 09 Eki 2013 05:20

Merhaba.

- PHPMyAdmin kullanıyorum deyince, local bir linux sunucu oluşturdunuz da MySQL veritabanını oradan çalıştırıyorsunuz diye düşünmüştüm. Yanlış değerlendirmişim. :roll:
Resim Resim

anoedi
Üye
Mesajlar: 33
Kayıt: 20 Nis 2009 05:20

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen anoedi » 09 Eki 2013 05:44

Aslında ben de sorunumu yanlış anlaşılmaya bayağı yatkın yazmışım. :)
Günlerdir şu işe kafa patlatmaktan illallah etmiş durumdayım artık, mazur görün.

Konunun son haline göre bir yargına bulunursanız, mysql veritabanını embeded olarak kullanmak hakkında verebileceğiniz bir tavsiye var mı?
Ya da exe dosyası ile birlikte kolayca taşıyabileceğim ve şifre koruması sağlayabileceğim bir veritabanı önerebilir misiniz?

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4731
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen mrmarman » 09 Eki 2013 09:33

Merhaba.

- Ola ki, sizin DLL sorun yaratırsa diye MySQL 4.1 için libmysqld.DLL'in linkine buradan erişebilirsiniz.

- Size önerim herhangi bir MYI, frm ve MYD dosyasını alıp üzerinde değişiklik yapmaya uğraşmayıp kendiniz sıfırdan kod ile DATABASE / TABLO create edin.

- Eğer farklı bir veritabanındaki veriyi almak isterseniz SQL cümleleriyle yeni oluşturacağınız tabloya insert edin.

Sizin için bir örnek hazırladım.

***OffTopic*** Aşağıdaki ilk fonksiyon size kendi kullandığım bir tablonun Create Structure fonksiyonudur. Fonksiyonu çalıştırdığınızda size SQL cümlesini String olarak sunuluyor. Buna ne gerek vardı derseniz de hak veririm :roll: kendimce yazdığım kodlarım anlaşılır olsun diye bu tip tanımlamaları bir UNIT içinde fonksiyon halinde biriktitip, bir defa dahi olsa ihtiyacım olduğunda ismini yazıp çalıştırınca ürün elde etmek için ayırıyorum. Yoksa bunları SQL.ADD diyerek de aşağıda yazabilirdiniz, siz bu durumu anlamışsınızdır.

Kod: Tümünü seç

Function MSSQLStrucOlustur_PERSONEL : String;
begin
  Result :=
       'CREATE TABLE ARMAN.PERSONEL ('
     + #13'  P_KaySiraNo    INT NOT NULL AUTO_INCREMENT PRIMARY KEY'
     + #13', P_SicilNo      INT NOT NULL'
     + #13', P_BasinNo      INT'
     + #13', P_TCKimlik     VARCHAR(11) '
     + #13', P_Adi          VARCHAR(50) '
     + #13', P_Soyadi       VARCHAR(50) '
     + #13', P_Unvan        VARCHAR(50) '
     + #13', P_Gorevi       VARCHAR(50) '
     + #13', P_Derece       INT         '
     + #13', P_Kademe       INT         '
     + #13', P_EkGosterge   INT         '
     + #13', P_CepTel       VARCHAR(15) '
     + #13', P_eposta       VARCHAR(100)'
     + #13', P_KayitTar     DATETIME    '
     + #13', P_AyrilTar     DATETIME    '

     + #13', P_SERI_NO      VARCHAR(4)  '
     + #13', P_CUZDAN_NO    INT         '
     + #13', P_DOGUM_TRH    DATETIME    '
     + #13', P_DOGUM_YERI   VARCHAR(20) '
     + #13', P_BABA_ADI     VARCHAR(30) '
     + #13', P_ANA_ADI      VARCHAR(20) '
     + #13', P_CINSIYET     VARCHAR(1)  '
     + #13', P_MEDENI_DRM   VARCHAR(1)  '
     + #13', P_UYRUK        VARCHAR(3)  '
     + #13', P_DIN          VARCHAR(1)  '
     + #13', P_KAN_GRUBU    VARCHAR(10) '
     + #13', P_IL           VARCHAR(50) '
     + #13', P_ILCE         VARCHAR(50) '
     + #13', P_MAH_KOY      VARCHAR(20) '
     + #13', P_CILT_NO      VARCHAR(9)  '
     + #13', P_SAYFA_NO     VARCHAR(8)  '
     + #13', P_SIRA_NO      VARCHAR(8)  '
     + #13', P_VER_NEDEN    VARCHAR(1)  '
     + #13', P_VER_TRH      DATETIME    '
     + #13', P_VER_NFS_ID   VARCHAR(20) '
     + #13', P_KAYIT_NO     VARCHAR(10) '
     + #13', P_YAS_TASHIH   DATETIME    '
     + #13', P_EVLILIK_TRH  DATETIME    '

     + #13', P_YapimdaGorev BIT'

     + #13', P_KoordKodu    INT NOT NULL'
     + #13', P_MdlukKodu    INT NOT NULL'
     + #13', P_BirimKodu    INT NOT NULL'
     + #13', P_CastKodu     INT'

     + #13', P_OturumAdi    VARCHAR(100)'

     + #13', P_GGKoordKodu  INT NOT NULL'
     + #13', P_GGMdlukKodu  INT NOT NULL'
     + #13', P_GGBirimKodu  INT NOT NULL'
     + #13', P_GGBasTar     DATETIME'
     + #13', P_GGBitTar     DATETIME'

     + #13', P_GuncelTar    DATETIME'
     + #13', P_Guncelleyen  VARCHAR(200)'
     + #13', P_Iptal        BIT'
     + #13', P_Secim        BIT'
     + #13', P_Silindi      BIT'

     + #13', P_Yetkili      BIT'
     + #13', P_ServisSor    BIT'
     + #13', P_ServisSorOnBil    BIT'
     + #13', P_BasinSurekli BIT'
     + #13')';
end;
Burada da butona basınca ZEOS bileşenleri (freeware) kullanarak hazırlanan yapıyı görüyorsunuz.

Resim

Alt Bilgi : Tanımlama yaparken dikkat edin, DataDizini olarak default değer versek de, Tabloyu open yaparken diğer veritabanı olan arman.personel şeklinde ismini yazdığımızda default olan DataDizini yerine arman (database) klasörüne başvurluyor. Eğer tablo önüne prefix olarak database söylemez de sadece personel şeklinde tablonun adını verseydik, default olan DataSizini (database) klasörü seçilmiş olacaktı.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
       ZConnection1.Protocol := 'mysqld-4.1';
       ZConnection1.Database := 'DataDizini';
       With ZConnection1.Properties do begin
         Clear;
         Add( 'compress=yes' );
         Add( 'dbless=no'    );
         Add( 'useresult=no' );
         Add( 'timeout=30'   );
         Add( 'ServerArgument1=--basedir=./'                           );
         Add( 'ServerArgument2=--datadir=./data'                       );
         Add( 'ServerArgument3=--character-sets-dir=./share/charsets'  );
         Add( 'ServerArgument4=--language=./share/english'             );
         Add( 'ServerArgument5=--skip-innodb'                          );
         Add( 'ServerArgument6=--key_buffer_size=32M'                  );
       end;
       ZConnection1.Connect;
       DataSource1.DataSet := ZQuery1;
       DBGrid1.DataSource := DataSource1;
       With ZQuery1 do begin
         Connection := ZConnection1;
         Active     := False;
         SQL.Clear;
         if NOT DirectoryExists( '.\data\arman') then
         begin // Database yoksa Database klasörü meydana getirilecek.
           SQL.Add('CREATE DATABASE ARMAN');
           ExecSQL;
         end;

         if NOT FileExists( '.\data\arman\personel.myi') then
         begin // Tablo yoksa Tablo Create edilecek..
           SQL.Clear;
           SQL.Add( MSSQLStrucOlustur_PERSONEL() );
           ExecSQL;
         end;

         Connection := ZConnection1;
         Active     := False;
         SQL.Clear;
         SQL.Add('SELECT * FROM arman.personel');
         Active     := True;
       end;
end;
Başarılar.
Resim Resim

anoedi
Üye
Mesajlar: 33
Kayıt: 20 Nis 2009 05:20

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen anoedi » 10 Eki 2013 11:13

Tekrar merhaba;

Üstadım zahmet edip benim için bu kadar uğraşmışsınız, nasıl teşekkür edeceğimi bilemiyorum şu an... Gerçekten çok sağ olun.

Gönderdiğiniz kodu dün deneyemedim, saçma sorunlar dizisi devam etti. Önce rad studio bozuldu, açılırken hata verip kapanmaya başladı. Sistemin imajını geri yükleyeyim dedim, imaj programı hata verdi. Sanki bilgisayar benim sabrımı sınıyor gibi. :D

Neyseki bugün bir şekilde, geçici olarak çalıştırabildim derleyiciyi. Gönderdiğiniz kod işimi gördü, oluşturulan alanları dbgridde izleyebildim. Size tekrar tekrar teşekkür ederim. Çıldırmaya beş kala sorunum çözüldü sayenizde.

Son olarak, tecrübelerinizden faydalanmak adına bir şey daha sorayım;
Bir program geliştirdiğinizi düşünün. Bu programı başka bir bilgisayara yükleyeceksiniz ve sadece TEK BİR BİLGİSAYARDA kullanılacak.
Program veritabanı ile çalışıyor (veritabanı lokal) ve veri tabanı şifreli olması gerekli. Yani önemli olan dbnin exe ile kolayca taşınması ve şifrelenebilir olması.

Siz olsanız bu durumda hangi veritabanını kullanırsınız?

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4731
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen mrmarman » 10 Eki 2013 11:41

Çözüm adına çok memnun oldum.

Diğer sorunuza gelince; localde veritabanı bulundurmadığımdan bu sorunuza başka bir metodla yaklaşarak cevap vermek isterim. ISA SERVER'dan kullanıcı yetkilerini alarak (Windows Auth.Mode) bağlantı kuran SQLServer ve ORACLE çalıştım son zamanlarda. Otomasyon ağırlıklı olarak çalıştığımdan da böyle bir kaygım olacak proje pek olmadı. Sadece tek bir proje vardı (localde erişim ve projenin türüne göre hız sorunu yaşamadığım MSAccess mdb veritabanı kullandım) , onda da şimdi size bahsedeceğim metodla işi yürüttüm.

Tabloları tek başına anlamsız ancak belirli şartlarda join edildiğinde anlamlıı olan parçalara böldüm.

Şöyle ki, bir tabloda sicil no varsa kişinin adı bir tabloda, soyadı başka tabloda. İlişki EXE içerisinden yürüyor. Server tabanlı bir veritabanı olmadığından da sniff denilen port okuma ile de sorgularım alınamıyordu.

- Gerçi EXE decompile ile alınabilir ancak ikiden fazla katmanlı bir güvenlik ağı oluşturmuştum. Örneğim parola hatalıdır demiyor,
- Projenin tablo bağlantılarını login ve parola bilgisi ile ilişkili olarak kurduğundan yanlış ilişkiler kurdurup çalışmaya devam ediyordu.

- İsim parola değiştiğinde tablolar üzerindeki ilişkiler de yeniden tek bir SQL sorgusu ile yapılandırılıyordu.

Bu yapıyı kurmak uzun zamanını almıştı ama basit bir unit hazırladığımdan başka zaman ihtiyacım olsa aynı unit ile bir kaç kod bloğu ile yapılabilecek bir tasarımdır.
Resim Resim

anoedi
Üye
Mesajlar: 33
Kayıt: 20 Nis 2009 05:20

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen anoedi » 12 Eki 2013 07:10

Tekrar merhabe üstadım;

Bahsettiğiniz yöntem için cidden tebrik ederim, çok yaratıcı. Lakin şimdilik benim seviyemi bir nebze aşıyor desem doğru olur herhalde. Ben bu embed mysql olayına biraz çalışıp o konuda kendimi geliştirmeye karar verdim.

Bu arada geçenlerde beni çıldırtan olaylara şu an gülüyorum, belki sizde de ufak bir tebessüm oluşturur diye paylaşmak istiyorum;
Ufak tefek derleyici hataları ile başlayan "sorunlar dizini" en sonunda bios update + format'a kadar gitti. Arada yemiş olduğum mavi ekran (crash report)'lar da çorbanın tuzu biberi oldu. =)

Şimdi sistemi tamemen kurabildim tekrar. Önceki gönderdiğiniz manuel tablo ekleme olaynı projeme adapte edip, uygulamayı o yönde ilerleteceğim. Yardımlarınız için tekrar tekrar teşekkür ederim, size minnettarım.

Saygılarımla...

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4731
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Delphi - mydac - mysql embed veritabanı sorunu

Mesaj gönderen mrmarman » 14 Eki 2013 09:55

Rica ederim, sonuç için çok memnun oldum.
Çaba sarf etmeden soru soran değil, çabalarını ifade edebilen olduğunuz için severek yardımcı oldum.

Çalışmalarınızda başarılar dilerim. :bravo:
Resim Resim

Cevapla