Büyük tablolardaki arama sorunu

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
ozturkfa
Üye
Mesajlar: 8
Kayıt: 09 Eyl 2003 05:58

Büyük tablolardaki arama sorunu

Mesaj gönderen ozturkfa »

20.000 den fazla kayit olan tablolarda (indexli) arama yapilirken
'like ' kullandigimda sıkıntı oluyor . Tavsiyelerinizi bekliyorum
aşagida bir kod ornegi var. bu kod çalişmıyor. Problemi bulamıyorum !?


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, StdCtrls, Grids, DBGrids, ADODB;

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
q1: TADOQuery;
DBGrid1: TDBGrid;
Button1: TButton;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
q1.Close;
q1.SQL.Clear;
q1.SQL.Add('select * from personel where soyadi like :syad');
q1.Parameters.ParamByName('syad').Value:='%';
q1.Open;
end;

end.

sonuc boşküme :)
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7587
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

merhaba,

like'tan sonra sadece % koymuşsunuz. Bence kullanıcı bir harf veya harfler girdikten sonra siz arama yaptırın. Mesela Edit1'e girmiş olsun. O zaman kodunuz şöyle olmalı:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  q1.Close; 
  q1.SQL.Clear; 
  q1.SQL.Add('select * from personel where soyadi like ''' + Edit1.Text + '%'''); 
  q1.Open; 
end; 
Kolay gelsin.
ozturkfa
Üye
Mesajlar: 8
Kayıt: 09 Eyl 2003 05:58

anlatamadım herhalde

Mesaj gönderen ozturkfa »

cevabınız için teşekkür ederim
benim sıkıntım bu query nin boş küme dönmesi. kayitli herkesin bir soyadi var ama query boş küme dönüyor.
sadece % yazmamin sebebi daha basit görünmesini istemem, yoksa bir kriter vermedigimi bende biliyorum
asil programda zaten bircok edite göre arama yapıyor. bu kod calismayinca foruma gönderdigim program(cigi) denedim. oda olmadi! :x



ilginiz için tekrar teşekkür ederim.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Hangi DB'yi kullanıyorsunuz? Dil ayarları tamam mı? Arama yaptığınız Field'In DB üzerindeki tanımı nedir?
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
ozturkfa
Üye
Mesajlar: 8
Kayıt: 09 Eyl 2003 05:58

sql server 2000

Mesaj gönderen ozturkfa »

kullandigim database sql server 2000
sıkıntı olan tablo lar in field degerleri nvarchar cinsinden

bir access tablosundan sqlserver2000 e table lar aktardim (import export kullanarak). bazi recordlarin bazi fieldlari <NULL> kaldi. 'like ' kullanarak degeri <NULL> olan fieldleride taramak sıkıntı oldu. ben bunu <NULL> yerine ' ' kullanarak astim(tavsiye ederim ise yariyor :D ) . daha farkli cozum yollari varsa onerilere acigim....

ilginiz icin cook tesekkur ederim
sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

Bide şunu deneyin
Try
q1.Close;
q1.Unprepare;
q1.SQL.Clear;
q1.SQL.Add('select * from personel where soyadi like :syad');
q1.Prepare;
q1.Parameters.Param[0].AsString:=Edit1.Text+'%';
q1.Open;
Except
On Exceptin do raise;
end;

1.Field alanlarının yapısında value kullanmamaya özen gösterin. Value yavaşlamaya sebeb olacaktır.Aslında hiç bir yerde value kullanmamaya özen gösterin.
2.Yukarda gösterildiği gibi Unprepare ve prepare methotlarını mutlaka kullanın. Query nin hafızada hazırlanması için gereklidir.
3. SQL de NULL değer ile ' ' değer farklı şeylerdir. NULL yokluk anlamına gelir. ' ' ise boş değer (Space) anlamındadır. NULL değerlerini sorgulayacaksanız IS NULL ve IS NOT NULL ile sorgulayın.
4. Sorgularınızı Try Except blokları arasına alın. Hata oluştuğunda kilitlenmeyi önleyecektir.
Sevgiler...
sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

q1.Parameters.Param[0].AsString:=Edit1.Text+'%';
satırı yanlış olmuş
q1.Param[0].AsString:=Edit1.Text+'%'; olacak.
:)
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selam,

MS-SQL Server hakkında bir uyarı.

Eğer bir select yazdığında değer dönmüyor ise bunun sebebi NULL alanlardan kaynaklanıyordur. Bu sebeple (eğer mümkün ise) sorgulama yapacağın alanlara Null değer ataması yapma !. Eğer NULL olması gerekiyor ise ve senin de bu alan üzerinde sorgulama yapman gerekiyor ise, işte o zaman WHERE koşullarında NULL olan alanlarını ayrı bir kontrole tabi tutman gerekir.

Örnek;
TABLO1'de ALAN1 isimli alanımız Char(10) olsun ve Null değer girilebilsin

Kod: Tümünü seç


SELECT * FROM TABLO1
WHERE ISNULL(ALAN1,'') = 'A'

örnek içindeki ISNULL(ALAN1,'') demek aslında, WHERE kontrolu sırasında eğer kayıtlarda NULL var ise o kaydı NULL kabul etme, ikinci verdiğimiz parametreyi geri döndür, yani boşluk ( '' )

MSDN'den ISNULL'a bakarsan orada daha detaylı örnekleri görebilirsin.

Kolay gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla