返回列表 上一主題 發帖

請教有關ADODB.STREAM和Microsoft.XMLHTTP的用法

請教有關ADODB.STREAM和Microsoft.XMLHTTP的用法

我打算將YAHOO FINANCE提供的CSV檔案下載作分析,於是在網上找到了混合用ADODB.STREAM和Microsoft.XMLHTTP來下載的方法,但我發現資料實在太多,根本不能方便使用。
所以打算把資料匯入ACCESS作整理,並根據網上的教學寫了下面的CODE:
  1. Sub GetPrice()
  2. Dim wks As Workspace
  3. Dim dbs As Database
  4. Dim rs As DAO.Recordset
  5. Dim mySQL As String, myUrl As String
  6. Dim WinHttpReq As Object

  7. Set wks = DBEngine.Workspaces(0)
  8. Set dbs = wks.OpenDatabase("D:\Shares\temp.mdb")

  9. shareNo = Format(1, "0000")

  10. myUrl = "http://ichart.finance.yahoo.com/table.csv?s=" & shareNo & ".HK&a=09&b=27&c=2001&d=07&e=29&f=2012&g=d&ignore=.csv"

  11. T1 = "D:\Shares\temp01\" & shareNo & ".csv"

  12. Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
  13. WinHttpReq.Open "GET", myUrl, False
  14. WinHttpReq.Send

  15. If WinHttpReq.Status = 200 Then
  16.     Set oStream = CreateObject("ADODB.Stream")
  17.     oStream.Open
  18.     oStream.Type = 1
  19.     oStream.Write WinHttpReq.ResponseBody
  20.     oStream.SaveToFile T1
  21.     oStream.Close
  22. End If


  23. Set r1 = Workbooks.Open(T1)
  24. Set r2 = r1.Sheets(1).Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious)

  25. If Not r2 Is Nothing Then
  26.     r = r2.Row
  27.    
  28.     mySQL = "insert into Price select * from (select " & shareNo & " as Share, Date, Open, High, Low, Close, Volume as Vol, [Adj Close] as AClose from [Excel 8.0;hdr=yes;imex=1;Database=" & T1 & "].[" & shareNo & "$A1:G" & r & "])"

  29.     dbs.Execute (mySQL)

  30.     r1.Close
  31.     Kill T1
  32. End If


  33. End Sub
複製代碼
但這段CODE有些問題,希望各位可以多加指教:
1) 我不太明白ADODB.STREAM和Microsoft.XMLHTTP那部份的意思,網上和我手上的參考書都沒有提及,實在不了解當中的運作
2) 我這段CODE的流程應該是下載那個CSV,經過Microsoft.XMLHTTP讀取資料,再用ADODB.STREAM寫成一個CSV,然後我讀取CSV的資料,加上SHARENO,IMPORT到ACCESS,最後把CSV刪掉。
請問當中
讀取資料>儲存成CSV>讀取CSV>寫入ACCESS>刪除CSV的過程
能否改成,
讀取資料>>寫入ACCESS?
謝謝各位

回復  小俠客
試試看
GBKEE 發表於 2012-8-30 16:21



    我剛剛試比較用.ADDNEW和.UPDATE和SQL INSERT 速度比較,我發現用SQL INSERT比前者快很多
  1. Set wb = Workbooks.Open(myUrl)
  2.         With myRS
  3.             For Each a In ActiveSheet.Range([A2], [A2].End(xlDown))
  4.                 .AddNew        '添加各個欄位的資料
  5.                 For i = 1 To .Fields.Count - 1
  6.                     .Fields(0) = shareNo
  7.                     .Fields(i) = a(1, i)
  8.                 Next i
  9.                 .Update       '更新資料表
  10.             Next
  11.         End With
複製代碼
所以我希望用SQL作資料寫入,但請問這句如何改寫成用 wb 或activebook作DATABASE呢?
  1. "insert into Price select * from (select " & shareNo & " as Share, Date, Open, High, Low, Close, Volume as Vol, [Adj Close] as AClose from [Excel 8.0;hdr=yes;imex=1;Database=" & wb & "].[table$A1:G" & r & "])"
複製代碼
謝謝指教

TOP

回復  小俠客
你已有積分44分  版規: 檔案附件限等級中學生(積分50)以上才能下載
加油 加油!
GBKEE 發表於 2012-8-31 10:24



    終於成為中學生了,可以載附件了
太利害了,原來可以這樣簡化的,謝謝!內容太多,要點時間消化

但可以多了解一下,用DAO 和ADODB在執行效率上有沒有分別?
因為DAO不用像ADODB要寫provider=?????,容易記住。

另外,我看到「資料導入資料庫()」中,你是用FOR LOOP+.AddNew +.UPDATE的方法寫入資料,這個和用SQL COMMAND的INSERT,在執行速度上有沒有分別?謝謝

TOP

這個方法好像不錯,待我回家改成這個試試,謝謝

TOP

完整程式碼....
  1. Sub 將CSV檔資料寫入ACCESS()

  2.      Dim cn As ADODB.Connection
  3.    
  4.     '建立ADODB Connection物件變數
  5.      Set cn = New ADODB.Connection
  6.    
  7.      TARGET_DB = "TaiwanDB.mdb"
  8.      tbl = "PRICE_Daily"
  9.      股票代號 = "1101"
  10.      theCsvFolder = ThisWorkbook.Path
  11.    
  12.     '建立ACCESS(*.mdb)連結
  13.      cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  14.              "Data Source=" & ThisWorkbook.Path & "\" & TARGET_DB & ";" & _
  15.              "Persist Security Info=False"
  16.          
  17.      strFields = "[Date],[Open],[High],[Low],[Close],[Volume],[Adj Close] as [AdjClose]"
  18.      strSQL = "INSERT INTO [" & tbl & "] SELECT " & 股票代號 & " as [StockID]," & strFields & " FROM [Text;Database=" & theCsvFolder & "].[" & 股票代號 & "#CSV]"

  19.     '執行SQL command
  20.      cn.Execute strSQL
  21.      
  22.     '關閉ADODB connection
  23.      cn.Close
  24.      
  25.     '清除佔用記憶體
  26.      Set cn = Nothing

  27. End Sub
複製代碼
diabo

TOP

#10 的寫法,只能省一個步驟...

讀取資料 > 儲存成CSV >  (可省略)讀取CSV(可省略) > CSV直接寫入ACCESS > 刪除CSV的過程[code]
diabo

TOP

回復 9# 小俠客

直接將CSV檔,當作TABLE的另一種寫法...
  1. theCsvFolder = ThisWorkbook.Path & "\temp\"   '下載的CSV暫存資料夾,檔名則為【股票代號.csv】
  2. tbl = "PRICE_Daily"   ' ACCESS 裡存日成交資料的TABLE

  3.         strFields = "[Date],[Open],[High],[Low],[Close],[Volume],[Adj Close] as [AdjClose]"
  4.         strSQL = "INSERT INTO [" & tbl & "] SELECT " & 股票代號 & " as [StockID]," & strFields & " FROM [Text;Database=" & theCsvFolder & "].[" & 股票代號 & "#CSV]"

  5. cn.Execute strSQL
複製代碼
diabo

TOP

本帖最後由 小俠客 於 2012-8-31 11:09 編輯
回復  小俠客

[參考]
順序可改成:
下載CSV → 經過VBA整理加入代號 → 匯入Access。

至於下載後, ...
HSIEN6001 發表於 2012-8-31 10:56



    我也不懂如何在CSV加入新欄位,所以我用了一個替代方法:
  1. mySQL = "insert into Price select * from (select " & shareNo & " as Share, Date, Open, High, Low, Close, Volume as Vol, [Adj Close] as AClose from [Excel 8.0;hdr=yes;imex=1;Database=" & T1 & "].[" & shareNo & "$A1:G" & r & "])"
複製代碼
先把CSV當成一個DATABASE的TABLE,再用SQL INSERT到我的ACCESS中,SQL COMMAND當中加上我需要的SHARE NO,這樣便不用加欄位到CSV了。
但我還是覺得我現在的做法有點蠢,花一輪功夫將資料寫成一個CSV,再用SQL把沒有的資料(SHARE NO)加上,IMPORT到ACCESS,再刪掉那個CSV,但我總覺得建立CSV的工序有點重複......

TOP

回復 6# GBKEE


    好的,待我先回應大家的POST再作研究,先謝了

TOP

回復 4# 小俠客

[參考]
順序可改成:
下載CSV → 經過VBA整理加入代號 → 匯入Access。

至於下載後,依含有【代號】之檔案名稱給該檔新增一個【代號欄位】,這方面你可另外詢問先進,尋求解決方案;這部份我還沒學到。
∼ ^___^ ∼吐舌傻笑!

TOP

        靜思自在 : 心中常存善解、包容、感思、知足、惜福。
返回列表 上一主題