0

我正在尝试使用即时对象。我有两个简单的类 tband 和 tcountry 都被定义为存储。tband 有一个名为 tcountry 的属性,引用 tcountry 类/表。(国家是查找表)。创建新乐队时,我希望用户能够从列表/组合中选择表单中的国家/地区,然后保存乐队对象。我试过类似的东西:

Band.Create(nil);
Country.Create(nil);
Country := CountrySelector.CurrentObject as TCountry; // here I get an exception
Band.Country := Country;
Band.Store;

CountryConnector 是一个 TInstantConnector。它有一个查询“select * from TCountry”并在 DbComboBox 中显示值。

4

2 回答 2

1

您的代码应该类似于以下内容。请注意,假设连接器已连接到适当的代理,数据库连接处于活动状态并且已创建数据库模式(您可以很容易地从模型资源管理器中执行后面的步骤)。

var
  Band : TBand;
begin
  // Query the database for all TCountry instances or descendants
  CountrySelector.Close;
  CountrySelector.Command.Text := 'SELECT * FROM ANY TCountry';
  CountrySelector.Open;

  if ContactSelector.ObjectCount > 0 then
    begin
      Band := TBand.Create(Connector);

      try
        // Take currently selected Country and assign to Band's Country property
        // Reference counting is handled automatically
        Band.Country := CountrySelector.CurrentObject as TCountry;
        Band.Store;
      finally
        Band.Free;  // Free reference to Band so we do not leak an object
      end;
    end;
end;

我还应该提到,我不经常使用 Selector,因为它不能满足我的典型应用程序需求。我的用户经常使用 DevExpress Quantum 网格从 Firebird 中检索 20k+ 条记录,并期望响应时间始终低于 2 秒。为了满足这个要求,使用 IBExpert(一个古怪但非常出色的工具)进行了一些非常仔细的设计和调整,因为我的查询经常跨越许多表并且具有复杂的过滤要求。

关于 IO,我可以说的是,它使数据建模变得容易,因为使用模型资源管理器将设计简化为点击过程。IO 也是一个很好的数据绑定框架,因为它允许您将甚至复杂的对象图“公开”为数据集并将属性绑定到可视控件。我喜欢的另一部分是我不再需要手动创建插入或更新查询以及设置列值以添加或修改持久对象。IO 只需很少的编码就可以在幕后为您完成这些以及更多工作。

大卫

于 2009-06-05T17:46:51.643 回答
-1

CountrySelector 是否具有除 nil 以外的值?

于 2009-06-05T11:27:22.157 回答