如何應用T-SQL實現本地文件操作

最近用VC爲公司寫一個遠程數據庫監控程序,程序需要在內網長時間運行。

其實很簡單,用戶在WEB頁面提交數據到數據庫,軟件間隔一段時間詢問一次數據庫,如果有新的記錄就做相應的處理。

但是WEB頁面提交的記錄很複雜:記錄主要保存文本文件路徑,但是文本文件可能包含真實數據,也可能包含另外一條數據庫記錄的ID,還可能包含另外一個文件路徑。

總之,最後的結果上得到用戶提交的文件的路徑,然後下載文件,處理文件。

如果把全部的分析操作都放到應用程序來實現,可能需要多次查詢遠程數據庫取記錄,降低速度,增加了程序複雜度。

所以就想能不能在存儲過程中把所有的分析操作搞定,然後返回用#號分割各個文件路徑(path1#path2#path3)的一條記錄集呢!

在網上搜索,查詢MSDN,終於成功了!目前程序已經安全、準確運行了一週。

當然還加入了一些不可忽視的工作:最早的作品生存時間不長,最多運行一天就連接數據庫失敗了,發現是網絡故障造成的。

後來改進程序,當連接遠程數據庫失敗後暫停一段時間後自動重試,直到連接上或重試次數達到一定數量。經過拔網線、停止數據庫等測試,都能在恢復網絡後自動重新連接上。

入正題,以下是核心代碼(爲安全起見,做了修改,不便把全部代碼在網上公佈):

 

@FilePath nvarchar(400)='C:/tmp.txt'
            Declare @INT_ERR int ----錯誤代碼,0 成功
            Declare @INT_FSO int ----FSO對象標誌
            Declare @INT_OPENFILE int ----文本文件對象標誌
            Declare @STR_CONTENT varchar(8000) ----文件內容
            --創建FSO對象
            --甚至可以是我們自己寫的dll控件都可以
            EXEC @INT_ERR = sp_OACreate 'Scripting.FileSystemObject', @INT_FSO OUTPUT
            -----文件路徑
            Declare @STR_FILENAME nvarchar(50)
            Set @STR_FILENAME = @FilePath
            ---FSO.OpenTextFile(FileName, 1, FALSE),第二個參數1表示只讀,第三個參數false表示文件不存在時不創建
            ----創建文本文件對象
            ----FSO的所有方法都可以用下面類似方式創建,可以實現文件的任意操作,非常方便
            EXEC @INT_ERR=SP_OAMETHOD @INT_FSO,'OpenTextFile',@INT_OPENFILE OUTPUT,@STR_FILENAME,1,FALSE
            ----讀取文件,內容放到@STR_CONTENT
            ----讀到了文件內容,後面的處理就好辦了
            EXEC @INT_ERR=SP_OAMETHOD @INT_OPENFILE,'ReadAll',@STR_CONTENT OUTPUT
            ----銷燬創建的對象
            EXEC @INT_ERR=SP_OADESTROY @INT_OPENFILE
            EXEC @INT_ERR=SP_OADESTROY @INT_FSO
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章