将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;
为什么有必要提出其他建议或解释?
答案 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,但可能是务实的,可以节省大量的工作。