【发布时间】:2011-09-23 20:22:46
【问题描述】:
德尔福 2010
我正在尝试将 TSimpleDataset 用于多种用途。
var
q: tsimpledataset;
row: String;
n: Integer;
begin
q:=tsimpledataset.create(nil);
q.connection:= SQLConnection1 ;
q.dataset.commandtype:=ctQuery ;
q.dataset.commandtext:='select lastid from last_id where tablename=:ARow';
q.Params.Assign(q.Dataset.Params);
ShowMessage(q.dataset.commandtext);
row:='accounts';
q.params[0].asstring:= row;
q.open;
if q.isempty then
raise exception.create('No matching row found in LAST_ID table.');
n:=q.fieldbyname('lastid').asinteger +1;
q.close;
q.dataset.commandtype:=ctQuery ;
q.dataset.commandtext:='update last_id set lastid=22';
q.execute; //exception Here!
end;
我在 q.Execute 行收到以下错误:
缺少数据提供者或数据包
似乎是关闭 TSimpleDataset 和重用它的问题。 如果我释放它并重新创建它并重新评估属性和新属性以将其用于执行,它将起作用。但是,我不想这样做。我希望能够关闭它,然后分配一个新的 CommandText 并重用它。
我已经在互联网上研究并阅读了很多 cmets,因为我没有使用错误的 TSimpleDataset,而是使用其他三个组件(ClientDataSet、DataSetProvider 和 SQLDataSet)。你会认为到 2010 年 Embarcadero 会解决 TSimpleDataset 的任何问题。
除了必须切换到 TSimpleDataset 以外的其他东西之外,还有其他解决方法吗?
谢谢!
【问题讨论】:
-
我对 TSimpleDataSet 没有太多经验,但总的来说我根本不会重用数据集。只需将它们放在数据模块上,尽可能多地使用 IDE 配置它们,不要编写所有代码来重用单个组件,而您可以拥有两个组件。它们不会消耗太多内存(几乎没有),所以也不要为此烦恼。
-
对不起,但这不是一个选择。我需要在运行时创建和使用它们,并将它们用于多种目的。
-
TSimpleDataSet 不是一个严肃的组件,您很快就会超过它。我猜这就是 Embarcadero 可能会忽略它的原因。如果想简化TClientDataSet、TDataSetProvider、TSQLDataSet这3个组件的删除过程看component templates
-
如果您使用“last_id”表来生成唯一标识符,您正在寻找麻烦。如果您有多个用户访问数据库,则该方法不起作用,除非您完全序列化对表(或至少每一行)的访问。如果访问是并发的,您可以轻松获取副本。如果您的数据库支持序列、生成器或自动生成的字段,最好使用它们,它们可以确保唯一性。
-
真的,因为我们的应用程序被两个大公司使用,每个公司都有数百名用户。 LastId 方法效果很好!
标签: delphi delphi-2010