![](/img/trans.png)
[英]How to apply a cached update FDQuery using Delphi FireDAC with an UNIQUE constraint on the database
[英]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.