Firebird时间戳字段的Delphi DBGrid日期格式

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_')).

我将Firebird数据库的内容显示到TDBgrid中。数据库有一个“TIMESTAMP”数据类型字段,我希望以日期/时间格式显示该字段: “YYYY/MM/DD HH:MM:ss”。(现在显示为“YYMMDD HHmmss”)

如何做到这一点

我试过这个:

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