Sqlite attach ederken access violation [FIREDAC]

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen PROGRAMADOR »

Merhaba arkadaşlar,

Veri tabanına bağlanmak için aşağıdaki kodu yazıyorum ancak access violation hatası alıyorum. Başka projede çalışmasına rağmen şimdi çalışmıyor. Ne yapacağımı bilemedim.

Kod şöyle:

Kod: Tümünü seç

const
  //folders
  DataFolder         ='astraDATA';
  LibFolder          ='astraLIB';
  logFolder          ='astraLOG';
  //files
  db_File_Name            ='ASTRADB.DB';
  Chatroomips_db_FileName ='CHATROOMIPSDB.DB';
  Archive_db_FileName     ='ARCHIVEDB.DB';
  
var
  App_path:widestring;   //app dir path

  //sql3.dll yolu
  LibFolder_Path:widestring;
  //sql3.dll folder
  Lib_Path:widestring;

  Data_folder_path:widestring;  // data folder path
  Log_Folder_Path:widestring; //log folder path

  MainDB_File_Path:WideString;  //database file path
  ChatroomipsDB_File_Path:widestring; //Chatroomips DB
  ArchiveDB_File_Path:widestring;
  
  ...
 procedure init_Path_Vars;
begin
     App_path:=ExtractFilePath(ParamStr(0));

     LibFolder_Path:=app_path+LibFolder;
     Lib_Path:=LibFolder_Path+'\sqlite3.dll';

     data_folder_path:=App_path+DataFolder+'\';
     MainDB_File_Path:= data_folder_path+db_File_Name;
     ChatroomipsDB_File_Path:=data_folder_path+Chatroomips_db_FileName;
     ArchiveDB_File_Path:=data_folder_path+Archive_db_FileName;

     Log_Folder_Path:= App_path+logFolder;



end; 
  

Kod: Tümünü seç


uses
  Classes, SysUtils,Data.DB,
  //firedac
  FireDAC.Stan.ExprFuncs,
  FireDAC.Phys.SQLiteDef, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.Param,
  FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client, FireDAC.Phys.SQLite;
  //fieredac ends
....

var
  conn: TFDConnection;
  mqry: TFDQuery;
  lnk: TFDPhysSQLiteDriverLink;
  ...

procedure create_DBs;
begin

  conn:=TFDConnection.Create(nil);
  mqry:=TFDQuery.Create(nil);
  lnk:=TFDPhysSQLiteDriverLink.Create(nil);

  with lnk do begin
    Release;
    VendorLib:=Lib_Path;
    DriverID:='SQLite';
  end;


  conn.LoginPrompt:=false;
  conn.ResourceOptions.SilentMode := true;
  conn.Params.Clear;
  conn.Params.Values['DriverID'] := 'SQLite';
  conn.Params.Values['CharacterSet'] := 'UTF8';
  conn.Params.Values['PAGE_SIZE'] := '16384';

  conn.ExecSQL('ATTACH '''+MainDB_File_Path+''' AS MAINDB');
  conn.ExecSQL('ATTACH '''+ChatroomipsDB_File_Path+''' AS CHATROOMIPSDB');
  conn.ExecSQL('ATTACH '''+ArchiveDB_File_Path+''' AS ARCHIVEDB');


  create_Tables;

end;

procedure create_Tables;
var
  chportstr:ansistring;
begin
  //table yoksa oluşturu yazmalıyım!!!!!!
  chportstr:= inttostr(random(60000)+5000);
  try
    //create table settings
      mqry.Close;
      mqry.SQL.clear;
      mqry.SQL.Text:='CREATE TABLE IF NOT EXISTS MAINDB.TBSETTINGS '+
                        '(ID integer NOT NULL PRIMARY KEY AUTOINCREMENT, '+
                        'CONFKEY varchar(50) UNIQUE, '+
                        'CONFVALUE varchar(500)'+
                        ');';
      mqry.ExecSQL;
      //add data
      //Channel Name
      mqry.SQL.Text:='INSERT OR IGNORE INTO MAINDB.TBSETTINGS '+
                '(CONFKEY, CONFVALUE) VALUES '+
                '('+'''channelname'''+
                ',''Astra_Channel'''+
                ');';
      mqry.ExecSQL;
      //Channel topic
      mqry.SQL.Text:='INSERT OR IGNORE INTO MAINDB.TBSETTINGS '+
                '(CONFKEY, CONFVALUE) VALUES '+
                '('+'''channeltopic'''+
                ',''Test_Topic'''+
                ');';
      mqry.ExecSQL;
      //Channel port
      mqry.SQL.Text:='INSERT OR IGNORE INTO MAINDB.TBSETTINGS '+
                '(CONFKEY, CONFVALUE) VALUES '+
                '('+'''channelport'''+
                ','''+chportstr+''''+
                ');';
      mqry.ExecSQL;
      //Channel url
      mqry.SQL.Text:='INSERT OR IGNORE INTO MAINDB.TBSETTINGS '+
                '(CONFKEY, CONFVALUE) VALUES '+
                '('+'''channelurl'''+
                ',''www.google.com'''+
                ');';
      mqry.ExecSQL;
      //Channel url caption
      mqry.SQL.Text:='INSERT OR IGNORE INTO MAINDB.TBSETTINGS '+
                '(CONFKEY, CONFVALUE) VALUES '+
                '('+'''channelurlcaption'''+
                ',''GOOGLE'''+
                ');';
      mqry.ExecSQL;
      //is allowing avatar?
      mqry.SQL.Text:='INSERT OR IGNORE INTO MAINDB.TBSETTINGS '+
                '(CONFKEY, CONFVALUE) VALUES '+
                '('+'''isallowavatar'''+
                ',''1'''+
                ');';
      mqry.ExecSQL;
  except
  end;

  try

      mqry.Close;
      mqry.SQL.clear;

      mqry.SQL.Text:='CREATE TABLE IF NOT EXISTS CHATROOMIPSDB.TBCHATROOMIPS '+
                        '(ID integer NOT NULL PRIMARY KEY AUTOINCREMENT, '+
                        'ipc NUMERIC(10) NOT NULL,'+
                        'portw Integer NOT NULL,'+
                        'ackcount Integer NOT NULL'+
                        ');';
      mqry.ExecSQL;

      mqry.SQL.Text:='CREATE TABLE IF NOT EXISTS CHATROOMIPSDB.TBBACKCHATROOMIPS '+
                        '(ID integer NOT NULL PRIMARY KEY AUTOINCREMENT, '+
                        'ipc NUMERIC(10) NOT NULL,'+
                        'portw Integer NOT NULL,'+
                        'ackcount Integer NOT NULL'+
                        ');';
      mqry.ExecSQL;
      //add data
      add_Backips2DB(mqry);


  except
  end;
end;


procedure add_Backips2DB(qry:TFDQuery);
begin

    qry.SQL.Text:='INSERT OR REPLACE CHATROOMIPSDB.TBBACKCHATROOMIPS '+
    '(ipc,portw,ackcount) VALUES ('+
    '320879980,3000,3);'; qry.ExecSQL;
    qry.SQL.Text:='INSERT OR REPLACE CHATROOMIPSDB.TBBACKCHATROOMIPS '+
    '(ipc,portw,ackcount) VALUES ('+
    '2869011900,21212,10);'; qry.ExecSQL;
    qry.SQL.Text:='INSERT OR REPLACE CHATROOMIPSDB.TBBACKCHATROOMIPS '+
    '(ipc,portw,ackcount) VALUES ('+
    '499297351,44444,3);'; qry.ExecSQL;
end; 
conn.ExecSQL('ATTACH '''+MainDB_File_Path+''' AS MAINDB'); satına geldiği an access violation hatası alıyorum. Nedeni sizce ne olabilir?
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen xozcanx »

Merhaba Access violation hatasının karşılığı henüz oluşturulmamış bir nesneye işlem yapmak istediğiniz zaman verir daha önceleri çok başıma geldiği için bu konuda akıllandım...
sanırım sizin burada kullandığınız değişken MainDB_File_Path henüz oluşturmadınız bu kısmı bir kontrol edin derim...
İyi çalışmalar.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen PROGRAMADOR »

Merhaba,
Access Violation'ın ne olduğunu biliyorum ancak. Kodu kontrol ettiğimde böyle bir hata vermemesi gerekiyor.
Debug ettiğimde stringde de bir sorun yok.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen mrmarman »

Hiç yoktan denemekte fayda var.

Daha sonra olası değişiklik olursa diye, önce USES satırındakilerin bir yedeğini alalım, ardından dinamik olarak kod içerisinde create ettiğin nesneleri FORM üzerine direkt koyalım. Sonra bir defalığına Compile edelim.

USES satırında değişiklik olmuş mu bir kontrol edelim. Bir defasında nedenini ve zamanını hatırlamıyorum, benzer bir şey olmuş, USES'a eklenmemiş bir unit nedeniyle kendi kodumda değil ama sınıf tarafından talep edilen bir nesnenin create edilmemiş olduğuyla karşılaşmıştım.

Oyumu kullanmak durumunda kalsam aşağıda verdiğim iki UNIT'i eklediğinde sorunun çözüleceğini değerlendirirdim. Çünkü kendi projelerime baktım USES satırındakilerden aşağıda verdiğim iki tanesinin kod örneklerindeki USES bloğunda eksik olduğunu gördüm.

Kod: Tümünü seç

FireDAC.Comp.UI, FireDAC.VCLUI.Wait
Resim
Resim ....Resim
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen PROGRAMADOR »

Merhaba,

Data module komponentleri ekleyince durum şöyle oluyor:

Kod: Tümünü seç

unit uDM;

interface

uses
  System.SysUtils, System.Classes,

  FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.Param,
  FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Stan.ExprFuncs,
  FireDAC.Phys.SQLiteDef, FireDAC.Phys.SQLite, Data.DB, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client;

type
  TfrmDM = class(TDataModule)
    conn: TFDConnection;
    qry: TFDQuery;
    lnk: TFDPhysSQLiteDriverLink;
    procedure DataModuleCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmDM: TfrmDM;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

procedure TfrmDM.DataModuleCreate(Sender: TObject);
begin

end;

end.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen mrmarman »

Sonuç.. Access violation devam ediyor mu?
Resim
Resim ....Resim
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen PROGRAMADOR »

Maalesef devam ediyor. Yazmayı unutmuşum kusura bakmayın. Ben en iyisi proje dosyasını ekleyim.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen PROGRAMADOR »

Aşağıdaki link ile projeyi gönderiyorum. Teşekkür ederim ilginize.

http://s3.dosya.tc/server6/pk50y0/ASTRA.zip.html
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen mrmarman »

Yanlış kod göndermişsin, burada soruda verdiğin şekilde bir DataModule yok. Console Application bu.
PROGRAMADOR yazdı:Access Violation'ın ne olduğunu biliyorum ancak. Kodu kontrol ettiğimde böyle bir hata vermemesi gerekiyor.
Debug ettiğimde stringde de bir sorun yok.
Ayrıca bu gönderdiğinde de fahiş hata niteliğinde hataların var. Bunu yok sayıyorum.

Aşağıdaki eklediğim gibi lnk, conn vs. create etmemişsin.

Kod: Tümünü seç

procedure create_DBs;
begin
  if lnk  = Nil then
     lnk := TFDPhysSQLiteDriverLink.Create(nil);
  if conn  = Nil then
     conn := TFDConnection.Create(nil);
     ...
     ...
Resim
Resim ....Resim
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen PROGRAMADOR »

Merhaba Muharrem Bey,

Evet yapmakta olduğum proje konsol, ancak form ile deneyince de olmadı.

" conn:=TFDConnection.Create(nil);
qry:= TFDQuery(nil);
lnk:= TFDPhysSQLiteDriverLink(nil);"

Kodları sadeleştirirken udb uniti içinde create_DBs procedurüne eklemeyi unutmuşum.

procedür şöyle olmalı:

Kod: Tümünü seç



procedure create_DBs;
begin
conn:=TFDConnection.Create(nil);
  qry:= TFDQuery(nil);
  lnk:= TFDPhysSQLiteDriverLink(nil);


  with lnk do begin
    Release;
    VendorLib:=Lib_Path;
    DriverID:='SQLite';
  end;

  with conn do begin
    LoginPrompt:=false;
    ResourceOptions.SilentMode := true;
    Params.Clear;
    Params.Values['DriverID'] := 'SQLite';
    Params.Values['CharacterSet'] := 'UTF8';
    Params.Values['PAGE_SIZE'] := '16384';

    ExecSQL('ATTACH '''+MainDB_File_Path+''' AS MAINDB');
    ExecSQL('ATTACH '''+ChatroomipsDB_File_Path+''' AS CHATROOMIPSDB');
    ExecSQL('ATTACH '''+ArchiveDB_File_Path+''' AS ARCHIVEDB');
  end;


  create_Tables;

end;
Hata almaya devam ediyorum.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen mrmarman »

Bunlar ne demek ?

Kod: Tümünü seç

  qry:= TFDQuery(nil);
  lnk:= TFDPhysSQLiteDriverLink(nil);
(nil) dediğinde create edilirler mi ? Kodları kendin denediğine emin misin ?

- Ayrıca şöyle bir baktım ve bir daha bakmamak üzere kapattım. Thread execute olayında global değişken tanımlayıp bundan bağımsız veritabanı oluşturmak vs. özensiz bir proje. Bence önce form olarak bu projeni yap ondan sonra console application olarak dönüştür. Kendine iyilik etmiş olursun. :idea:
Resim
Resim ....Resim
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Sqlite attach ederken access violation [FIREDAC]

Mesaj gönderen PROGRAMADOR »

Merhaba,

Başka bir projede bu değişkenleri bu şekilde oluşturdum ve proje çalışıyordu. Hatta sıfırdan bir proje oluşturdum. Herhangi bir sorun yoktu. Bu projede ne hata var anlamadım. Form ekleyerek de yapmıştım ama maalesef olmadı Muharrem Bey. İşin içinden çıkamadım. Sanırım sıfırdan yapacağım tekrar projeyi.

nesne.Crate(nil) olacak eklediklerim. Sonradan ekleme yaparken hatalı yazmışım
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Cevapla