Yorumları: 1.517
Konuları: 83
Kayıt Tarihi: 20-03-2017
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.3
- Delphi 10.2
- Delphi 7
- Lazarus / FPC
Rep Puanı: 4.279 Uzman
(16-10-2018, Saat: 21:04)Mr.Developer Adlı Kullanıcıdan Alıntı: (16-10-2018, Saat: 20:56)mcuyan Adlı Kullanıcıdan Alıntı: Hocam bu arada,
Query nesnesi ile insert append vs gibi işlemler yapmak yerine Insert Into ile Direk SQL kodu göndermeniz daha sağlıklı olacaktır.
Daha önceden aynı kullanıcı adı varmı yokmu yu ise o tabloya select çekip Recordcount<1 ile kontrol ederseniz daha hızlı sonuç alırsınız
aslında bu birazda alışkanlık meselesi gibi ve SQL kodlarına çok hakim değilim. öneriniz için teşekkür ederim.
bir deneyeyim hocam fırsat bulunca dediğinizi.
walla hocam bende pek aşikar değildim.. Fakat güçlü uygulama yazarken SQL kodu ile işlemleri yapmak hem hata payını azaltıyor, hem hatanın nerde olduğunu bulmanıza daha iyi yardımcı oluyor.. hemde Daha hızlı çevik ve güçlü uygulamalar yazıyorsunuz..
ve parametre kullanın mutlaka.. '' gibi ifadeler de de sorun sıkıntı çıkabiliyor.. mesela Tarih datasında cozutuyor gibi..
Ör: (Kodu şimdi yazdım hatalar olabilir.. Affola)
q1.Close;
Q1.Sql.Text:='Insert Into Kullanicilar (ad,soyad) values (:ad,:soyad)';
q1.parambyname('ad').value:=Edit1.Text;
q1.parambyname('soyad').value:=Edit2.Text;
q1.prepare;
q1.Execute;
Q1.Close;
// Bilgi paylaştıkça çoğalır..
Yorumları: 1.309
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
(16-10-2018, Saat: 17:51)Mr.Developer Adlı Kullanıcıdan Alıntı: iyi akşamlar,
programımda üyelik bölümünde aynı kullanıcı adı olmasını önlemek için aşağıdaki kodu kullanıyorum fakat kontrolü sağlayamıyorum ve aynı kullanıcı adında bile hesap oluşturuluyor;
acaba nerde yanlış yapıyorum çözemedim de
UniConnection1.Connected := true ;
UniQuery1.Active := true ;
UniQuery1.Refresh ;
UniQuery1.Close ;
UniQuery1.ParamByName('kullaniciadi').Value := edit1.Text ;
UniQuery1.Open ;
if UniQuery1.RecordCount <> 0 then
begin
ShowMessage('Bu kullanıcı adı zaten mevcut');
end else
UniQuery1.Append; // yeni bir kayıt ekle
UniQuery1.FieldByName('kullaniciadi').AsString:=edit1.Text; // kıyasla
UniQuery1.FieldByName('sifre').AsString:=edit2.Text; // kıyasla
UniQuery1.post; // veritabanına yaz
ShowMessage('Üyelik Oluşturuldu');
Edit1.Text := '';
Edit2.Text := '';
Edit3.Text := '';
UniConnection1.Connected := false ;
UniQuery1.Active := false ;
üyeol.Close ;
girisekranı.Show ;
Hangi sorgu ile aynı kayıt olup olmadığını kontrol ediyorsun merak ettim doğrusu. SQL Nedir? diye bir başlıkta ne olduğunu öğrenirsek daha iyi olacak gibi. Veritabanında bulunan aynı verileri bulabilmek için öncellikle SELECT sorgusu ile bir verileri önüne koymak gerek.
Örneğin A tablosu içerisinde "admin" girişi var mı yok mu ona bakalım;
begin
query.close;
query.SQL.Clear;
query.SQL.Text := 'SELECT * FROM A_TABLOSU';
query.Open;
Bu tip bir sorgudan sonra RecordCount işlemini yapman lazım olacak. Sen ilk olarak Query içerisinde sorguyu yazıp parametre tanımlamışsın. O da bir yoldur. Şu an kodunda bir hata görmedim. Query içine yazılan SQL sorgusu ile alakalı olabilir.
NOT: Yurt bilgisayarı ne kötü bir şey :/ yazana kadar öldüm
Başarılar..
Yorumları: 953
Konuları: 124
Kayıt Tarihi: 06-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.383 Üstad
17-10-2018, Saat: 09:23
(Son Düzenleme: 17-10-2018, Saat: 10:39, Düzenleyen: Abdullah ILGAZ.)
Not: Bahse konu örneklem Microsoft SQL Server Veritabanına göredir. Veri tipi olarak Nvarchar, Varchar gibi tiplerin MySQL karşılığını bilmiyorum.
1- Unique olarak belirlenen alanlara girilen değerler tekrar edemez.
2- Varchar(50) tarzında bir alan belirlerseniz ve 10 karakter doldurursanız, kalan 40 karakteri boşluk olarak doldurur. Bu yüzden Nvarchar(50) tarzında kullanarak birebir kullanımı görebilirsiniz.
1. yöntem ile giderseniz insert cümleciği hataya düşer, hatanın sebebini çevirip ekranda ShowMessage olarak gösterirsiniz.
2. yöntem ile giderseniz select sorgusu attığınız zaman size nihai sonuç döner. @ meko nun dediği gibi RecordCount ile satır dönüp dönmediği bilgisi işinize yarar.
Yorumları: 283
Konuları: 1
Kayıt Tarihi: 13-03-2017
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.1
- Delphi XE7
- Delphi 7
Rep Puanı: 964 Acemi
Merhaba
programlarımda .RecordCount yerine .isEmpty'yi tercih ediyorum.
Yorumları: 1.500
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314 Üstad
17-10-2018, Saat: 10:22
(Son Düzenleme: 17-10-2018, Saat: 10:26, Düzenleyen: Tuğrul HELVACI.
Sebep: Char(50) yerine Char(40) yazmışım.
)
(17-10-2018, Saat: 09:23)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: 1- Unique olarak belirlenen alanlara girilen değerler tekrar edemez.
2- Varchar(50) tarzında bir alan belirlerseniz ve 10 karakter doldurursanız, kalan 40 karakteri boşluk olarak doldurur. Bu yüzden Nvarchar(50) tarzında kullanarak birebir kullanımı görebilirsiniz.
1. yöntem ile giderseniz insert cümleciği hataya düşer, hatanın sebebini çevirip ekranda ShowMessage olarak gösterirsiniz.
2. yöntem ile giderseniz select sorgusu attığınız zaman size nihai sonuç döner. @meko nun dediği gibi RecordCount ile satır dönüp dönmediği bilgisi işinize yarar.
Üstad 2nci maddeyi sanırım yanlışlıkla yazdınız. Varchar(50) 'lik bir alana 10 karakterlik bir veri yazarsanız 40 karakter boşluk ile doldurulmaz. Bahsettiğiniz husus veri türü CHAR(50) olduğu zaman geçerli olur. Varchar alanlarda görünmeyen bir 4 byte'lık veri tutulur. O da ilgili alanın içinde ne kadar data tutulduğunu işaret eder. Yani; Varchar(50) lik bir alan içinde 10 byte'lık bir data var ise, gerçek data size 10 + 4 = 14 byte'dır. NVarchar ise unicode'dur, dolayısı ile bir karakter 2 byte ile temsil edilir. Bu nedenle Varchar(50)'nin unicode karşılığı NVarchar(100) olmalıdır.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Yorumları: 453
Konuları: 14
Kayıt Tarihi: 07-09-2016
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.1
- Delphi XE7
- Delphi XE2
- Delphi 7
Rep Puanı: 1.833 Programcı
(17-10-2018, Saat: 10:22)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: (17-10-2018, Saat: 09:23)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: 1- Unique olarak belirlenen alanlara girilen değerler tekrar edemez.
2- Varchar(50) tarzında bir alan belirlerseniz ve 10 karakter doldurursanız, kalan 40 karakteri boşluk olarak doldurur. Bu yüzden Nvarchar(50) tarzında kullanarak birebir kullanımı görebilirsiniz.
1. yöntem ile giderseniz insert cümleciği hataya düşer, hatanın sebebini çevirip ekranda ShowMessage olarak gösterirsiniz.
2. yöntem ile giderseniz select sorgusu attığınız zaman size nihai sonuç döner. @meko nun dediği gibi RecordCount ile satır dönüp dönmediği bilgisi işinize yarar.
Üstad 2nci maddeyi sanırım yanlışlıkla yazdınız. Varchar(50) 'lik bir alana 10 karakterlik bir veri yazarsanız 40 karakter boşluk ile doldurulmaz. Bahsettiğiniz husus veri türü CHAR(50) olduğu zaman geçerli olur. Varchar alanlarda görünmeyen bir 4 byte'lık veri tutulur. O da ilgili alanın içinde ne kadar data tutulduğunu işaret eder. Yani; Varchar(50) lik bir alan içinde 10 byte'lık bir data var ise, gerçek data size 10 + 4 = 14 byte'dır. NVarchar ise unicode'dur, dolayısı ile bir karakter 2 byte ile temsil edilir. Bu nedenle Varchar(50)'nin unicode karşılığı NVarchar(100) olmalıdır.
Hay Allah razı olsun Tuğrul hocam. Dedim MySql'de niye böyle garip/farklı yapmışlar bunu, diğer sistemlerden
Yorumları: 953
Konuları: 124
Kayıt Tarihi: 06-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.383 Üstad
(17-10-2018, Saat: 10:22)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: (17-10-2018, Saat: 09:23)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: 1- Unique olarak belirlenen alanlara girilen değerler tekrar edemez.
2- Varchar(50) tarzında bir alan belirlerseniz ve 10 karakter doldurursanız, kalan 40 karakteri boşluk olarak doldurur. Bu yüzden Nvarchar(50) tarzında kullanarak birebir kullanımı görebilirsiniz.
1. yöntem ile giderseniz insert cümleciği hataya düşer, hatanın sebebini çevirip ekranda ShowMessage olarak gösterirsiniz.
2. yöntem ile giderseniz select sorgusu attığınız zaman size nihai sonuç döner. @meko nun dediği gibi RecordCount ile satır dönüp dönmediği bilgisi işinize yarar.
Üstad 2nci maddeyi sanırım yanlışlıkla yazdınız. Varchar(50) 'lik bir alana 10 karakterlik bir veri yazarsanız 40 karakter boşluk ile doldurulmaz. Bahsettiğiniz husus veri türü CHAR(50) olduğu zaman geçerli olur. Varchar alanlarda görünmeyen bir 4 byte'lık veri tutulur. O da ilgili alanın içinde ne kadar data tutulduğunu işaret eder. Yani; Varchar(50) lik bir alan içinde 10 byte'lık bir data var ise, gerçek data size 10 + 4 = 14 byte'dır. NVarchar ise unicode'dur, dolayısı ile bir karakter 2 byte ile temsil edilir. Bu nedenle Varchar(50)'nin unicode karşılığı NVarchar(100) olmalıdır.
Üstad Sql Server üzerinden konuştuğumu belirtmeyi unutmuşum. Mysql konusunda çok tecrübe sahibi değilim. Böyle bir veri tipi var mı onu bile bilmiyorum.
Yorumları: 1.500
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314 Üstad
(17-10-2018, Saat: 10:38)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: (17-10-2018, Saat: 10:22)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Üstad 2nci maddeyi sanırım yanlışlıkla yazdınız. Varchar(50) 'lik bir alana 10 karakterlik bir veri yazarsanız 40 karakter boşluk ile doldurulmaz. Bahsettiğiniz husus veri türü CHAR(50) olduğu zaman geçerli olur. Varchar alanlarda görünmeyen bir 4 byte'lık veri tutulur. O da ilgili alanın içinde ne kadar data tutulduğunu işaret eder. Yani; Varchar(50) lik bir alan içinde 10 byte'lık bir data var ise, gerçek data size 10 + 4 = 14 byte'dır. NVarchar ise unicode'dur, dolayısı ile bir karakter 2 byte ile temsil edilir. Bu nedenle Varchar(50)'nin unicode karşılığı NVarchar(100) olmalıdır.
Üstad Sql Server üzerinden konuştuğumu belirtmeyi unutmuşum. Mysql konusunda çok tecrübe sahibi değilim. Böyle bir veri tipi var mı onu bile bilmiyorum.
Üstad ben de Sql Server üzerinden cevap verdim zaten
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Yorumları: 950
Konuları: 152
Kayıt Tarihi: 29-11-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.135 Uzman
17-10-2018, Saat: 13:15
(Son Düzenleme: 17-10-2018, Saat: 13:35, Düzenleyen: Mr.Developer.)
(16-10-2018, Saat: 21:13)mcuyan Adlı Kullanıcıdan Alıntı: (16-10-2018, Saat: 21:04)Mr.Developer Adlı Kullanıcıdan Alıntı: aslında bu birazda alışkanlık meselesi gibi ve SQL kodlarına çok hakim değilim. öneriniz için teşekkür ederim.
bir deneyeyim hocam fırsat bulunca dediğinizi.
walla hocam bende pek aşikar değildim.. Fakat güçlü uygulama yazarken SQL kodu ile işlemleri yapmak hem hata payını azaltıyor, hem hatanın nerde olduğunu bulmanıza daha iyi yardımcı oluyor.. hemde Daha hızlı çevik ve güçlü uygulamalar yazıyorsunuz..
ve parametre kullanın mutlaka.. '' gibi ifadeler de de sorun sıkıntı çıkabiliyor.. mesela Tarih datasında cozutuyor gibi..
Ör: (Kodu şimdi yazdım hatalar olabilir.. Affola)
q1.Close;
Q1.Sql.Text:='Insert Into Kullanicilar (ad,soyad) values (:ad,:soyad)';
q1.parambyname('ad').value:=Edit1.Text;
q1.parambyname('soyad').value:=Edit2.Text;
q1.prepare;
q1.Execute;
Q1.Close;
çok teşekkür ederim hocam parametreyi böyle oluşturmayı öğrenmek iyi oldu.
o zaman tek Query ile işlemleri baştan gözden geçirip düzenleyeyim.
(16-10-2018, Saat: 22:57)Halil Han Badem Adlı Kullanıcıdan Alıntı: (16-10-2018, Saat: 17:51)Mr.Developer Adlı Kullanıcıdan Alıntı: iyi akşamlar,
programımda üyelik bölümünde aynı kullanıcı adı olmasını önlemek için aşağıdaki kodu kullanıyorum fakat kontrolü sağlayamıyorum ve aynı kullanıcı adında bile hesap oluşturuluyor;
acaba nerde yanlış yapıyorum çözemedim de
UniConnection1.Connected := true ;
UniQuery1.Active := true ;
UniQuery1.Refresh ;
UniQuery1.Close ;
UniQuery1.ParamByName('kullaniciadi').Value := edit1.Text ;
UniQuery1.Open ;
if UniQuery1.RecordCount <> 0 then
begin
ShowMessage('Bu kullanıcı adı zaten mevcut');
end else
UniQuery1.Append; // yeni bir kayıt ekle
UniQuery1.FieldByName('kullaniciadi').AsString:=edit1.Text; // kıyasla
UniQuery1.FieldByName('sifre').AsString:=edit2.Text; // kıyasla
UniQuery1.post; // veritabanına yaz
ShowMessage('Üyelik Oluşturuldu');
Edit1.Text := '';
Edit2.Text := '';
Edit3.Text := '';
UniConnection1.Connected := false ;
UniQuery1.Active := false ;
üyeol.Close ;
girisekranı.Show ;
Hangi sorgu ile aynı kayıt olup olmadığını kontrol ediyorsun merak ettim doğrusu. SQL Nedir? diye bir başlıkta ne olduğunu öğrenirsek daha iyi olacak gibi. Veritabanında bulunan aynı verileri bulabilmek için öncellikle SELECT sorgusu ile bir verileri önüne koymak gerek.
Örneğin A tablosu içerisinde "admin" girişi var mı yok mu ona bakalım;
begin
query.close;
query.SQL.Clear;
query.SQL.Text := 'SELECT * FROM A_TABLOSU';
query.Open;
Bu tip bir sorgudan sonra RecordCount işlemini yapman lazım olacak. Sen ilk olarak Query içerisinde sorguyu yazıp parametre tanımlamışsın. O da bir yoldur. Şu an kodunda bir hata görmedim. Query içine yazılan SQL sorgusu ile alakalı olabilir.
NOT: Yurt bilgisayarı ne kötü bir şey :/ yazana kadar öldüm 
Başarılar..
kod örneği için teşekkür ederim hocam da aklıma takılan bir diğer husus ;
Query'den parametre oluşturup giriş yapma aşamasında kullandığımda giriş yapıyor ya da yoksa yapmıyorken aynı mantığı üyelik kısmında uygulamadığımda işe yaramaması garip
ben tekrar iyice inceleyeyim bakalım nerde ne hatam varmış tekrar gözden geçireyim
sonuç için tekrar döneceğim
UniConnection1.Connected := true ;
UniQuery1.Active := true ;
//UniQuery1.Refresh ;
UniQuery1.Close ;
UniQuery1.ParamByName('kullaniciadi').Value := edit1.Text ;
UniQuery1.ParamByName('sifre').Value := edit2.Text ;
UniQuery1.Open ;
if UniQuery1.RecordCount <> 0 then
begin
Edit1.Text := '';
Edit2.Text := '';
anasayfabolumu.Show;
teşekkürler...
Yorumları: 953
Konuları: 124
Kayıt Tarihi: 06-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.383 Üstad
(17-10-2018, Saat: 10:55)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: (17-10-2018, Saat: 10:38)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: Üstad Sql Server üzerinden konuştuğumu belirtmeyi unutmuşum. Mysql konusunda çok tecrübe sahibi değilim. Böyle bir veri tipi var mı onu bile bilmiyorum.
Üstad ben de Sql Server üzerinden cevap verdim zaten 
 Nvarchar'ı 0'lık verilerle uzunluğu kadar doldurmuyor olması ve şifreleme için ekstra maliyetinin olmaması sebebiyle kullanıyordum. Temel farklılığı nedir üstad?
|