Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
MySQL - üyelik bölümüm hakkında
#11
(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.. 

Cevapla
#12
(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  Dodgy

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 Big Grin

Başarılar..
kisisel_logo_dark.png
WWW
Cevapla
#13
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.
Cevapla
#14
Merhaba
programlarımda .RecordCount yerine .isEmpty'yi tercih ediyorum.
Cevapla
#15
(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...
WWW
Cevapla
#16
(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  Rolleyes
Cevapla
#17
(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.
Cevapla
#18
(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 Rolleyes
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#19
(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  Dodgy

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 Big Grin

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  Big Grin
ben tekrar iyice inceleyeyim bakalım nerde ne hatam varmış tekrar gözden geçireyim  Smile
sonuç için tekrar döneceğim  Shy

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...
Cevapla
#20
(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 Rolleyes

Shy  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?
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Orange Ui Page Control Hakkında nurah 3 563 30-10-2025, Saat: 09:17
Son Yorum: RAD Coder
  iOS Bildirim hakkında barissagir 19 3.120 03-02-2025, Saat: 16:27
Son Yorum: barissagir
  Duns Numarası Hakkında Yardım glagher 5 1.570 16-08-2024, Saat: 16:48
Son Yorum: glagher
  Xcode Üyeliği hakkında barissagir 15 4.993 07-02-2024, Saat: 16:26
Son Yorum: barissagir
  Andorid Font Hakkında barissagir 2 1.000 20-11-2023, Saat: 09:05
Son Yorum: RAD Coder



Konuyu Okuyanlar: 1 Ziyaretçi