在VB中實現文件上載

發表于:2007-07-14來源:作者:點擊數: 標簽:
作者:張瑞華 Visual Basic 作為一個集應用程序 開發 、 測試 、查錯功能于一 體的集成式開發環境,越來越受到 程序員 的青睞。筆者在開發某數據 庫維護系統的過程中,選擇了 VB 5.0作為開發平臺, Unix 作為 服務器 端 操作系統,Informix 作為服務器 數據庫 。
作者:張瑞華

  Visual Basic 作為一個集應用程序開發、測試、查錯功能于一 體的集成式開發環境,越來越受到程序員的青睞。筆者在開發某數據 庫維護系統的過程中,選擇了VB5.0作為開發平臺,Unix作為服務器端 操作系統,Informix 作為服務器數據庫。  

問題的出現  
  筆者在開發該維護系統的過程中,注意到Informix 數據庫的字段 類型CLOB 填入數據時需要函數FILETOCLOB("FILENAME","SERVER") , 其中的"FILENAME"需要指出文件路徑和文件名稱。然而,在維護過程 中此文件是在客戶端執行的,這樣就要求即時將文件傳輸到服務器端 。  

解決辦法
  1. FTP傳輸工具
我們首先使用FTP傳輸工具,用VB5.0中SHELL 命令調用DOS批處理 文件來實現傳輸的需要。
Shell調用格式:
Shell(pathname[,windowstyle])
例子:Shell("c:\windows\upload.bat")
批處理文件upload.bat 的內容:
c:\windows\ftp hostname
username
password
send c:\zrh\upload.txt upload.txt
bye
該命令實現了文件"upload.txt"的傳輸要求。在使用完畢之后, 再調用命令把該文件刪除。

例子:Shell("c:\windows\del_up.bat")
批處理文件del_up.bat 的內容:
c:\windows\ftp hostname
username
password
dele upload.txt
bye
這樣,文件"upload.txt"被刪除。
但是,另一個問題出現了。由于Shell 函數的運行機制是與其它 程序同步執行,也就是說,當調用Shell 函數的子程序還沒有執行完畢 之前,Shell函數后面的語句已經執行。在大批量添加數據的過程中, 就會出現某個記錄的文件還沒有傳到,而下一個插入語句(I nsert)已 經開始調用。這樣,ODBC調用就會出現錯誤。
  
   
  2. INET 控件
  Inte.net Transfer控件提供了Internet 上最常使用的兩種協議 :HTTP 和FTP。使用HTTP 協議可以連接到WWW服務器上來下載文件;使 用FTP協議則可以登錄到FTP 服務器。一般的FTP命令,例如CD、GET 都可以通過Execute 方法實現。
下面是一個設置INET控件屬性的例子。
  inet1.URL=ftp://username:password@hostname/document
  inet1.Protocol=2-icFTP
  inet1.RemoteHost=hostname
  inet1.RemotePort=21
  inet1.Username=username
  inet1. Password=password
執行文件傳輸:
  Inet1.Execute "ftp://username:password@hostname", _
  "PUT" &local_filename & " UPLOAD1.TXT"
  right1 = Inet1.StillExecuting
  Do While right1
    right1 = Inet1.StillExecuting
    DoEvents
  Loop
這樣便實現了文件的上載。
*SINET 控件的優點
INET控件與Shell()函數的不同之處在于INET控件通過調用語句
  right1 = Inet1.StillExecuting
  Do While right1
    right1 = Inet1.StillExecuting
    DoEvents
  Loop來控制語句執行的順序。在文件傳輸工作未完成之前,程序 不會執行其它語句,自然也就不會出現調用Shell 函數所出現的問題 。變量right1用來測試inet1 的執行狀態,如果進程中仍在進行文件 傳輸的工作,則調用過程DoEvents給系統空閑時間來做文件傳輸工作, 這樣便成功地執行了文件上載的功能。該文件使用完畢之后將被刪除 。
  Inet1.Execute "ftp://informix:informix@rd", _
  "DELETE UPLOAD1.TXT"
  right1 = Inet1.StillExecuting
  Do While right1
  right1 = Inet1.StillExecuting
  DoEvents
  Loop
將上載的文件刪除是為了避免占用服務器端磁盤空間。
*S利用StateChanged事件提示信息
服務器在執行inet1.execute 的同時也激活了Inet1_StateChang ed事件,進程可以根據捕獲到的狀態進行動作。
  object_StateChanged(ByVal State As Integer)
  State:整數類型Integer
下面是狀態的說明。
  常數值   描述icNone
  0      未報告狀態icHostResolvingHost
  1      控件正在尋找指定主機的IP地址icHostResolved
  2      控件已成功找到指定主機的IP地址icConnecting
  3      控件正在與指定主機進行連接icConnected
  4      控件已成功與指定主機連接icRequesting
  5      控件正在向主機發出請求icRequestSent
  6      控件已成功向主機發出請求icReceivingResponse
  7      控件正在從主機接收反饋信息icResponseReceived
  8      控件已成功從主機接受反饋信息icDisconnecting
  9      控件正在與主機斷開icDisconnected
  10     控件已與主機斷開icError
  11     在與主機通信的過程中發生了錯誤icResponseComp leted
  12     請求結束且數據已經接收到
下面是一個例子。
  Private Sub Inet1_StateChanged(ByVal State As Integer)
  ' Retrieve server response using the GetChunk
  ' method when State = 12. This example assumes the
  ' data is text.
  Select Case State
  ' ... Other cases not shown.
  Case icResponseReceived ' 12
  Dim vtData As Variant ' Data variable.
  Dim strData As String: strData = ""
  Dim bDone As Boolean: bDone = False
  ' Get first chunk.
  vtData = Inet1.GetChunk(1024, icString)
  Do While Not bDone
  strData = Data & vtData
  ' Get next chunk.
  vtData = Inet1.GetChunk(1024, icString)
  If Len(vtData) = 0 Then
    bDone = True
  End If
  Loop
  txtData.Text = strData
  End Select
  End Sub  

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97