ADO'dan FireDAC a geçiş.

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
Kullanıcı avatarı
maxpaynen
Üye
Mesajlar: 15
Kayıt: 14 Tem 2018 03:20
İletişim:

ADO'dan FireDAC a geçiş.

Mesaj gönderen maxpaynen »

Daha önceden delphi de veri tabanı bağlantılarında ADO kullanıyordum şimdi ise fireDAC'a dikey geçiş yaptım. Geçiş yapacak arkadaşlara bu konuda yardımcı olmak için bu yazıyı yazıyorum.
1. aşama - dönüştürme
Onlarca form olduğu için compenentleri değiştirmek oldukça zahmetliydi. O yüzden kendim bir program yazdım. Proje klasörüm içindek .pas ve .dfm dosyalarını bulup bunları değiştiriyor. Değiştirdiklerini aşağıda paylaşıyorum.

Kod: Tümünü seç

Content[i] := StringReplace(Content[i], 'TADOQuery', 'TFDQuery', [rfReplaceAll, rfIgnoreCase]);
Content[i] := StringReplace(Content[i], 'TDateTimeField', 'TSQLTimeStampField', [rfReplaceAll, rfIgnoreCase]);
Content[i] := StringReplace(Content[i], 'TStringField', 'TWideStringField', [rfReplaceAll, rfIgnoreCase]);
AdoTable yi kullanmadığım için denemedim. Replaceyi onda da deneyebilirsiniz. hem dfm hemde .pas dosyasında bu değişiklikleri yaptıktan sonra forma giriş yaptığınızda unit leri kendisi otomatik olarak atar.

2. aşama - çıkacak hatalar
şu an ado yu fdquery ye dönüştürmüş oldunuz. adoconnection yerine fdconnection kullanacaksınız bağlantılar ona göre hazırlanacak. bunları forumdan veya internetten envayi çeşidini bulabilirsiniz. Onun için burda fdconnection nasıl bağlanır gibi bilgiler vermeyeceğim. Bağlantıları yaptığınız varsayıyorum ve karşılaşabileceğiniz olası hatalara geçiyorum.
Programımda iki veri tabanı kullanılıyor. Access ve MSSQL o yüzden her ikisine de uyumlu olmasına özen gösterdim.

DateTime hatası : Ado kullanıyorsanız AdoQueryTarih.value := Now; şeklinde bir eşleme yapabilirsiniz ama FDQuery tarih alanları için TSQLTimeStampField kullanır bunun için

Kod: Tümünü seç

AdoQueryTarih.value := DateTimeToSQLTimeStamp(Now) ; kullanmanız veya
AdoQueryTarih.DateTime := Now; kullanmanız gerekir
Parametre Hatası : Parametreler için ADOQuery1.Parameters kullanılırken FDQuery.Params... kullanır.
Update ve Insert hataları :
Fdquery ile en çok karşılaşılan hata update ve insert hatası. FDQuery.Post olayında güncelleme hataları alabilirsiniz. bu tür her 10 sorunun 9 unun çözümü

Kod: Tümünü seç

FdQuery.UpdateOptions.UpdateMode := upWhereKeyOnly;
FdQuery.UpdateOptions.KeyFields := 'ID'; // identy kimliği   
FdQuery.UpdateOptions.AutoIncFields := 'ID'; // identy kimliği  
VarChar ve NVarChar Karmaşası : Ado'da veri tabanınızı NVarChar vey VarChar oluştursanız bile TWideStringField görüyor. ama FDQuery e geldiğimizde bu işlern değişiyor. VarChar ise bunu TStringField olarak görüyor.
Bu durumu değiştirebilecek mucize bir kod var
FDConnection.FormatOptions.MapRules.Add(dtAnsiString, dtWideString); //bu aynen ado'daki gibi VarChar ise bunları da WideString gibi görüyor. dikkat edin bu Ansiyi Wide ye çevirmez. yani Unicode karakterler kullanamazsınız


Sonuç
bu işlemi özelliklede ilk başta .pas ve .dfm dosyalarını replace etmeden önce bunların yedeğini alın. benim hızlı geçiş için kullandığım yöntem ve yaşadığım hatalar bu şekilde. Tablo adları, alan adlarının büyük harf olması gerekiyor. örneğin Select * from MusteriList diye bir tablo oluşturursanız FDQuery bunu Select * from MUSTERILIST olarak görüyor ve hata veriyor çünkü sizin tablonuz MUSTERILIST değil MUSTERİLİST.

Bunların dışında sorun yaşayan varsa (sadece geçiş için) yazabilir. Belki bende yaşamış çözmüşümdür.
Cevapla