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

时间:2011-05-18 12:51:00

标签: sql delphi ado jet

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

然而,我很惊讶我之前没有遇到这个问题,当其中一个连接表没有(主)键的记录,并且用户尝试编辑该表中的字段时,ADO在帖子上给出了着名的“行无法定位......”错误。

据我所知,这个错误,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 :(得分:0)

最后,我选择了“黑客”解决方案。只有2个表的可更新ADO查询才有效 客户的reocrds存在于两个表中。所以,我必须检查一下,如果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;                                 

//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中)。但它似乎是唯一的解决方案。

答案 1 :(得分:0)

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