Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TADOQuery是否有包含客户端索引的扩展_Delphi_Indexing_Ado_Delphi 2006 - Fatal编程技术网

Delphi TADOQuery是否有包含客户端索引的扩展

Delphi TADOQuery是否有包含客户端索引的扩展,delphi,indexing,ado,delphi-2006,Delphi,Indexing,Ado,Delphi 2006,快速提问(希望如此) 我有一个大数据集(>100000条记录),我想用它作为查找来确定多个键是否存在。这样做的目的是在尝试将FK冲突提交到数据库之前查找它们,以尝试并避免由此产生的EDatabaseError打乱我的事务 我一直在用FindKey方法使用TClientDataSet/TDatasetProvider,因为这样可以设置客户端索引,而且速度更快(2秒扫描每个键,而不是10秒扫描ADO)。然而,移动到大型数据集时,CD的数量开始比本地索引节省的时间要长得多 我发现我有几个备选方案:

快速提问(希望如此)

我有一个大数据集(>100000条记录),我想用它作为查找来确定多个键是否存在。这样做的目的是在尝试将FK冲突提交到数据库之前查找它们,以尝试并避免由此产生的EDatabaseError打乱我的事务

我一直在用FindKey方法使用TClientDataSet/TDatasetProvider,因为这样可以设置客户端索引,而且速度更快(2秒扫描每个键,而不是10秒扫描ADO)。然而,移动到大型数据集时,CD的数量开始比本地索引节省的时间要长得多

我发现我有几个备选方案:

  • 使用TADOQuery.locate方法的客户端游标
  • 每次检查的ADO SELECT语句(无客户端缓存)
  • ADO寻道方法
  • 扩展TADOQuery以模仿FindKey

Locate方法似乎最简单,不会用SELECT/SEEK方法向服务器发送垃圾邮件。我喜欢扩展TADOQuery的想法,但想知道是否有人知道任何现成的解决方案,而不是创建我自己的?

我会在数据库服务器中创建一个临时表。将所有100000条记录插入此临时表。一次批量插入3000条记录,以尽量减少到服务器的往返。然后在此临时表上运行select语句,检查是否存在外键冲突等。如果一切正常,请将SQL从临时表插入主表。

在网络环境中,数据库是唯一可靠的源。因此,我建议不要规避该事务。我并没有试图规避该事务,但如果由于FK冲突而导致EDatabaseError,我将不得不回滚一个(可能较大的)事务。如果我自己发现FK违规,那么我可以跳过该记录并记录它,允许导入其余记录。是否存在对数据库的多用户(直接)访问?理论上是的,实际上不是-单一访问应用程序有一个锁,阻止其他人在此过程中运行它。不漂亮,但这是我继承的。如果你在D2006上,看看。它修复了TClientDataset伸缩的性能问题,这似乎是整个问题的根源。有趣的建议是,对于我现在要做的事情(经典的大泥球问题),需要进行太多的重构,但请记住,如果我在这部分代码中再花大量时间的话。