DBGRID在ADO+SQL环境中的Lookup问题(转)

    在进销存系统中,经常会将商品信息放在一个数据表中,把销售明细(采购明细)放在另一个表中,两个表通过商品的编号相联,于是经常会遇到要在销售明细(采购明细表中显示商品名称、规格等信息,就在DBGrid中采用Lookup的方法显示。但是当新插入数据时就提示“发生未知错误”的信息。解决办法:

    例:一个ADOQuery1,包含了“商品编号”,“数量”等字段,然后再新建立“商品名称”,“规格”等几个临时Lookup字段,以“商品编号”为索引字段,从另一个ADOQuery2中取值。之后,用一个DBGrid连接ADOQuery1。

    程序运行时,在DBGrid中修改,删除数据都没有问题。但添加记录时出现“发生未知错误”的信息。

    检查后发现问题出在Lookup字段,同样的设置在BDE+SQL 7.0和ADO+Access   2000中可以通过。问过一些朋友也说有这种情况。

    请问谁知道怎样解决?  

    1:在ADO中将Lookup字段的LookupCache设为True就可以了;可以通过。不过用这种方法以后,DBGrid的速度非常慢,我的商品资料表并不多,只有大约  
  2-3万条记录。有什么办法可以提高一下速度。(※试过此办法,可以解决出错的问题,但是速度问题没有试)。

    2:把LOOKUP字段所对应的表用LEFT   JOIN连在SQL中不就完了。(※还没有试)。

    3:有人也遇到过此问题,关闭“出错停止”就没有问题,原因他也找到了,是记录的Lookup字段对应的字段的值在lookup的数据库中没有找到相应的记录。可我一直没有找到解决方法,本以为是delphi的一个Bug。(※原因是,但是肯定不是Bug,从网上得知:是Lookup会发两条插入记录导致出错的,一条是本ADO的,一条是对Lookup字段的)。

//以下是一个Delphi用户给borland公司的一封相关内容的邮件

这是我写给borland公司的一封信,可惜他们并未回复。但其内容提供了错误原因和解决办法。
邮件正文:
我是个DELPHI的忠实爱好者
有个问题我一直弄不明白。关于ADO数据集控件中的Lookup类型字段,在其Lookupkeyfields属性指向的字段中存在NULL值的,就会出现'EOleException with message '发生未知错误',这个提示。经过调试后验证只有以下3种办法可以解决:

1.把lookup字段所在的DataSet的AutoCalcField设为False
2.把lookup字段所在的DataSet的Append时给lookupkeyfield字段先赋一个值
3.把lookup字段的LookUpCache设为True(速度受到很大的影响)

象这种应该算是Delphi的bug吧?如果算是bug,为什么在delphi5到现在都没有做出修正呢?
如果不算是BUG,那种情况难道就正常吗?
希望贵公司的技术人员能给予解答,谢谢


ps:我们公司是delphi的正版用户,热切的希望borland公司能越做越强.   引自:http://blog.csdn.net/happy_david/article/details/249336

原文地址:https://www.cnblogs.com/bingege/p/2336588.html