免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Excel 一句話讓程序運行速度提高了幾百倍(recordset的CursorLocation屬性)
 因工作需要,用EXCEL+ADO+SQL SERVER編寫了一個加班工資錄入的小程序。寫好后進行了一些測試,因測試數(shù)據(jù)不多,沒發(fā)現(xiàn)有什么問題。這個月正式用這個程序來計算加班工資并上傳,一共1000多條記錄,運行上傳,花了很長時間程序還是沒有響應,開始以為是程序有問題,調試后發(fā)現(xiàn)程序本身并沒有失去響應,只是速度非常慢,測試了一下,更新10條記錄平均一下要3秒,這樣1000多條記錄的話差不多要5分鐘,于是開始查找原因。

先簡單說一下程序工作的方法,因要連接到SQL SERVER數(shù)據(jù)庫,所以上傳附件也不是太能說明問題,而且最終發(fā)現(xiàn)解決問題的關鍵也不需要上傳附件。我的程序使用ADO建立一個connection對象cnGzb和一個recordset對象rsGzb,通過SQL語句將數(shù)據(jù)讀入rsGzb,加班信息存放在一張工作表中,遍歷每條加班數(shù)據(jù),將加班工資更新rsGzb中相應的記錄(使用recordset的filter屬性根據(jù)工號進行篩選),最后用recordset的updatebatch方法更新SQL Server數(shù)據(jù)庫表中的相應字段。

首先我打算先找出哪些代碼影響了速度,我先把覺得可能影響速度的代碼注釋掉,再運行,最終發(fā)現(xiàn)影響速度的是recordset的filter屬性,可能是filter的速度比較慢而的引起的,于是就想是否能找到一個更快的查找方法,發(fā)現(xiàn)ADO中還有一個find方法。修改代碼為find后速度還是沒有太大的改變,郁悶...

怎么辦呢?突然想起以看過一遍關于優(yōu)化SQL查詢的文章,里面對SQL查詢優(yōu)化有一個比較詳細的說明,特別比較了在已建立索引的字段上進行查詢與未建立索引字段上查詢速度的差別,想起一句話,“所有快速查找都是基于排序的”,于是馬上修改代碼,添加對rsGzb中的工號字段進行排序代碼(rsGzb.Sort = "gh ASC"),運行,出錯(運行時錯誤3251:當前提供程序不支持排序或過濾所必須的界面),查看sort屬性的幫助,發(fā)現(xiàn)里面有一條說明“此屬性要求將 CursorLocation 屬性設置為 adUseClient。”,于是添加代碼(cnGzb.CursorLocation = adUseClient),再運行。太爽了,1秒內(nèi)就完成了操作,太有成就感了!\(^O^)/
沒想到排序可以把查找的數(shù)據(jù)提高到這么恐怖的程度。太厲害了。

馬上想到把這個經(jīng)過到壇子里來發(fā)貼,和大家分享一下。
為了能很好的表達這個意思,也讓大家感覺一下前后的差別,于是想到利用recordset的save方法把recordset保存到文件中,這樣就可以脫開SQLSERVER,大家就可以在沒有數(shù)據(jù)庫連接的情況下進行測試了。修改代碼,保存recrodset。完成。

進行測試,把排序的代碼注釋掉,運行。咦,不到1秒就完成了,怎么回事,難道注銷的代碼行搞錯了,反復檢查發(fā)現(xiàn)排序的代碼的確是注釋掉了,反復測試發(fā)現(xiàn)似乎排序對程序的運行影響不大,那到底是怎么回事呢?

想了很久終于明白了,提高速度的那行代碼是(cnGzb.CursorLocation = adUseClient),
CursorLocation屬性是一個connect和recordset對象都有的一個屬性,該屬性表示如何存儲查詢結果,默認值為AdUseServer。若不對recordset的CursorLocation進行設置,則recordset將繼承connection對象的CursorLocation值。

在默認情況下recordset對象對于查詢的結果由OLE DB提供程序或數(shù)據(jù)庫來管理,簡單理解為recordset的查詢結果存放于服務器端,而且處理這些查詢結果的過程要通過OLE DB或數(shù)據(jù)庫來完成而不是通過ADO來完成,這時候ADO更象一個任務派發(fā)者,指揮OLE DB或數(shù)據(jù)庫來完成工作,這樣一來,一個命令下達后,影響這個命令執(zhí)行的因素就很多了,如OLE DB或數(shù)據(jù)庫的響應速度,網(wǎng)絡連接等等,我當時由于數(shù)據(jù)庫在其他的服務器上,因為可能網(wǎng)絡連接引起的速度變慢可以也是其中的一個因素。當把CursorLocation設置為adUseClient時,查詢結果直接存放于recordset的臨時表中(本地),由ADO直接對recordset進行操作,這時前面的影響因素就沒有了,處理的速度直接取決于本機速度。這就是我所碰到的問題的關鍵。

把這個經(jīng)過記錄下來是為了和大家分享一下我從發(fā)現(xiàn)問題到分析問題到解決問題的過程,可能對大家有所幫助。

下面就是程序中的那幾句關鍵代碼(第1名和第3句在這兒的作用相同,可以只寫一句)
        cnGzb.CursorLocation = adUseClient
        Set rsGzb = New ADODB.Recordset
        rsGzb.CursorLocation = adUseClient 'CursorLocation對于關閉的recordset對象可讀可寫,對于打開的recordset對象只讀
        rsGzb.Open sSqlCommand, cnGzb, adOpenKeyset, adLockBatchOptimistic

[ 本帖最后由 lbpp 于 2009-6-5 12:52 編輯 ]
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
RecordSet 游標的使用
ADO代碼連接數(shù)據(jù)庫
將查詢中的字段設置為排序依據(jù)(2)
VB RecordSet.CursorLocation
VB+SQL用ADODB對象時datagrid顯示數(shù)據(jù)提示:行集合不能作為標簽
問專家-ADO的RECORDSET的RECORDCOUNT屬性總是為-1
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服