Delphi Söz Dizimi Hatası
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 25
- Kayıt: 12 Ara 2013 08:35
Delphi Söz Dizimi Hatası
Merhaba arkadaşlar, Oturum açma ekranında Giriş Yap butonuna tıkladığımda "is not a valid integer value hatasını alıyorum.
Kodu böyle yazdım:
ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi='''+QuotedStr(Edit1.Text)+''' and Sifre='''+QuotedStr(Edit2.Text)+'''';
ADODataset1.Open;
sadedi:=ADODataset1.Fields[2].AsInteger;
Oturum1.hide;
acilis:=ADODataset1.Fields[0].AsInteger;
if sadedi=1 then AnaEkran2.show else
Access VT'da Personel'in altında KullaniciAdi ve Sifre olarak iki alan açıp içlerine kullanıcı adı ve şifre atadım. Ancak bazen personel soyadı için bu geçersiz değerdir vs hatalar veriyor. Kullanıcı adı ve Şifre girmesem bile hata veriyor.
Bunu nasıl çözebilirim?
Kodu böyle yazdım:
ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi='''+QuotedStr(Edit1.Text)+''' and Sifre='''+QuotedStr(Edit2.Text)+'''';
ADODataset1.Open;
sadedi:=ADODataset1.Fields[2].AsInteger;
Oturum1.hide;
acilis:=ADODataset1.Fields[0].AsInteger;
if sadedi=1 then AnaEkran2.show else
Access VT'da Personel'in altında KullaniciAdi ve Sifre olarak iki alan açıp içlerine kullanıcı adı ve şifre atadım. Ancak bazen personel soyadı için bu geçersiz değerdir vs hatalar veriyor. Kullanıcı adı ve Şifre girmesem bile hata veriyor.
Bunu nasıl çözebilirim?
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Delphi Söz Dizimi Hatası
Muhtemelen, sadedi:=ADODataset1.Fields[2].AsInteger; veya acilis:=ADODataset1.Fields[0].AsInteger; satırlarından biri yüzünden olabilir. Fields[0] veya Fields[2] ile değerini okuduğunuz alan sayısal tipli bir alan değilse ve alan değeri olarak string bir değer kayıtlı ise (boş '' değeri de dahil) bu durum oluşabilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
-
- Üye
- Mesajlar: 25
- Kayıt: 12 Ara 2013 08:35
Re: Delphi Söz Dizimi Hatası
Merhaba cevap yazdığınız için teşekkür ederim. Kullanıcı adı ve Şifreye database dosyasından 12345 atadım.sabanakman yazdı:Muhtemelen, sadedi:=ADODataset1.Fields[2].AsInteger; veya acilis:=ADODataset1.Fields[0].AsInteger; satırlarından biri yüzünden olabilir. Fields[0] veya Fields[2] ile değerini okuduğunuz alan sayısal tipli bir alan değilse ve alan değeri olarak string bir değer kayıtlı ise (boş '' değeri de dahil) bu durum oluşabilir.
'KullaniciAdi="12345" and Sifre="12345"' sorgu ifadesi içindeki söz dizimi hatası(eksik işleç) diye hata verdi. AsString olarak da tanımlanmıyor. Sorunun nasıl çözebilirim?
Re: Delphi Söz Dizimi Hatası
QutedStr kullanmışsanız tekrardan ''' işaretlerini kullanmanıza gerek yok.
-
- Üye
- Mesajlar: 25
- Kayıt: 12 Ara 2013 08:35
Re: Delphi Söz Dizimi Hatası
'SELECT * FROM Personel WHERE KullaniciAdi=QuotedStr(Edit1.Text) and Sifre=QuotedStr(Edit2.Text)'Lost Soul yazdı:QutedStr kullanmışsanız tekrardan ''' işaretlerini kullanmanıza gerek yok.
Merhaba, bu sefer de tanımlanmamış QuotedStr diye bir hata verdi.
Kullanıcı Adını ve Şifreyi Integer olarak 12345 girdiğim için Edit1.Text lerin başındaki QuotedSTR ifadesini çıkardım ve şöyle yazdım:
ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi=Edit1.Text and Sifre=Edit2.Text';
Bu sefer de Edit1.Text parametresinin varsayılan değeri yok hatasını verdi.
Re: Delphi Söz Dizimi Hatası
darrenjones yazdı:'SELECT * FROM Personel WHERE KullaniciAdi=QuotedStr(Edit1.Text) and Sifre=QuotedStr(Edit2.Text)'Lost Soul yazdı:QutedStr kullanmışsanız tekrardan ''' işaretlerini kullanmanıza gerek yok.
Merhaba, bu sefer de tanımlanmamış QuotedStr diye bir hata verdi.
Kullanıcı Adını ve Şifreyi Integer olarak 12345 girdiğim için Edit1.Text lerin başındaki QuotedSTR ifadesini çıkardım ve şöyle yazdım:
ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi=Edit1.Text and Sifre=Edit2.Text';
Bu sefer de Edit1.Text parametresinin varsayılan değeri yok hatasını verdi.
İlkesel olarak yaklaşarak kavramanız daha doğru olacaktır.
(1) SELECT komut satırı tırnak içerisinde olmalıdır.
(2) Edit1.Text ile Edit2.Text tırnak DIŞARISINDA olmalıdır.
(3) Sorunuz gereği 1 ve 2 nolu başlığı birlikte kullanmak zorundasınız.
(4) 'abc' + '123' + 'def' string ifadesinin sonucu = 'abc123def' şeklindedir. Bunu hatırlayalım.
Çözüm : O zaman yeri geldiğinde tırnak açıp, yeri geldiğinde tırnağı kapatıp, sonra tekrar açıp bir düzen oluşturacağız.
(*) Örneğimizde Edit1.Text := 'ARMAN'; olsun...
(1) 'abc' + 'Edit1.Text' = 'abcEdit1.Text' olacaktır.
(2) 'abc' + Edit1.Text = 'abcARMAN' olacaktır.
farkı anlayabildik mi ? Edit1.text'i Tırnak içerisinde yazarsak bir metin olarak değerlendirilecektir. Tırnak dışında yazarsak bir değişkendir.
- Tırnak içerisinde TIRNAK olan bir ifade yazmak isterseniz QuotedSTR( stringDegisken ) fonksiyonunu kullanırsınız. Mesela QuotedStr( Edit1.Text ) sonucu tırnak içerisinde ARMAN yani 'ARMAN' sonucunu verir.
- QuotedStr kullanmak istemezseniz, o zaman her bir tırnak için yan yana iki adet tırnak kullanabilirsiniz.
Örnek :
'abc' + '' + 'cde' + '' + 'fgh' = sonucu şöyledir abc'cde'fgh şeklindedir.
aynı ifadeyş QuotedStr fonksiyonuyla şöyle yazarız.
'abc' + QuotedStr('cde') + 'fgh' şeklinde aynı sonucu elde edersiniz.
* Bu farkı şimdi kendi SELECT satırınızda uygularsanız nasıl olur bir deneyin. Olmadı yardımcı olalım...
Maksat balık tutmayı öğrenmek...İşi yokuşa sürmek değil...

-
- Üye
- Mesajlar: 25
- Kayıt: 12 Ara 2013 08:35
Re: Delphi Söz Dizimi Hatası
Hocam çok teşekkürler çok iyi anlatmışsınız. Sizin dediğiniz gibi sonuçları KullaniciAdiSifre(1234512345) olarak algılıyor sanırım. Bunları ayrı ayrı anlayıp veritabanıyla doğrulaması lazım. O zaman şöyle mi yazmak gerekiyor?mrmarman yazdı:darrenjones yazdı:'SELECT * FROM Personel WHERE KullaniciAdi=QuotedStr(Edit1.Text) and Sifre=QuotedStr(Edit2.Text)'Lost Soul yazdı:QutedStr kullanmışsanız tekrardan ''' işaretlerini kullanmanıza gerek yok.
Merhaba, bu sefer de tanımlanmamış QuotedStr diye bir hata verdi.
Kullanıcı Adını ve Şifreyi Integer olarak 12345 girdiğim için Edit1.Text lerin başındaki QuotedSTR ifadesini çıkardım ve şöyle yazdım:
ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi=Edit1.Text and Sifre=Edit2.Text';
Bu sefer de Edit1.Text parametresinin varsayılan değeri yok hatasını verdi.
İlkesel olarak yaklaşarak kavramanız daha doğru olacaktır.
(1) SELECT komut satırı tırnak içerisinde olmalıdır.
(2) Edit1.Text ile Edit2.Text tırnak DIŞARISINDA olmalıdır.
(3) Sorunuz gereği 1 ve 2 nolu başlığı birlikte kullanmak zorundasınız.
(4) 'abc' + '123' + 'def' string ifadesinin sonucu = 'abc123def' şeklindedir. Bunu hatırlayalım.
Çözüm : O zaman yeri geldiğinde tırnak açıp, yeri geldiğinde tırnağı kapatıp, sonra tekrar açıp bir düzen oluşturacağız.
(*) Örneğimizde Edit1.Text := 'ARMAN'; olsun...
(1) 'abc' + 'Edit1.Text' = 'abcEdit1.Text' olacaktır.
(2) 'abc' + Edit1.Text = 'abcARMAN' olacaktır.
farkı anlayabildik mi ? Edit1.text'i Tırnak içerisinde yazarsak bir metin olarak değerlendirilecektir. Tırnak dışında yazarsak bir değişkendir.
- Tırnak içerisinde TIRNAK olan bir ifade yazmak isterseniz QuotedSTR( stringDegisken ) fonksiyonunu kullanırsınız. Mesela QuotedStr( Edit1.Text ) sonucu tırnak içerisinde ARMAN yani 'ARMAN' sonucunu verir.
- QuotedStr kullanmak istemezseniz, o zaman her bir tırnak için yan yana iki adet tırnak kullanabilirsiniz.
Örnek :
'abc' + '' + 'cde' + '' + 'fgh' = sonucu şöyledir abc'cde'fgh şeklindedir.
aynı ifadeyş QuotedStr fonksiyonuyla şöyle yazarız.
'abc' + QuotedStr('cde') + 'fgh' şeklinde aynı sonucu elde edersiniz.
* Bu farkı şimdi kendi SELECT satırınızda uygularsanız nasıl olur bir deneyin. Olmadı yardımcı olalım...
Maksat balık tutmayı öğrenmek...İşi yokuşa sürmek değil...
KullaniciAdi=QuotedStr(Edit1.Text) and Sifre=QuotedStr(Edit2.Text)
Ki yazdığımda "İfadede, tanımlanmamış 'QuotedStr' işlemi" hatası veriyor.
Re: Delphi Söz Dizimi Hatası
Yaklaştınız...
Doğrusu :
şeklinde.
Doğrusu :
Kod: Tümünü seç
'.... KullaniciAdi = ' + QuotedStr(Edit1.Text) + ' and Sifre = ' + QuotedStr(Edit2.Text)
-
- Üye
- Mesajlar: 25
- Kayıt: 12 Ara 2013 08:35
Re: Delphi Söz Dizimi Hatası
'Koctug' is not a valid integer value hatası verdi başa döndük yinemrmarman yazdı:Yaklaştınız...
Doğrusu :şeklinde.Kod: Tümünü seç
'.... KullaniciAdi = ' + QuotedStr(Edit1.Text) + ' and Sifre = ' + QuotedStr(Edit2.Text)

sadedi:=ADODataset1.Fields[2].AsInteger;
şurada hata var sanırım.
Re: Delphi Söz Dizimi Hatası
"SELECT * FROM Personel" cümlesinde çıkan alanların sıralamasını ve alan tiplerini bir yere yazar mısınız ?
- Fields[2] (yani 0,1,2 şeklinde gider, 0'dan başlar) (3) nolu sıradaki alanınız Integer alan tipi değildir. Hata mesajına göre o satırınız şöyle olacaktı.
ADODataset1.Fields[2].AsString; ama o da sadedi değişkeninize uygun olmadığını tahmin ediyorum. Demek ki yanlış değişkene yanlış alanı atamaya çalışıyorsunuz.
- Fields[2] (yani 0,1,2 şeklinde gider, 0'dan başlar) (3) nolu sıradaki alanınız Integer alan tipi değildir. Hata mesajına göre o satırınız şöyle olacaktı.
ADODataset1.Fields[2].AsString; ama o da sadedi değişkeninize uygun olmadığını tahmin ediyorum. Demek ki yanlış değişkene yanlış alanı atamaya çalışıyorsunuz.

-
- Üye
- Mesajlar: 25
- Kayıt: 12 Ara 2013 08:35
Re: Delphi Söz Dizimi Hatası
Hocam Access dosyasında kullaniciadi ve sifre alanları kısa metinmiş sayı olarak değiştirdim. "Ölçüt ifadesinde veri türü uyuşmazlığı" hatası verdi.mrmarman yazdı:"SELECT * FROM Personel" cümlesinde çıkan alanların sıralamasını ve alan tiplerini bir yere yazar mısınız ?
- Fields[2] (yani 0,1,2 şeklinde gider, 0'dan başlar) (3) nolu sıradaki alanınız Integer alan tipi değildir. Hata mesajına göre o satırınız şöyle olacaktı.
ADODataset1.Fields[2].AsString; ama o da sadedi değişkeninize uygun olmadığını tahmin ediyorum. Demek ki yanlış değişkene yanlış alanı atamaya çalışıyorsunuz.
Demek istediğiniz Personel Tablosunda PersonelID=0 TCNo=1 PersonelAd=2 PersonelSoyad=3 Telefon=4 Adres=5 Gorev=6 GirisTarihi=7 KullaniciAdi=8 Sifre=9 mu?
Ben bu programı yanlış yazdım herhalde;
Kod: Tümünü seç
var
Oturum1: TOturum1;
acilis:integer;
implementation
uses Unit3, Unit2, Unit4, Unit5, Unit7, Unit6;
{$R *.dfm}
procedure TOturum1.BitBtn1Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TOturum1.Button1Click(Sender: TObject);
var
sadedi:integer;
begin
ADODataset1.close;
ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi = ' + QuotedStr(Edit1.Text) + ' and Sifre = ' + QuotedStr(Edit2.Text);
ADODataset1.Open;
sadedi:=ADODataset1.Fields[2].AsInteger;
Oturum1.hide;
acilis:=ADODataset1.Fields[0].AsInteger;
if sadedi=1 then AnaEkran2.show else
begin
if sadedi=2 then KitapSorgulama4.show else
begin
if sadedi=3 then Personel3.show else
begin
Application.MessageBox('Lütfen Kullanıcı Adınızı veya Şifrenizi Kontrol Ediniz.','Sistem Mesajı',MB_OK);
Oturum1.Show;
end;
end;
end;
end;
Re: Delphi Söz Dizimi Hatası
S.A.
İlk olarak kullanıcı adı ve şifreyi neden numaraya çevirdiniz. Mantıken alfanumerik olması daha doğru.
Eğer numerik ise o zaman QuotedStr fonksyionunu kullanmanıza gerek kalmadı zira QuotedStr metindeki tırnakları kontrol eder ve tırnak ile çevreler. Oysa ki sorgularda integer alanlar tırnaksız kullanılır.
İkinci olarak fieldları isimleriyle çağırabilirsiniz.
Yani yerine kullanabilirsiniz.
Üçüncü olarak
demişsiniz.
Burada bir terslik var. String bir değeri integera cast etmeye çalışmışsınız.
Hatayı bundan dolayı veriyor olabilir.
Kolay gelsin.
İlk olarak kullanıcı adı ve şifreyi neden numaraya çevirdiniz. Mantıken alfanumerik olması daha doğru.
Eğer numerik ise o zaman QuotedStr fonksyionunu kullanmanıza gerek kalmadı zira QuotedStr metindeki tırnakları kontrol eder ve tırnak ile çevreler. Oysa ki sorgularda integer alanlar tırnaksız kullanılır.
İkinci olarak fieldları isimleriyle çağırabilirsiniz.
Yani
Kod: Tümünü seç
ADODataset1.Fields[2].AsString
Kod: Tümünü seç
ADODataset1.FieldByName('PersonelAd').AsString
Üçüncü olarak
demişsiniz. Bu durunda 2 nolu kayıt PersonelAd ikenPersonel Tablosunda PersonelID=0 TCNo=1 PersonelAd=2 PersonelSoyad=3 Telefon=4 Adres=5 Gorev=6 GirisTarihi=7 KullaniciAdi=8 Sifre=9
Kod: Tümünü seç
sadedi:=ADODataset1.Fields[2].AsInteger;
Oturum1.hide;
acilis:=ADODataset1.Fields[0].AsInteger;
Burada bir terslik var. String bir değeri integera cast etmeye çalışmışsınız.
Hatayı bundan dolayı veriyor olabilir.
Kolay gelsin.