在数据存储中更改或删除了此行的键值。现在删除了本地行

时间:2015-05-03 20:53:53

标签: delphi ado

将150万行D7,BDE,Paradox迁移到XE2,ADO,MS-SQL。

我们有一个TDBLookupComboBox工作正常。我们为用户提供省略号按钮,以便他们可以在组合框可见时添加或删除组合框的ListSource表中的记录。

如果用户点击省略号,我们让他们编辑表格,然后我们刷新组合框数据源,如下所示:

EditTable.ShowModal; // user edits ListSource.Dataset table
Form1.DBComboBox1.ListSource.DataSet.Refresh

这在Paradox世界中运作良好。

在SQL / ADO世界中,如果用户从ListSource中删除记录,我们会在上面的Refresh语句中获得消息:

Key value for this row was changed or deleted at the data store. 
The local row is now deleted.

即使用户删除的记录不是组合框中当前选定的项目,也会发生这种情况。

我们不明白为什么现在正在发生这种情况,而不是在Paradox版本中。

我们的解决方案是(在用户编辑之后)关闭并打开ListSource数据集,如下所示,但这很笨拙(我们必须在近100个地方复制我们做这种事情。)

这是我们目前的修复方法:

var
  KeyBeforeUserEdit: Integer;

KeyBeforeUserEdit:= Form1.DBComboBox.KeyValue;
EditTable.ShowModal; // user edits ListSource.Dataset table
Form1.DBComboBox1.ListSource.DataSet.Close;
Form1.DBComboBox1.ListSource.DataSet.Open;
if Form1.DBComboBox1.ListSource.DataSet.Locate('UniqueKey', KeyBeforeUserEdit, []) then 
  From1.DBComboBox1.KeyValue := KeyBeforeUserEdit; 

为什么有必要提出其他建议或解释?

1 个答案:

答案 0 :(得分:0)

我无法确切知道发生了什么,但您可以通过以下方式简化迁移(尽管不是很好的做法)。

ShowModal是一个虚函数,因此您可以在EditTable所属的类(TEditTable?)中覆盖它,前提是您拥有该源。在单元内,将Form1单元添加到实施部分 中的uses子句 (如果它还没有),并按如下方式添加覆盖

function TEditTable.ShowModal : integer;
var
  KeyBeforeUserEdit: Integer;
begin
  KeyBeforeUserEdit:= Form1.DBComboBox.KeyValue;
  Result := inherited ShowModal; // user edits ListSource.Dataset table
  Form1.DBComboBox1.ListSource.DataSet.Close;
  Form1.DBComboBox1.ListSource.DataSet.Open;
  if Form1.DBComboBox1.ListSource.DataSet.Locate('UniqueKey', KeyBeforeUserEdit, []) then 
    From1.DBComboBox1.KeyValue := KeyBeforeUserEdit; 
end;

这有点像kludge,但可能是务实的,可以节省大量的工作。