Delphi 10.2.3 SQL sorgusu hata veriyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mmg
Üye
Mesajlar: 53
Kayıt: 20 Haz 2014 12:47

Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen mmg »

Merhaba,

Sürekli kullandığım SQL ile tablo açma sorgusunu Delphi 10.2.3'e geçtikten sonra kullanamıyorum.


ST_LOGIN.Close;
ST_LOGIN.SQL.CLEAR;
ST_LOGIN.SQL.Add('SELECT * FROM LOGIN WHERE LOGIN_ID=:vLOGIN_ID');
ST_LOGIN.Prepare;
ST_LOGIN.ParamByName('vLOGIN_ID').Value:= LOGIN_ID.Text;
ST_LOGIN.Open;

Bu SQL'i çalıştırdığım zaman aşağıda görülen hatayı veriyor.

[FireDAC}[Phys][ADS]*335. Parameter [VLOGIN_ID] data type is
unknown. Hint: specify TFDParam.DataTypeor assign TFDParam value
before Prepare/Execute call.


Yardımlarınızı rica ediyorum.

ertank
Üye
Mesajlar: 1315
Kayıt: 12 Eyl 2015 12:45

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen ertank »

Merhaba,

Parametre değer ataması yapmadan önce Prepare() çalıştırdığınız için hata alıyor olabilirsiniz.
Aşağıdaki şekilde deneyebilir misiniz?

Kod: Tümünü seç

ST_LOGIN.Close;
ST_LOGIN.SQL.Text := 'SELECT * FROM LOGIN WHERE LOGIN_ID=:vLOGIN_ID';
ST_LOGIN.ParamByName('vLOGIN_ID').AsString := LOGIN_ID.Text;
ST_LOGIN.Prepare();
ST_LOGIN.Open();

mmg
Üye
Mesajlar: 53
Kayıt: 20 Haz 2014 12:47

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen mmg »

Merhaba,

Dediğiniz gibi "Prepare()" yerini değiştirdim. Şimdide aşağıda görülen hatayı veriyor. Burada dikkatimi çeken bir husus var, eğer "where" kullanmazsam hata vermiyor, tabloyu açıyor. "Where" kullanırsam aşağıda ki hatayı veriyor.

First chance exception at $750D5EF8. Exception class EAccessViolation with message 'Access violation at address 00000000 in module 'Project1.exe'. Read of address 00000000'. Process Project1.exe (1116)

Kullanıcı avatarı
ihalilcoban
Üye
Mesajlar: 119
Kayıt: 10 Ara 2015 10:39
Konum: Gaziantep

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen ihalilcoban »

Merhaba,

Projenizde sanırım master-detail yapı söz konusu. Datasource bağlantılarınızı kontrol etmenizde fayda var. Olmayan bir alana atama yapmaya çalışıyormuşsunuz gibi. Tablo yapınızı bilmediğim için pek bir şey söyleyemiyorum.

ertank
Üye
Mesajlar: 1315
Kayıt: 12 Eyl 2015 12:45

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen ertank »

mmg yazdı:
23 May 2018 05:19
First chance exception at $750D5EF8. Exception class EAccessViolation with message 'Access violation at address 00000000 in module 'Project1.exe'. Read of address 00000000'. Process Project1.exe (1116)
"Access violation" hatası genellikle oluşturulmamış bir sınıfı (class) kullanırsanız oluşur. Bu hatanın;
- TFDQuery kaynaklı olması için kullandığınız TFDQuery bileşeni çalışma zamanında kod ile oluşturuluyor olması gerekli.
- Query bileşenine bağlı TDataSource.OnDataChange() veya TDataSet.OnStateChange() olaylarına yazdığınız kod sebebi ile "henüz" oluşturulmamış bir sınıfı kullanmaya çalışıyor da olabilirsiniz.
- Query bileşenine bağlı TDataSource bileşenine bağlı "DB-Aware" kontroller (TDBEdit, TDBLabel, vb.) üzerindeki tanımlı olaylarda henüz oluşturulmamış bir sınıfı kullanmaya çalışıyor olabilirsiniz.

Hata oluştuğu zaman Delphi IDE içindeki "Stack Trace" penceresini inceleyerek hata oluşmadan önce son geriye doğru hangi prosedür/fonksiyonların çalıştırıldığını gösteriyor olup hata yerini tespit etmeye yardımcı olabilir.

mmg
Üye
Mesajlar: 53
Kayıt: 20 Haz 2014 12:47

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen mmg »

Merhaba,

Kendi projemde Advantage database connect oluyor ama sorguyu where ile birlikte çalıştırdığım zaman hata verdiği için test için yeni bir proje açıyorum, sadece Connection, query ve bir adet dbgrid ekliyorum. Başka hiçbir yere hiçbir şey yazmıyorum. Form create de Advantage database'e connect oluyorum. Hemen altında gönderdiğim sorguyu çalıştırıyorum. Başka hiç bir yere hiç bir şey yazmıyorum. Eğer sorguya where eklersem sorgu çalışmıyor, hata veriyor. Where eklemezsem gayet güzel sorgu çalışıyor. Ben bunu anlayamıyorum, delphi 10.2.3 üzerinde bir ayar mı yapmak gerekiyor ? Advantage database e connect olmamla ilgili bir problem mi var ? Çözemiyorum. Bu kadar basit bir sorguyu çalıştıramadım. Kendi lisansım daha eski olduğu için Advantage Database versiyon 12 deneme sürümü kuruyorum.

Advantage database!e connect olmak için aşağıda ki bileşenleri forma ekliyorum. Yöntemimle ilgili bir problemde olabilir, bilemiyorum. Delphi 10.2.3 e yeni geçiyorum.

Forma,
1 Adet FDPhysADSDriverLink1
1 Adet FDGUIxWaitCursor1
1 Adet FDConnection

Ekliyorum.

FDConnection1.Connected:= False;
FDConnection1.Params.Database:= 'D:\Program klasörü\Data\Data.Add';
FDConnection1.Connected:= True;

BU SORGU ÇALIŞIYOR
----------------------------------------------------------------------------------------------.
ST_LOGIN.Close;
ST_LOGIN.SQL.CLEAR;
ST_LOGIN.SQL.Add('SELECT * FROM LOGIN');
ST_LOGIN.Prepare;
ST_LOGIN.Open
----------------------------------------------------------------------------------------------


BU SORGU ÇALIŞMIYOR, ÜSTTEKİ SORGUDAN TEK FARKI WHERE EKLİYORUM.
----------------------------------------------------------------------------------------------
ST_LOGIN.Close;
ST_LOGIN.SQL.CLEAR;
ST_LOGIN.SQL.Add('SELECT * FROM LOGIN WHERE LOGIN_ID=:vLOGIN_ID');
ST_LOGIN.ParamByName('vLOGIN_ID').Value:= LOGIN_ID.Text;
ST_LOGIN.Prepare;
ST_LOGIN.Open
----------------------------------------------------------------------------------------------

Kullanıcı avatarı
ihalilcoban
Üye
Mesajlar: 119
Kayıt: 10 Ara 2015 10:39
Konum: Gaziantep

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen ihalilcoban »

Merhaba,

Muhtemel hata oluşturabilecek seçenekleri bildiğim kadarıyla yazayım.
1- FDConnection nesnesinin properties kısmında ConnectedStoredUsage altında bulunan auDesignTime ve auRuntime seçeneklerini false yapın.
2- LOGIN_ID, vLOGIN_ID alanları LOGIN tablonuzda mevcut mu?
3- LOGIN tablosuna bağlantı için kullandığınız FDQuery nin fields editöründe ilgili alanlar ekli mi?
4- Anladığım kadarıyla LOGIN tablosunu başka bir tabloya detay bağlantı yapıyorsunuz. İlgili FDQuery nin mastersource, masterfields, indexfieldnames, detailfields alanlarına ilgili atamalar yapıldı mı?

bu dediklerimi bir kontrol etmenizde fayda var. Ayrıca kodunuzu FDQuery nin Query Editors kısmında Execute ederek deneyebilirsiniz yalnız 4. maddede belirttiğim bağlantı gereksinimlerini kontrol etmeniz gerekmekte.

Umarım yardımcı olabilmişimdir.

mrquen
Üye
Mesajlar: 3
Kayıt: 08 Tem 2018 10:37

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen mrquen »

Bu hatayı bende alıyorum gözlerimlerimi yazacağım umarım bu konuda genel bir çözüm bulabiliriz :))

Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7524
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen mussimsek »

Muhtemelen parametrenin veri tipini vermediğiniz için oluyor. Şurada bir örnek var :

http://docwiki.embarcadero.com/RADStudi ... _(FireDAC)

Kod: Tümünü seç

FDQuery1.ResourceOptions.ParamCreate := False;
FDQuery1.SQL.Text := 'select * from tab where code = :Code';
with FDQuery1.Params do begin
  Clear;
  with Add do begin
    Name := 'CODE';
    DataType := ftString;
    Size := 10;
    ParamType := ptInput;
  end;
end;
Kolay gelsin.

mmg
Üye
Mesajlar: 53
Kayıt: 20 Haz 2014 12:47

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen mmg »

Merhabalar,
Uzun zaman oldu fakat bu sorunu çözdüm. Belki işine yarayacak arkadaşlar olabilir diye paylaşmak istedim.

SQL sorguda "Access Violated" hatası almamak için sorguda parametre değerlerini aşağıda örnekte gösterdiğim şekilde tanımlamalısınız. Her tip değişken için örnekleme yaptım. İyi çalışmalar.

Kod: Tümünü seç

 
  STOK.Close;
  STOK.SQL.Clear;
  STOK.SQL.Add('SELECT * FROM STOK WHERE 1=1');
  STOK.SQL.Add(' AND KARTCINSI=:KC');
  STOK.SQL.Add(' AND STOK_ID=:ID');
  STOK.SQL.Add(' AND REVIZYON_TARIHI=:TRH');
  STOK.SQL.Add(' AND STOK_NO LIKE :STK');
  STOK.SQL.Add(' ORDER BY STOK_NO');
  STOK.ParamByName('KC').AsAnsiString:= 'SM';              //-- STRING
  STOK.ParamByName('ID').Value:= 24;                          //-- FLOAT
  STOK.ParamByName('TRH').AsDate:= DateTimePicker1.Date;  //-- DATE
  STOK.ParamByName('STK').AsAnsiString:= 'OP'+'%';                  //-- STRING
  STOK.Open;

ertank
Üye
Mesajlar: 1315
Kayıt: 12 Eyl 2015 12:45

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen ertank »

mmg yazdı:
13 May 2020 12:01
Merhabalar,
Uzun zaman oldu fakat bu sorunu çözdüm. Belki işine yarayacak arkadaşlar olabilir diye paylaşmak istedim.

SQL sorguda "Access Violated" hatası almamak için sorguda parametre değerlerini aşağıda örnekte gösterdiğim şekilde tanımlamalısınız. Her tip değişken için örnekleme yaptım. İyi çalışmalar.
Merhaba,

Maalesef birçok Delphi kod örneği veritabanı sorgusu kolon değeri veya parametre değeri atama yapılmasını aşağıdaki benzeri örnekler ile gösteriyor.

Kod: Tümünü seç

// kolon değer ataması
TFDQuery.FieldByName('alan_adi').Value := 'ABC'; 
// parametre değer ataması
TFDQuery.ParamByName('alan_adi').Value := 'ABC';

Bu kullanım hatalı olmamak ile birlikte tavsiye edilmeyen bir kullanım şeklidir.
- "AsValue" şeklinde yapılan atamalar "Variant" veri türünde yapılmış olur. Tek bir Variant türünde değişken farklı veri türleri saklayabilir. String sadece metin bilgi saklar ancak Variant bu şekilde sabit değildir. Kod içinde bir satırda aynı değişken ondalıklı sayı saklayabilir. Başka bir satırda Metin bilgisi saklayabilir. Derleyici hata vermez. Çalışma zamanında sorunlar ile karşılaşılma ihtimali daha yüksek olur.
- "AsValue" şeklinde yapılan parametre atamalarında sorgu tarafından parametre veri türü "bilinmeyen" (unknown) olarak ayarlanır. Bazı veritabanı sunucuları bilinmeyen türde parametreler için hata verirler. Bazı veritabanı sunucuları da belli koşullar altında bilinmeyen türde parametreler için hata verirler. Sizin durumunuzda hangisi geçerli emin değilim.
- "AsValue" şeklinde yapılan parametre atamaları göreceli olarak uygulamanın daha yavaş çalışmasına sebep olacaktır. Bu variant veri türünün değişken olabilen özelliği ile ilgilidir.

Yukarıdaki sebepler dolayısıyla "AsValue" kullanarak parametre atamasını sadece NULL değer kaydetmek için kullanmak en sağlıklı yöntem olacaktır. Bu anlamda sizin paylaştığınız örnek kod içinde Float ataması yaptığınız satırı aşağıdaki şekilde değiştirmenizde fayda var

Kod: Tümünü seç

  STOK.ParamByName('ID').AsFloat := 24;                          //-- FLOAT
Paylaştığınız örnek ile ilgili diğer bir konu, string atamalarını sorgu parametrelerine genellikle "AsString" kullanarak atma yapmak yeterli olur. Eğer "AsAnsiString" şeklindeki kullanımınız veritabanı tarafında geçerli bir sebebe sahip ise sorun yok. Ancak belli bir gerçerli sebebi yok ise aşağıdaki şekilde değiştirmenizi tavsiye ederim.

Kod: Tümünü seç

  // Unicode string ataması
  STOK.ParamByName('KC').AsString:= 'SM';              //-- STRING
  STOK.ParamByName('STK').AsString:= 'OP%';                  //-- STRING
Yukarıdaki şekilde kullanım çoğunlukla arka planda WideString veri türünde veritabanına bilgi iletir. UTF8 kullanan veritabanlarında bu şekilde kullanılması tavsiye edilir ve ülkeye özel karakterlerin doğru kayıt edilmesi ve kullanımı için genellikle zorunludur.

Son olarak;

Kod: Tümünü seç

// okunması zor kullanım
STOK.ParamByName('STK').AsString:= 'OP'+'%';
// okunması kolay kullanım
STOK.ParamByName('STK').AsString:= 'OP%';
Zaten kod içinde yazılan sabit string değerin sonuna yine başka sabit string değer eklemenize gerek yok. İkinci satırdaki örnekte olduğu gibi tek bir sabit string olarak yazabilirsiniz.

mmg
Üye
Mesajlar: 53
Kayıt: 20 Haz 2014 12:47

Re: Delphi 10.2.3 SQL sorgusu hata veriyor

Mesaj gönderen mmg »

Merhaba,

Maalesef string alanlar için "STOK.ParamByName('STK').AsString:= 'OP%';" kullandığım anda "Access violation" hatası veriyor. Mecbur kaldığım için AsString yerine ".AsAnsiString" kullandım. Database Advantage Database Server. SQL'deböyle bir sorun yaşamıyorum.

Cevapla