首页 文章

ADO可更新查询 - 当其中一个连接表没有记录时出错

提问于
浏览
2

我使用ADO的“可更新查询”功能,能够从多个表和条件中选择数据集,并将其显示在网格或其他UI中供用户浏览和编辑 .

但是,我很惊讶我之前没有遇到这个问题,当其中一个连接表没有(主)键的记录,并且用户试图编辑该表中的字段时,ADO给出了帖子上有名的“Row not not located ..”错误 .

据我所知,这个错误,ADO驱动程序试图找到记录以更新其字段 - 当然,在这种情况下,没有记录要查找 . 在这些情况下我期待的是ADO驱动程序将为主表发出等效的UPDATE查询,但是对子表发出INSERT查询 .

有没有其他人遇到这个问题,发现了一个workround?

使用的ADO驱动程序是连接到Access(mdb)数据库的Jet 4.0 OLE DB提供程序 .

我已确保查询数据集中的两个表的主键字段都可供驱动程序使用 .

这是我使用的SQL的基本版本:

SELECT 
    Table1.CustomerNo, Table1.Field1, Table1.Fieldn,  
    Table2.CustomerNo, Table2.Field1, Table2.Fieldn  
FROM 
    Table1 
LEFT JOIN Table2 
    ON Table1.CustomerNo = Table2.CustomerNo  
WHERE 
    Table1.CustomerNo = Newcode;

作为一个实验,我在MS Access 2007中尝试了同样的事情,这很有用,所以在ADO中可能有一个解决方案(但是Access可能使用了不同的驱动程序) .

2 回答

  • 0

    最后,我选择了“黑客”解决方案 . 只有客户的reocrds存在于两个表中时,才能在2个表上进行可更新的ADO查询 . 所以,我必须检查一下,如果table2中缺少相关记录,则在调用主查询之前必须先插入它 . 这是代码:

    `//Query customer account - open query from Table1 and Table2 tables TwoTableQuery.Close; // //SELECT Table2.CustomerNo // FROM Table2 //WHERE (Table2.CustomerNo = CustomerCode); Table2Query.Close; Table2Query.Parameters[0].Value := CustomerCode; Table2Query.Open; / //does the Table2 record exist for this customer? if Table2Query.RecordCount = 0 then begin //no, so create a new record Table2Query.Insert; Table2Query.FieldByName('CustomerNo').AsString := CustomerCode; Table2Query.Post; Table2Query.Close; end; //okay, now okay to open main query TwoTableQuery.Parameters[0].Value := CustomerCode; TwoTableQuery.Open;`

    它效率不高,并且还创建了可能不需要的记录(在表2中) . 但它似乎是唯一的解决方案 .

  • 0

    首先尝试locate函数以确保两个字段都在那里 . 如果找到则使参数等于字段,并且布尔值为true,否则更新或插入具有另一个的值的新字段 . 之后你知道条目存在,你可以加入字段...或者你可以使用try除了最后尝试执行语句,除非找不到该字段,然后最终创建新条目 . 将所有这些放在重复中直到并确保until语句在两个表上使用locate来查看它是否已找到 .

相关问题