我使用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可能使用了不同的驱动程序)。
答案 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来查看它是否已找到。