1

コンピューターから情報 (コンピューター名、CPU、メモリなど) を収集するアプリケーションを作成しましたが、SQLite データベースに格納されている情報を表示するのに非常に苦労しています。クエリを実行すると、「NO SUCH TABLE」が表示されます。 「ハードウェア」という名前のテーブルがあることがわかっているのに、何が間違っているのですか?

クエリを実行するために使用するコードは次のとおりです。

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 データベースです。

ここに画像の説明を入力

あなたが私に提供できるどんな助けも大歓迎です。ありがとうございました。

4

1 に答える 1

0

あなたはDelphi-XE2にタグを付けたので、私の答えはXE2に属します

バージョン RAD Studio XE3 以降、TSQLMonitor は SQLite データベースをサポートします。...

SQLConnection1: TSQLConnection;XE2ではDriverでは使えません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
    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
     ....

フィールド値を表示する方法:こちらをご覧ください

于 2013-05-16T23:39:15.583 に答える