DBExpress + FireBird 的 TimeStamp 字段的处理

11 views
Skip to first unread message

电脑玩家

unread,
Oct 8, 2009, 4:42:43 AM10/8/09
to 挨踢技术
用 DBExpress 去访问 FireBird 的 TimeStamp 类型的字段,获得的字段不是 TDateTimeField 而是特殊
的 TSQLTimeStampField 类。它的值是 TSQLTimeStamp 类型而不是 TDateTime 类型。

这时候如果用 ClientDataSet 去访问它,在设计期创建的固定字段也是 TSQLTimeStampField 类。但可以用
ClientDataSet.Field[2].AsDateTime 去访问它,因为 TSQLTimeStampField 的
AsDateTime 属性背后的方法帮它自动做了转换,内部已经是 TSQLTimeStamp 类别了。

但是,如果用 TSQLQuery 这个控件直接去访问一个带 TimeStamp 字段的表,比如:

procedure TForm1.Button4Click(Sender: TObject);
begin
with SQLQuery1 do
begin
SQL.Text := 'insert into ATIME (ID, ATIME) values (:ID, :ATIME)';
Params[0].Value := 3;
Params[1].AsDateTime := Now; <----- 这里如果用 TDateTime 给这个 TimeStamp
字段参数赋值,则执行 ExecSQL 会出错。
ExecSQL;
end;
end;

=======================
因此,这里正确的写法应该是:

procedure TForm1.Button4Click(Sender: TObject);
begin
with SQLQuery1 do
begin
SQL.Text := 'insert into ATIME (ID, ATIME) values (:ID, :ATIME)';
Params[0].Value := 3;
Params[1].AsSQLTimeStamp := DateTimeToSQLTimeStamp(Now); 《---- 这里必
须用 AsSQLTimeStamp 给参数赋值。
ExecSQL;
end;
end;

Reply all
Reply to author
Forward
0 new messages