Sqllite veritabanı ekleme problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Sqllite veritabanı ekleme problemi

Mesaj gönderen carsoft »

Sql lite veritabanı bağlantıda sorun yok veri eklemek istedigimde sadece 1 tane ekleme yapıyor neden anlamadım.

dosya arama sonucunda bulunan dosya yollarını eklemek istiyorum fakat sadece tek bir tane ekleme yapıyor.

Kod: Tümünü seç

procedure TMyThread.FileSearchEx(const PathName: string; const Extensions: string);
const
  FileMask = '*.*';

var
  Rec: TSearchRec;
  slDBpath: string;
  sldb: TSQLiteDatabase;
  sltb: TSQLIteTable;
  sSQL: String;
  i : integer;
  ekle,sira,deger : string;
  Path,yol: string;
  position: integer;
begin
  Path := IncludeTrailingPathDelimiter(PathName);
  sira:= '2';
  deger := '15';
  if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
  begin
    try
      repeat
        if PosEx(ExtractFileExt(Rec.Name), Extensions) > 0 then
        begin
          FNewLine := Path + Rec.Name;
          Synchronize(UpdateList);

     
          slDBPath := ExtractFilepath(application.exename) + 'test.db'; // sql lite database başlangıcı

          sldb := TSQLiteDatabase.Create(slDBPath);
      try
      if sldb.TableExists('testTable') then begin
         sSQL := 'DROP TABLE testtable';
         sldb.execsql(sSQL);
      end;

      sSQL := 'CREATE TABLE testtable ([ID] INTEGER PRIMARY KEY,[OtherID] INTEGER NULL,';
      sSQL := sSQL + '[Name] VARCHAR (255),[Number] FLOAT, [notes] BLOB, [picture] BLOB COLLATE NOCASE);';

      sldb.execsql(sSQL);
      sldb.execsql('CREATE INDEX TestTableName ON [testtable]([Name]);');
      sldb.BeginTransaction;
      begin
      sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("'+ FNewLine + '","'+ sira + '","'+ deger + '","Eklenen notlar");'; // ekleme yap
      sldb.ExecSQL(sSQL);
      end;
      sldb.Commit;
      sltb := slDb.GetTable('SELECT * FROM testtable');
  finally
      sltb.Free;
  end;

        end;
      until (Terminated) or (FindNext(Rec) <> 0);
    finally
      FindClose(Rec);
    end;
  end;

  if FindFirst(Path + FileMask, faDirectory, Rec) = 0 then
  begin
    try
      repeat
        if (Rec.Name <> '.') and (Rec.Name <> '..') then
          FileSearchEx(Path + Rec.Name, Extensions);
      until (Terminated) or (FindNext(Rec) <> 0);
    finally
      FindClose(Rec);
    end;
  end;
end;
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Sqllite veritabanı ekleme problemi

Mesaj gönderen SimaWB »

Repeat-Until döngüsü içerisinde her seferinde tabloyu silip(DROP) tekrar oluşturuyorsunuz(CREATE TABLE) gibi gözüküyor.
There's no place like 127.0.0.1
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Sqllite veritabanı ekleme problemi

Mesaj gönderen carsoft »

Düzenledim ekleme yapıyor ama her defasında tabloyu silip oluşturmak yerine tablo içindeki veriyi nasıl silebilirim
biraz yavaş çalışıyor normalmi acaba sql lite

Kod: Tümünü seç

procedure TForm2.Button3Click(Sender: TObject);
var
nItem: TListItem;
slDBpath: string;
sldb: TSQLiteDatabase;
sltb: TSQLIteTable;
sSQL: String;
i : integer;
ekle: string;
 begin
   ekle := 'Ürünü incele';

   slDBPath := ExtractFilepath(application.exename) + 'test.db';
   sldb := TSQLiteDatabase.Create(slDBPath);
try
  if sldb.TableExists('testTable') then
  begin
sldb.BeginTransaction;
begin
 sSQL := 'INSERT INTO testtable(Notes) VALUES ("'+ ekle+ '");'; 
 sldb.ExecSQL(sSQL);
end;
 sldb.Commit;
sltb := slDb.GetTable('SELECT * FROM testtable');
end;
finally
 sltb.Free;
end;

end;

end.
ertank
Kıdemli Üye
Mesajlar: 1654
Kayıt: 12 Eyl 2015 12:45

Re: Sqllite veritabanı ekleme problemi

Mesaj gönderen ertank »

Merhaba,

Öncelikle, soru sorar iken örnek kod göndermeden önce *blok* (begin..end, try..finally..end, vb.) içinde kalan kodları en az 2 karakter içeriden şeklinde düzenler iseniz kod okuması ve yardım etmesi çok daha kolay olacaktır. Buna özen göstermenizde fayda var.

- SQLite Database dosyasını uygulama ilk çalıştığı zaman oluşturun. Uygulama kapatıldığı zaman ihtyacınıza göre kapatın veya silin.
- TableExists() fonksiyonunu kullanmanız gerekmez. Aşağıdaki gibi bir tablo oluşturma SQL komutunu her zaman kullanabilirsiniz. Tablo olduğu durumda bu kod çalışmaz. Yok ise yeni tablo oluşturur.

Kod: Tümünü seç

CREATE TABLE IF NOT EXISTS testtable ([ID] INTEGER PRIMARY KEY,[OtherID] INTEGER NULL,[Name] VARCHAR (255),[Number] FLOAT, [notes] BLOB, [picture] BLOB COLLATE NOCASE);
- FileSearchEx() prosedürünü çalıştırmadan önce 'DELETE FROM TESTTABLE' SQL komutunu çalıştırın. Böylece tablo içini temizlemiş olursunuz.
- FileSearchEx() prosedürünü Boolean türünde değer çeviren bir fonksiyona çevirerek fonksiyon içinde hata alınması durumunu kontrol edebilirsiniz. Böylece fonksiyonu çalıştırmadan önce Transaction başlatıp sonuç başarılı ise transaction commit edilsin, yoksa rollback edilsin gibi bi kod yazmanız mümkün olacaktır. SQLite büyük tek bir transaction için optimize edilmiştir. Sık sık Transaction başlatır ve commit ederseniz bu durumda ciddi yavaşlık gözlemleyebilirsiniz. Saniyede 10000 kayıt girişi yapılabildiği gözlemlenen SQLite testleri mevcuttur.
- FileSearchEx() fonksiyonu içinde sadece "INSERT INTO" ile başlayan kayıt ekleme kodunu kullanın.
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Sqllite veritabanı ekleme problemi

Mesaj gönderen carsoft »

Teşşekürler ertan abi sayende çok şey ögrendim
Cevapla