簡體   English   中英

使用 Delphi 和 FireDAC 從數據庫中讀取 DateTime

[英]Reading DateTime from Database using Delphi and FireDAC

我無法使用 Delphi 10.3 和 FireDAC 從 SQLite 數據庫中讀取日期時間。 作為最簡單的示例,我使用 sqlite 創建了一個示例數據庫,如下所示:

.open Test.db
CREATE TABLE "TABLE1" ("Name"VarChar(16), "Time" datetime); 
INSERT INTO Table1 (Name,Time) VALUES("Fred",time('now'));

然后

select * from Table1

正如預期的那樣,給了 Fred|16:52:57。

如果我生成一個 Delphi 程序,其中 FDConnection1 和 FDQuery1 鏈接到數據源和 DBgrid,它將讀取“Fred”但不是時間。 FDquery1 asstring 返回的值是 '' 而 asfloat 是 0。如果我嘗試使用 FireDAC 資源管理器工具查看數據庫,它也無法讀取時間值,但我注意到它確實從一些示例數據庫中讀取了日期時間,所以很清楚能行得通。

誰能告訴我我錯過了什么。 謝謝

嘗試將 SQL 語句構造為 Delphi 代碼中的字符串可能會有點錯誤。 但是,您應該會發現以下代碼執行正確

procedure TForm2.btnInsertRowClick(Sender: TObject);
const
  sInsertRow = ' INSERT INTO Table1 (Name,time) VALUES(''Fred'',datetime(''now''))';
begin
  FDConnection1.ExecSql(sInsertRow);
end;

順便說一句,通常最好使用參數化的 INSERT 語句而不是像上面這樣的文字語句,但在這里它並不實用,因為您插入的是 Sqlite 而不是 Delphi now返回的now值 ZC1C425268E68379F1CAB1

**更新:** 下面的代碼來自一個最小的項目,它創建您的示例表,在其中插入一行,然后將其呈現在 db-aware 控件(DBGrid、DBEdit)中進行編輯。 這一切都完全按照它應該的方式工作。 特別是,通過這些控件對行數據所做的任何更改都會在下次運行應用程序時保留。 請注意,創建表的 SQL 在 Name 列/字段上指定了一個主鍵:這是 FDQuery1 生成將更改保存回磁盤表所需的 UPDATE 語句所必需的。

btnSelectClick處理程序中的代碼顯示了如何設置time字段的 DisplayFormat 和 EditMask 屬性,以便它只顯示存儲的 DateTime 數據的時間部分。

type
  TForm2 = class(TForm)
    FDConnection1: TFDConnection;
    FDQuery1: TFDQuery;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    DataSource1: TDataSource;
    DBEdit1: TDBEdit;
    btnCreateTable: TButton;
    btnInsertRow: TButton;
    btnSelect: TButton;
  [...]
  public

[...]

const
  sCreateTable = 'CREATE TABLE ''TABLE1'' (''Name'' VarChar(16) primary key, ''Time'' datetime)';
  sInsertRow = ' INSERT INTO Table1 (Name,time) VALUES(''Fred'',datetime(''now''))';
  sSelect = 'select * from table1';

procedure TForm2.btnCreateTableClick(Sender: TObject);
begin
  FDConnection1.Connected := True;
  FDConnection1.ExecSql(sCreateTable);
end;

procedure TForm2.btnInsertRowClick(Sender: TObject);
const
begin
  FDConnection1.ExecSql(sInsertRow);
end;

procedure TForm2.btnSelectClick(Sender: TObject);
var
  AField : TDateTimeField;
begin
  FDQuery1.SQL.Text := sSelect;
  FDQuery1.Open;

  //   The following shows how to  control how the time field is formatted for display
  //   in gui controls using the field's DisplayFormat
  //   and how to set up its EditMask for editing
  AField := FDQuery1.FieldByName('time') as TDateTimeField;
  AField.DisplayFormat := 'hh:nn:ss';
  AField.EditMask := '!90:00:00;1;_';
end;
end.

.DFM 文件

object Form2: TForm2
[...]
  object FDConnection1: TFDConnection
    Params.Strings = (
      'Database=D:\Delphi\Code\FireDAC\db1.sqlite'
      'DriverID=SQLite')
    LoginPrompt = False
  end
  object FDQuery1: TFDQuery
    Connection = FDConnection1
  end
  object DataSource1: TDataSource
    DataSet = FDQuery1
  end
  object DBGrid1: TDBGrid
    DataSource = DataSource1
  end
  object DBNavigator1: TDBNavigator
    DataSource = DataSource1
  end
  object DBEdit1: TDBEdit
    DataField = 'Time'
    DataSource = DataSource1
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM