Kayıt sırasında (database is locked) hatası

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Kayıt sırasında (database is locked) hatası

Mesaj gönderen brs »

Merhaba,

Sqlite database DBNavigator ile kayıt eklerken sorun olmaz iken bu işlemi buton üzerinden yapınca (TDBXError with message 'database is locked'.) hatası alıyorum sebebini bulamadım örnek proje linki http://s3.dosya.tc/server21/IqcIVO/Test.rar.html buradan

procedure TForm1.Button1Click(Sender: TObject);
begin
with SQLQuery1 do
begin
Close;
SQL.Clear;
Sql.add('Insert Into USER (KULLANICIADI, KULLANICISIFRE)');
Sql.add(' Values (:Kadi, :KadiSif)');
ParamByName('Kadi').AsString:= Edit1.Text;
ParamByName('KadiSif').AsString:= Edit2.Text;
ExecSQL;
Close;
Active:= False;
end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Kayıt sırasında (database is locked) hatası

Mesaj gönderen mrmarman »

- Örnek projende ihtiyaç duyulacak SQLite'in DLL'si yoktu ve veritabanı lokasyonunu statik verildiğinden bulunamadı. Bundan dolayı söylediğin durum değil başka türlü sorunlar nedeniyle çalışmadı.

- Aşağıdaki şekilde bir düzenek ile çalışır halde örnek hazırladım.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  with SQLQuery1 do
  begin
    Close;
    SQL.Clear;
    Sql.add('Insert Into USER (KULLANICIADI, KULLANICISIFRE)');
    Sql.add(' Values (:Kadi, :KadiSif)');
    ParamByName('Kadi').AsString:= Edit1.Text;
    ParamByName('KadiSif').AsString:= Edit2.Text;
    ExecSQL;

    // SQL cümlemizi yollayalım...
    ClientDataSet1.Active := False;
    ClientDataSet1.CommandText := 'SELECT * FROM [USER]';
    ClientDataSet1.Active := True;
  end;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  SQLConnection1.Connected := False;
  SQLConnection1.Params.Values['Database'] := ExtractFilePath(Application.ExeName) + 'Database\MyDatabase.db';
  try
    SQLConnection1.Connected    := True;
    Statusbar1.Panels[1].Text   := 'Database İle Bağlantı Sağlandı!';

    ClientDataSet1.ProviderName := 'DataSetProvider1';
    DataSetProvider1.DataSet    := SQLQuery1;
    DataSetProvider1.Options    := [poAllowCommandText];

    DBGrid1.DataSource          := DataSource1;
    DataSource1.DataSet         := ClientDataSet1;

    // SQL cümlemizi yollayalım...
    ClientDataSet1.Active := False;
    ClientDataSet1.CommandText := 'SELECT * FROM [USER]';
    ClientDataSet1.Active := True;
  except
    Statusbar1.Panels[1].Text:= 'Hata Oluştu Lütfen Daha Sonra Tekrar Deneyiniz!';
  end;
end;


procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if DBGrid1.DataSource.DataSet.RecNo mod 2 =  0 then//Çift sayılı Alanların Rengi 0,2,4....
     DBGrid1.Canvas.Brush.Color := RGB (255, 255, 255)  //Çift sayılı Zemin Rengi
  else
  if DBGrid1.DataSource.DataSet.RecNo mod 2 =  1 then//Tek Sayılı Alanların Rengi 1,3,5...
     DBGrid1.Canvas.Brush.Color := RGB (238, 233, 233); //Tek sayılı Zemin Rengi

  with DBGrid1.Canvas do
  begin
    DBGrid1.Canvas.Font.Size:=8;//Yazı Büyüklüğü
    begin
      if (gdSelected in State) then
      begin
        DBGrid1.Canvas.Font.Size   := 8;//Seçili Alan Yazı Büyüklüğü
        DBGrid1.Canvas.Font.Style  :=[fsBold]; //Seçili Alan Yazı Kalınlığı
        DBGrid1.Canvas.Font.Color  := RGB(0, 0, 128);//Seçili Alan Yazı Rengi
        DBGrid1.Canvas.Brush.Color := RGB(255, 182, 193);// Seçili Alanın Zemin Rengi
      end;
    end;
    DBGrid1.Canvas.TextRect(Rect, Rect.left+2, Rect.Top+2, Column.Field.AsString );
  end;
end;
Resim

SQLite DLL dosyası eklendi, Win32 dizininin içinde mevcuttur.

Çalışır haldeki örnek projeyi bu linkten indirebilirsin. :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Kayıt sırasında (database is locked) hatası

Mesaj gönderen brs »

Elinize sağlık hocam
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
hido
Üye
Mesajlar: 268
Kayıt: 29 Mar 2014 04:32

Re: Kayıt sırasında (database is locked) hatası

Mesaj gönderen hido »

Selam bileşenleri bir birine bağlı olarak projemi hazırlıyorum sqlite.dll projeme ekledim.

Fakat SQLQuery active true yapıyorum ve kullanıcı giriş yapınca database is locked hasası SQLQuery active false olunca hata vermiyor...

procedure TForm1.GirisClick(Sender: TObject);
begin
try
with SQLQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('Select * From User where KADI=:Kad and KSIFRE=:Ksif');
ParamByName('Kad').Value := (Edit1.text);
ParamByName('Ksif').Value := (Edit2.text);
Prepared := True;
Open;
if not IsEmpty then
begin
Form2.Show();
Form1.Hide();
Close;
Active := False;
end
else
begin
Close;
Active := False;
Label1.Caption := 'Kullanıcı Adı veya Şifre Yanlış!';

end;
end;
except
Label1.Caption := 'Hata Oluştu!!!!';
end;
end;


procedure TForm2.FormShow(Sender: TObject);
begin
with Form1.SQLQuery1 do
begin
Close;
SQL.Clear;
SQL.add('Update USER Set ONLINE=:Ofline');
SQL.add('where KADI =''' + Form1.Edit1.Text + '''');
ExecSQL;
Close;
end;
end;


DriverName=SQLite
DriverUnit=Data.DbxSqlite
DriverPackageLoader=TDBXSqliteDriverLoader,DBXSqliteDriver170.bpl
MetaDataPackageLoader=TDBXSqliteMetaDataCommandFactory,DbxSqliteDriver170.bpl
FailIfMissing=False
Database=C:\Testo\Database\Database.db
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Kayıt sırasında (database is locked) hatası

Mesaj gönderen brs »

procedure TForm2.FormShow(Sender: TObject);
begin
with Form1.SQLQuery1 do
begin
Close;
SQL.Clear;
SQL.add('Update USER Set ONLINE=:Ofline');
SQL.add('where KADI =''' + Form1.Edit1.Text + '''');
ExecSQL; ----Bunları iptal
Close;
end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: Kayıt sırasında (database is locked) hatası

Mesaj gönderen warder »

Aynı anda iki erişime izin vermez. ilk bağlanan kilitlediği için ikinci hata üretir. SQLite de durum maalesef böyle.
Bu prensibi takip ederseniz locked hatası almazsınız.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Cevapla