如何强制更新数据库网格?

时间:2012-11-30 03:23:48

标签: database delphi dbgrid

为了自己的利益,我可能太聪明了: - /

我有一张桌子可以容纳一些压力测量值。它们始终存储为PSI,但用户可以选择一个无线电组按钮在PSI和BAR之间切换。

为了保持代码清洁并将工作推送到数据库,我为configuration项创建了第二个表,只有一行。当用户切换无线电组时,一列psi_bar_conversion将取值1或14.5。

在Delphi中,我的查询与我的数据库网格相关联,使用

之类的语句进行设置
SELECT ROUND(inlet_waterPressure_psi  /  
                  (SELECT psi_bar_conversion FROM configuration), 
             (SELECT float_precision FROM configuration))
       AS inlet_waterPressure, 
FROM measurements

所有这些都很好(也许我解释得太多了。)

我要做的就是在函数中添加一些代码,处理单选按钮切换以强制我的数据库网格刷新其内容,因为我刚刚更新了configuration.psi_bar_conversion的值(但没有直接字段我的查询,也不是我的数据源。)

我应该调用数据库网格的Refresh()Invalidate()SomeOtherFunction() - 查询,数据流吗?这让我感到困惑。

提前感谢您的帮助......

3 个答案:

答案 0 :(得分:3)

您需要关闭然后重新打开查询才能使psi_bar_conversionfloat_precision中的更改生效。两个子选择(对于来自configuration的值)仅在执行查询时发生。

答案 1 :(得分:3)

TDBGrid表示取决于连接的TDataSet(通过TDataSource)。

要更新网格值,您必须使用方法TDataSet刷新TDataSet.Refresh中的数据。

要更新特殊网格,您可以刷新连接的DataSet,如下所示:

DBGrid1.DataSource.DataSet.Refresh;

但是一些TDataSet后代不会刷新,这是由Embarcadero记录的

TDataSet.Refresh

这取决于您使用的组件(我使用UniDAC进行了测试,并且工作正常)

procedure TForm1.RadioGroup1Click( Sender : TObject );
var
  LRate : Extended;
begin
  case RadioGroup1.ItemIndex of
    0 :
      LRate := 1;
    1 :
      LRate := 14.5;
  end;
  UniConnection1.ExecSQL( 'UPDATE configuration SET psi_bar_conversion = :conversion', [LRate] );
  DBGrid1.DataSource.DataSet.Refresh;
end;

如果你的组件没有重新获取调用Refresh的数据,那么你必须关闭并重新打开(也由文档说明)

DBGrid1.DataSource.DataSet.Close;
DBGrid1.DataSource.DataSet.Open;

恕我直言这样的组件没有完全实现,所以这只是一个解决方法,在调用一些可能不需要的事件(BeforeClose,AfterClose,BeforeOpen,AfterOpen)时会产生副作用,这些事件不会因使用Refresh而被触发。

但它完全与SubSelects无关。

答案 2 :(得分:0)

我很蠢,我无法帮助你解决德尔福方面的问题。

在数据库方面......

是否有任何理由不能将bar和psi值都存储在数据库中?

您可以在保存时进行转换,然后只需在要查看数据时对数据进行简单选择。这可以通过执行保存的软件或数据库中的触发器来完成。

我建议这样做的原因是psi-bar转换率不会改变,因此每次查看不需要的数据时都会进行大量处理......