解決delphi TAdoQuery組件的close方法導致”列名無效“錯誤的問題
1,故障現(xiàn)象
一次程序運行,出現(xiàn)如下錯誤:

對應(yīng)代碼如下:

2,故障分析
Query_alert_2的語句在查詢分析器中單獨執(zhí)行是正常的。排除語句出錯。
如果注解掉Query_alert_1,則錯誤變?yōu)镼uery_alert_3執(zhí)行出錯:
2019-07-11 09:32:26 Query_alert_1執(zhí)行完畢
2019-07-11 09:32:27 Query_alert_2執(zhí)行完畢
2019-07-11 09:32:42 Do_Update_Statis出錯:列名 'bat_pos1' 無效。
如果注解掉Query_alert_1、Query_alert_2,則Query_alert_3執(zhí)行正常。
可見,出現(xiàn)錯誤是delphi內(nèi)數(shù)據(jù)庫組件產(chǎn)生的,與數(shù)據(jù)庫執(zhí)行無關(guān)。
3,故障原因及解決
數(shù)據(jù)庫版本的SQLServer2005,執(zhí)行的這些SQL語句含有臨時表,如:
if OBJECT_ID('tempdb..#t1')>0 
 drop table #t1
執(zhí)行正式的SQL之前,會運行以上語句,以刪除當前同名的臨時表。
但實際運行發(fā)現(xiàn),這些臨時表不一定會被刪除,而當引用時,可能會引用到以前的臨時表,導致欄位不存在錯誤。
因此,在Query_alert_1、Query_alert_2,Query_alert_3語句的最后,都加上drop 臨時表的語句,以確保臨時表在下次使用前一定不存在。如:
--檢查臨時表是否在用,有則刪除,以防錯誤
if OBJECT_ID('tempdb..#t1')>0 
 drop table #t1
if OBJECT_ID('tempdb..#t2')>0 
 drop table #t2
/*
 執(zhí)行相關(guān)業(yè)務(wù)邏輯SQL 
select *
into #t1 
from table1
。。。
。。。
*/
--執(zhí)行完畢,清除臨時表,以便下次再使用
if OBJECT_ID('tempdb..#t1')>0 
 drop table #t1
if OBJECT_ID('tempdb..#t2')>0 
 drop table #t2
修改后,結(jié)果多條SQL語句順序執(zhí)行正常。

4,總結(jié)
關(guān)于數(shù)據(jù)庫臨時表,一定要注意在查詢器中執(zhí)行和在程序代碼中執(zhí)行是有區(qū)別的。
區(qū)別在于查詢器會自動提交交易,并清除臨時表,而程序則不一定。
以上這篇解決delphi TAdoQuery組件的close方法導致”列名無效“錯誤的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
 為什么繼續(xù)選擇DELPHI(即將逝去的Delphi前景在何方)
已經(jīng)鉆DELPHI很深了,當然現(xiàn)在DELPHI是過了最輝煌的時代。但為什么要繼續(xù)下去,而不轉(zhuǎn)向其它的?這是不是死腦筋2018-02-02
 Delphi實現(xiàn)窗體感知鼠標滑過并自動隱藏與顯示窗口的方法
這篇文章主要介紹了Delphi實現(xiàn)窗體感知鼠標滑過并自動隱藏與顯示窗口的方法,涉及Delphi操作窗口及鼠標事件的技巧,需要的朋友可以參考下2015-05-05

