Firebird时间戳字段的Delphi DBGrid日期格式
我将Firebird数据库的内容显示到TDBgrid中。数据库有一个“TIMESTAMP”数据类型字段,我希望以日期/时间格式显示该字段: “YYYY/MM/DD HH:MM:ss”。(现在显示为“YYMMDD HHmmss”) 如何做到这一点 我试过这个:Firebird时间戳字段的Delphi DBGrid日期格式,delphi,firebird,datetime-format,dbgrid,Delphi,Firebird,Datetime Format,Dbgrid,我将Firebird数据库的内容显示到TDBgrid中。数据库有一个“TIMESTAMP”数据类型字段,我希望以日期/时间格式显示该字段: “YYYY/MM/DD HH:MM:ss”。(现在显示为“YYMMDD HHmmss”) 如何做到这一点 我试过这个: procedure TDataModule1.IBQuery1AfterOpen(DataSet: TDataSet); begin TDateTimeField(IBQuery1.FieldByName('timestamp_')).
procedure TDataModule1.IBQuery1AfterOpen(DataSet: TDataSet);
begin
TDateTimeField(IBQuery1.FieldByName('timestamp_')).DisplayFormat := 'YYYY/MM/DD HH:mm:ss';
end;
但这会在程序的其他部分造成一些副作用,因此它不是一个替代方案。例如,在“IBQuery1.Open”语句中,我在清除数据库的方法中得到“…timestamp\uuunotfound…”调试器消息
function TfrmLogger.db_events_clearall: integer;
begin
result := -1;
try
with datamodule1.IBQuery1 do begin
Close;
With SQL do begin
Clear;
Add('DELETE FROM MEVENTS')
end;
if not Prepared then
Prepare;
Open; //Exception here
Close;
Result := 1;
end;
except
on E: Exception do begin
ShowMessage(E.ClassName);
ShowMessage(E.Message);
Datamodule1.IBQuery1.close;
end;
end;
end;
在尝试打开查询以写入数据库时,我会收到相同的异常消息
*编辑>>
我对数据库进行了如下修改:
function TfrmLogger.db_events_clearall: integer;
var
IBQuery: TIBQuery;
IBTransaction: TIBTransaction;
DataSource: TDataSource;
begin
result := -1;
//Implicit local db objects creation
IBQuery := TIBQuery.Create(nil);
IBQuery.Database := datamodule1.IBdbCLEVENTS;
DataSource := TDataSource.Create(nil);
DataSource.DataSet := IBQuery;
IBTransaction := TIBTransaction.Create(nil);
IBTransaction.DefaultDatabase := datamodule1.IBdbCLEVENTS;
IBQuery.Transaction := IBTransaction;
try
with IBQuery do begin
SQL.Text := DELETE FROM MSTEVENTS;
ExecSQL;
IBTransaction.Commit;
result := 1;
end;
except
on E : Exception do
begin
ShowMessage(E.ClassName + ^M^J + E.Message);
IBTransaction.Rollback;
end;
end;
freeandnil(IBQuery);
freeandnil(DataSource);
freeandnil(IBTransaction);
end;
在清除数据库之后,我仍然可以将记录加载到dbgrid中,似乎数据库还没有更新。程序重新启动后,我可以看到所有记录都被删除。整个
函数TfrmLogger.db\u events\u clearall
似乎非常可疑
SQL\u DELETE\u ROW
,但答案似乎不是返回“resultset”的SELECT请求。因此,它很可能不应该由“.Open”运行,而是由“.Execute”或“.ExecSQL”或类似的东西运行李>
UPD。添加了SQL_DELETE_ROW='DELETE FROM MEVENTS'代码>确认我先前和未来的期望。几乎。常量名称表示要删除一行,查询文本表示删除所有行,我想知道这是否正确
此外,由于没有“resultset”-因此在.Exec..
之后没有什么要关闭的.Close
-但是您可以检查.RowsAffected
是否在DBX中有这样的属性,以查看实际计划删除的行数
此外,否,此函数不删除行,它只计划删除这些行。在处理SQL时,您必须投入时间和精力学习事务,否则很快就会被副作用淹没
特别是,这里您必须提交删除事务。为此,您要么显式创建、启动并绑定到IBQuery
事务,要么找出IBQuery1
和隐式使用的事务代码>它。和。在异常时回滚
是的,很无聊,诸如此类。您可能希望IBX足够聪明,能够偶尔为您做一次提交。但如果不按事务隔离数据更改,您将不可避免地受到来自各种“竞争条件”的难以再现的“副作用”
范例
FieldDefs.Clear; // frankly, I do not quite recall if IBX has those, but probably it does.
Fields.Clear; // forget the customizations to the fields, and the fields as well
Open; // Make no Exception here
Close;
Halt; // << insert this line
Result := 1;
FieldDefs.Clear;//坦白地说,我不太记得IBX是否有这些,但可能有。
字段。清除;//忘记对字段和字段的自定义
打开;//这里也不例外
接近;
暂停;//您的意思是什么副作用?您可以创建一个计算字段,其值使用timestamp_uu字段并使用自己的值format@Victoria我对我的评论进行了编辑。听起来像是您为SQL命令使用的查询对象定义了一个持久字段,它不返回resultset。这将不起作用(因为该对象需要该字段)。不要使用持久字段,或者使用单独的查询对象。顺便说一句,不要为不返回结果集的命令打开查询对象。副作用是由于您将查询对象用于两个截然不同的目的。要执行deletesql命令,您可以很好地使用一个本地查询对象,然后只处理它。不要将与UI绑定的数据集与只需要执行的查询混合使用。而且。。。您不应打开删除查询。。。执行它。谢谢你的详细回答!你能检查一下我编辑的问题吗?还有一件事我不明白。@grinner 1:你不使用DataSource:TDataSource代码>并且不需要它。2:你的内存管理是脆弱的,你可以泄漏那些创建的没有被破坏的对象,中间有任何异常。更好地使用IBQuery:TIBQuery:=nil;IBTransaction:=nil。。。。。尝试IBQuery:=..创建(…);IBTransaction:=…创建。。。。最后是IBQuery.Free;IBTransaction.Free end
模式。然而,使用上述IBX FB Utils可以让您从内存管理的麻烦中解脱出来。那么“清楚地看到以前数据库的效果”这一模糊且难以理解的概念呢-阅读本文:-也许我猜到了你的意思,你也有同样的问题。你可以浏览一下在上创建对象的内容-但是我个人只使用IBX FB Utils来创建这样的OneLiner:-D