2013-05-16 81 views
1

我創建了一個從計算機(計算機名稱,CPU,內存等)收集信息的應用程序,但我很難顯示存儲在SQLite數據庫中的信息,何時我執行一個查詢,當我知道我有一張名爲「hardware」的表時,我得到了「NO SUCH TABLE」消息,我做錯了什麼?SQLite異常引發的消息:沒有這樣的表

在這裏,我用它來執行查詢的代碼:

procedure TMain.executeButtonClick(Sender: TObject); 
var 
    results: TDataSet; 
    query: String; 

begin 
    outputMemo.ClearSelection; 
    query := 'SELECT * FROM hardware;'; 
    try 
    SQLConnection1.Execute(query, nil, results); 
    except 
    on E: Exception do 
     outputMemo.Text := 'Exception raised with message: ' + E.Message; 
    end; 
    ShowSelectResults(results); 
end; 

數據庫文件和表中創建程序創建的每個應用程序運行時

procedure CheckForDatabase; 
var 
    sldb: TSQLiteDatabase; 
    sSQL: string; 

begin 
    slDBPath := ExtractFilePath(paramstr(0)) + 'ComputerName.db'; 
    // ShowMessage(slDBPath); 
    sldb := TSQLiteDatabase.Create(slDBPath); 
    try 
    if sldb.TableExists('hardware') then 
     begin 
     sSQL := 'DROP TABLE hardware'; 
     sldb.ExecSQL(sSQL); 
     end; 

    sSQL := 'CREATE TABLE hardware (id INTEGER PRIMARY KEY, compname TEXT, username TEXT, model TEXT, manufacturer TEXT, domain TEXT, ip TEXT, serialnumber TEXT)'; 
    sldb.ExecSQL(sSQL); 
    sldb.ExecSQL('CREATE INDEX sHardware ON hardware(CompName);'); 
    sldb.BeginTransaction; 
    sSQL := 'INSERT INTO hardware(id, compname, username, model, manufacturer, domain, ip, serialnumber) VALUES (1, "AMD8537", "OMonge", "Gigabyte", "Gigabyte", "Workgroup", "192.168.1.11", "8746652");'; 
    sldb.ExecSQL(sSQL); 
    sldb.Commit; 
    finally 
    sldb.Free; 
    end; 
end; 

這是SQLite數據庫:

enter image description here

任何hel p你可以提供給我,將不勝感激。謝謝。

+1

什麼是'SQLConnection1'以及如何配置針對數據庫。你有指定的數據庫文件的正確路徑嗎? – TLama

+0

SQLConnection1是一個TSQL連接對象,是的,我確實有指定的絕對路徑,連接到數據庫不是問題。 – Cor4Ever

+1

執行「select * from sqlite_master」查詢並查看哪些表真的存在於您的數據庫中。 –

回答

0

您功能標籤德爾福XE2所以我的答案是屬於XE2

從版本的RAD Studio XE3 TSQLMonitor支持SQLite數據庫。 ...

使用XE2您不能使用SQLConnection1: TSQLConnection;與驅動程序Sqlite
將不起作用SQLConnection1.Execute(query, nil, results);

根據使用的代碼,它似乎是simple Delphi wrapper for Sqlite 3行事。

因此,您可以使用剛創建的sldb

slDBPath := ExtractFilePath(paramstr(0)) + 'ComputerName.db'; 
sldb := TSQLiteDatabase.Create(slDBPath); 

procedure CheckForDatabase;

刪除

var 
    sldb: TSQLiteDatabase; 

,並把它放到你的應用程序的接口

private 
    { Private declarations } 
    sltb: TSQLIteTable; 
    sldb: TSQLiteDatabase; 

也刪除sldb.Free;形式finally塊

finally 
    sldb.Free; 
end; 

在你executeButtonClick(...

procedure TMain.executeButtonClick(Sender: TObject); 
var 
    query: String; 

begin 
    outputMemo.ClearSelection; 
    query := 'SELECT * FROM hardware;'; 
    sltb := sldb.GetTable(query); 
    if sltb.Count > 0 then begin 
    //display first row 
    .... 
    if not sltb.IsLastRow the begin 
    sltb.Next; 
    //display next row 
    .... 

how to display field values : look here

+0

非常感謝。 – Cor4Ever