2010-02-20 55 views
1

这是我的第三个问题在这里,所以更优异的响应^^“键冲突”自动增量场

我有在浏览没有问题,编辑数据,但插入...

这里是我的疑问: 在金融/股票软件我有一个表格,以创建一个新的秩序,
当然,我需要在t_orders
插入新行和t_orderitems表中插入项目与订单ID场挂一排t_orders

CREATE TABLE `t_orders` (
    `orderId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `clientId` INT(10) UNSIGNED NOT NULL, 
    ...) 

CREATE TABLE `t_orderitems` (
    `orderitemId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `orderId` INT(10) UNSIGNED NOT NULL, 
    ...) 

--> INDEXES AND FOREIGN KEYS OMITTED <-- 

如何添加itemorders到网格,终于在 “FinalizeOrder” 按钮,单击

  • t_orders创建订单
  • t_orderitems
  • 插入项目链接到为了

使用ADO进行连接。

我不确定是否可以这样做,在这种情况下,我应该怎么做?

编辑:我试着使用嵌套ClientDataSets和它的部分工作,但我还是不知道怎么去插入顺序ID

EDIT2:
现在我有一个问题,我可以将多个项目添加到ClientDataSet中。
由于OrderItemId对于所有项目都是空的(我只能在数据库插入时获得该值),当我尝试添加第二个项目时,它会给我提供关键违规,任何想法?

如果我设置的UpdateMode比upWhereKeyOnly不同的东西,并设置pfInKey为False,它的工作原理,但我不认为这是一个选项

任何想法?

在此先感谢!亚瑟。

+0

你用什么数据库? MySQL的? – RRUZ 2010-02-21 01:05:17

+0

是的,但我会在最终版本上更改为PosgreSql – arthurprs 2010-02-21 01:09:15

+1

检查mysql函数LAST_INSERT_ID(),看到这个链接http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html – RRUZ 2010-02-21 01:53:57

回答

1

我假设你有一个ADO数据集从数据库获取数据并链接到网格?你需要做的是一个中间层。

创建一个TClientDataset并将其连接到您的ADO数据集,然后将该网格连接到客户端数据集。当有新的订单来到时,调用客户端数据集的Append并将新订单的数据插入到其中。这将使其显示在网格上。如果要将更改保存到数据库,请在客户端数据集上调用.Update。它将使用它链接的ADO数据集将更新发送到数据库。查看TClientDataset上的文档以获取有关如何完全设置的说明;它是近期版本中实际记录得非常好的少数几件事之一。

要更新多个表,请查看关于主/关系关系的文档,并使用两个这样的数据集,它们彼此链接。

+0

感谢您的回复。我想在这里做什么建议?我如何设置项目orderId的? – arthurprs 2010-02-20 18:37:09

+0

我不确定。我对AUTO_INCREMENT字段没有任何经验。 – 2010-02-20 18:43:48

0

感谢RRUZ,这不正是我想要的(我仍然不得不手动设置所有的OrderItems的OrderId的插入之前手动),但会做

with DataModule1.ADOQuery1 do 
begin 
    SQL.Text := 'SELECT LAST_INSERT_ID()'; 
    Open(); 
    First(); 
    LastInsertId := Fields[0].Value; 
    Close(); 
end; 
1

如果您之间的主从复合结构关系应用程序中的两个数据集ADO可以自动处理它。这意味着,一旦将新记录插入到主数据集(订单)中,即可在细节数据集(order_items)中插入新记录,而无需指定order_id,因为master数据集中当前记录的order_id将自动检索,并且插入到细节数据集的新插入记录中。

要在数据集之间建立主/细节关系,如果您要将AdoTable用于详细数据集,可以将其MasterSource设置为连接到主数据集的数据源,并使用MasterFields属性定义两个数据集之间的关联关系。 如果您正在使用AdoDataset或AdoQuery,则应该将详细数据集中的DataSource属性设置为连接到您的主数据集的数据源。然后,必须使用与主数据集中的键字段名称相同的SQL参数在您的详细数据集的SQL语句中添加WHERE子句。在你的情况下,它会是这样的:

SELECT * FROM t_orderitems WHERE OrderID = :OrderID 

现在,您可以设置您的详细信息数据的MasterFields特性的关系。

由于您的订单可以有多个项目,因此您可以在详细数据集(order_items)中将LockType设置为ltBatchOptimistic,这样一旦插入新项目,它就不会立即发送到数据库。使用ltBatchOptimistic表示您的更改将临时保存在客户端内存中,直到您调用UpdateBatch方法。 UpdateBatch将所有更改发送到数据库。

如果您要取消订单,您必须调用CancelBatch方法以取消对详细数据集所做的修改,并手动删除主数据集中创建的订单记录。

+0

我这样做了,但是当我不能在** Order **中添加多个** Items **时,我得到“key violation”,因为2等于OrderItemId – arthurprs 2010-02-21 16:54:25

+0

如果该字段在您的表中定义为AutoInc,那么您的数据库负责为OrderItemID字段提供一个值,而不是你。您不应该将该字段的任何值传递给数据库。顺便说一句,你如何插入物品?你使用TDateset方法(例如Insert,Append),还是你手动编写插入SQL语句? – vcldeveloper 2010-02-21 17:29:38

+0

我使用append将其添加到ClientDataSet中,并且将字段OrderItemId留空(这是因为ClientDataSet不允许2等于ClientOrderId而导致的问题) – arthurprs 2010-02-21 18:32:14