我愛學(xué)習(xí)網(wǎng)-上傳
當(dāng)前位置: 主頁 > 文庫 > Delphi >

分享兩條Delphi開發(fā)經(jīng)驗(yàn)

時間:2018-11-24 22:30來源:我愛學(xué)習(xí)網(wǎng) 作者:布丁點(diǎn)兒 點(diǎn)擊: 332 次

  近期在做“數(shù)據(jù)庫切割工具”時,碰到了一些棘手的問題,經(jīng)過多方打探、查找,最終得以解決,現(xiàn)總結(jié)下來,給大家共享,免的大家以后在碰到類似問題時再耗費(fèi)大量時間去查找、去打探!

  1、判斷輸入的路徑在服務(wù)器上是否存在:

  例如,要在客戶端執(zhí)行一個創(chuàng)建數(shù)據(jù)庫的程序,數(shù)據(jù)庫要在服務(wù)器上創(chuàng)建,但路徑可以手工輸入,這時就面臨一個判斷自已現(xiàn)在輸入的路徑在服務(wù)器上是否存在的問題,免得在執(zhí)行Create Database SQL時才報錯:找不到路徑。

  具體方法如下:

  exec master..xp_cmdshell 'dir E:\DATA' ,在查詢分析器中執(zhí)行此段SQL,如果存在此路徑,會輸出此路徑下的所有文件與文件夾信息,還有此盤的可用字節(jié)數(shù)與已此文件夾的字節(jié)數(shù)(圖1所示);如果此路徑不存在,則輸出信息如圖2所示,提示“找不到文件”。

  但是,當(dāng)路徑中含有空格時,如C:\Program Files,直接用exec master..xp_cmdshell 'dir C:\Program Files',系統(tǒng)返回結(jié)果會如跟圖2顯示一樣,我們需要做額外處理,才能得到正確的返回結(jié)果:

  (1)exec master..xp_cmdshell 'dir "C:\Program Files\Microsoft SQL Server\MSSQL"'

  這種寫法,在查詢分析器中直接執(zhí)行是沒有問題的,也能返回正確結(jié)果,但如果放到程序中執(zhí)行:

  SQL.Add('exec master..xp_cmdshell ''dir "C:\Program Files\Microsoft SQL Server\MSSQL"''),Open時就會報錯,不能執(zhí)行。

  為什么呢???

  (2)我們接下來查看SQL聯(lián)機(jī)幫助,對XP_CMDSHELL的描述如下:

  xp_cmdshell {'command_string'} [, no_output]

  參數(shù)

  'command_string'

  是在操作系統(tǒng)命令行解釋器上執(zhí)行的命令字符串。command_string 的數(shù)據(jù)類型為 varchar(255) 或 nvarchar(4000),沒有默認(rèn)值。command_string 不能包含一對以 上的雙引號。如果由 command_string 引用的文件路徑或程序名稱中有空格,則需要使用一對引號。如果使用嵌入空格不方便,可考慮使用 FAT 8.3 文件名作為解決辦 法。

  no_output

  是可選參數(shù),表示執(zhí)行給定的 command_string,但不向客戶端返回任何輸出。

  幫助文件提示我們要用一對引號將文件路徑或者程序名稱包起來,將整個路徑包不起來不會報錯,那我就將帶有空格的單步路徑包起來試試,看看行不行,執(zhí)行 如下SQL:SQL.Add('exec master..xp_cmdshell ''dir C:\"Program Files"\"Microsoft SQL Server"\MSSQL''),這樣Open時果然不報錯了,看來查詢分析器的語法檢查與我們的Query自己的語法檢查還是有一定區(qū)別的,不能等同的。因此,碰到路徑中帶空格的情況,正確的寫法還是:

  exec master..xp_cmdshell 'dir C:\"Program Files"\"Microsoft SQL Server"\MSSQL'

  這同時說明SQL幫助文件中的綠色字體部分 command_string 不能包含一對以上的雙引號 的描述是不正確的,看來SQL Server幫助文件與產(chǎn)品也出現(xiàn)了“規(guī)格與程序不相符”的問題了,呵呵......

  2、清空數(shù)據(jù)庫的日志文件

  問題的引出:我們的切割過程就是將單據(jù)數(shù)據(jù)中某個日期以前的數(shù)據(jù)先復(fù)制到新的數(shù)據(jù)庫中(select ... into ...),然后再將原來數(shù)據(jù)庫中的這些數(shù)據(jù)刪除,這樣操作在數(shù)量量很大的數(shù)據(jù)庫上時,其日志文件的增長也是驚人的:我復(fù)制一個48萬條記錄的表時,最后發(fā)現(xiàn)僅這一個表的操作就使新數(shù)據(jù)庫的日志文件增加了170MB,如果不加清理,那就會被日志文件占用大量寶貴的磁盤空間。況且,我們轉(zhuǎn)移到的新建數(shù)據(jù)庫的作用也只是用來查詢,以后不會有任何Insert、Update、Delete操作的,要這些日志文件沒有什么用處,因此必須在向它轉(zhuǎn)移數(shù)據(jù)的過程中做一些縮小日志文件的處理,怎么辦??問題由此而生...

  (1)處理過程中不記錄日志

  設(shè)置方法如下:企業(yè)管理器中打開對應(yīng)數(shù)據(jù)庫的“屬性”,頁框“選項(xiàng)”中將“模型”改為“簡單”。這樣設(shè)置的結(jié)果是對此數(shù)據(jù)庫的任何操作都將不記錄事務(wù)日志。對應(yīng)的SQL為:EXEC sp_dboption @pdbName, 'trunc. log on chkpt.', 'TRUE'

  但是,我們經(jīng)過測試發(fā)現(xiàn):啟用此功能后,我們在對這個數(shù)據(jù)庫操作時,就不能用事務(wù)操作了,程序執(zhí)行到BeginTranSaction時就報錯,不能執(zhí)行下去,由于我們不能在對此庫的操作中保證100%的正確性,因此我們還需要事務(wù),因此這種方法適用空間有限,也不能滿足我們程序的需求。

  我們還得繼續(xù)查找.....

  (2)處理過程中允許記錄日志,但要對日志文件進(jìn)行處理,時時縮小它。

  SQL Server的聯(lián)機(jī)幫助告訴我們:

  在下列情況下,日志文件的物理大小將減少:

  執(zhí)行 DBCC SHRINKDATABASE 語句時。

  執(zhí)行引用日志文件的 DBCC SHRINKFILE 語句時。

  自動收縮操作發(fā)生時。

  下面我們逐個分析這三個方案:

  ① DBCC SHRINKDATABASE:收縮特定數(shù)據(jù)庫的所有數(shù)據(jù)和日志文件,包含我們的需求,但也大于我們的需求,此方案可用,但不要著急,給人的感覺是買了一件能穿的衣服,但尺寸大了些,穿在身上有點(diǎn)不舒服,我們接著分析以下兩個方案...

  ② DBCC SHRINKFILE: 收縮相關(guān)數(shù)據(jù)庫的指定數(shù)據(jù)文件或日志文件大小。與方案1的區(qū)別僅一字之差:“和”與“或”,相當(dāng)于把方案1拆成兩步來執(zhí)行,我們需要的就是收縮日志文件,因此,它對我們來說顯得比較合適,有點(diǎn)量體裁衣的感覺。但還有沒有更好的呢,我們來看第三個方案...

  ③自動收縮:數(shù)據(jù)庫也可設(shè)置為按給定的時間間隔自動收縮,服務(wù)器定期檢查每個數(shù)據(jù)庫中的空間使用情況。如果發(fā)現(xiàn)數(shù)據(jù)庫中有大量閑置空間,而且它的 autoshrink 選項(xiàng)設(shè)置為 true,SQL Server 就縮小該數(shù)據(jù)庫中的文件大小。它是周期性的執(zhí)行DBCC SHRINKDATABASE,既然方案1已經(jīng)是一件尺寸大了一些的衣服,則此方案就相當(dāng)于又穿上了N件大尺寸衣服,一件就已經(jīng)夠了,我還要那么多干嘛呢??

  綜合對比發(fā)現(xiàn),方案2正是我們需要的。

  DBCC SHRINKFILE ('+Trim(edDBMC.Text)+'_Log, TRUNCATEONLY)

  經(jīng)過這個語句處理以后,日志文件將回到它的最小狀態(tài)504KB,任何的日志記錄都將清空。

  再結(jié)合我們的工具,復(fù)制完一個表之后,我們就執(zhí)行方案2,處理過程中日志文件暫時占用的最大空間也就是處理最大數(shù)據(jù)表時產(chǎn)生的日志空間,但最后都將清空,顯示為500多KB,相對于龐大的數(shù)據(jù)文件而言,微之戡微.

------分隔線----------------------------
    ?分享到??
看看啦
主站蜘蛛池模板: 亚洲综合一区国产精品| 人妻激情偷乱视频一区二区三区| 国产另类TS人妖一区二区| 国产精品一区不卡| 乱色熟女综合一区二区三区| 无码日韩人妻AV一区免费l | 亚洲福利一区二区三区| 无码福利一区二区三区| 一区二区不卡久久精品| 精品国产a∨无码一区二区三区| 国产乱码精品一区二区三区| 久久久99精品一区二区| 女同一区二区在线观看| 污污内射在线观看一区二区少妇 | 一区二区在线视频观看| 精品国产伦一区二区三区在线观看 | 肉色超薄丝袜脚交一区二区| 国产在线一区二区杨幂| 无码精品尤物一区二区三区| 成人乱码一区二区三区av| 无码av免费毛片一区二区| 国产激情з∠视频一区二区 | 无码毛片一区二区三区中文字幕| 日韩最新视频一区二区三| 亚洲福利秒拍一区二区| 青青青国产精品一区二区| 乱精品一区字幕二区| 国产一区三区二区中文在线 | 国模无码一区二区三区不卡| 国产精品一区12p| 国产精品女同一区二区| 亚洲av无码一区二区三区天堂古代| 国产精品福利一区二区| 中文字幕在线不卡一区二区| 偷拍激情视频一区二区三区| 日韩成人无码一区二区三区| 蜜桃视频一区二区| 久久久精品人妻一区二区三区| 99久久精品午夜一区二区| 成人区人妻精品一区二区三区| 一本色道久久综合一区|