在WSH(Windows Script Host)架構下可以透過建立ADODB.Connection物件連結Access資料庫,進行資料庫的存取動作。當然,只要設定好ODBC資料來源,也可以操作其它資料庫,只是在一般小型資料的存取上,我還是偏愛使用Access資料庫。
結合前面文章「在WSH環境如何應用DOM方式分析網頁資料─解決JavaScript語法無法執行問題」取得的資料,簡單開個資料表來寫入資料,程式碼如下:
<?xml version="1.0" standalone="yes" encoding="big5"?> <package> <job> <script type="text/javascript" language="javascript" charset="utf-8"> <![CDATA[ /** * * 取得資料。 * * @author ace * * @version 2010/11/11 v0.1 * * @param {String} astrStockCode 股票代碼。 * * @returns {String} 網頁資料。 * * @requires Microsoft.XMLHttp * */ function getHttp(astrStockCode) { var strReturn = new String(""); var strURL = new String("http://tw.stock.yahoo.com/q/q?s=" + astrStockCode); var objXMLHttp = new ActiveXObject("Microsoft.XMLHttp"); objXMLHttp.open("GET", strURL, false, ""); objXMLHttp.send(); // todo: 加入是否正確取得資料之判斷式。 var strReturn = new String(objXMLHttp.responseText); return strReturn; } /** * * 剖析html資料。 * * @author ace * * @version 2010/11/11 v0.1 * * @param {String} astrTrnDate 交易日期。 * @param {String} astrStockCode 股票代碼。 * * @returns {Array} 陣列資料。 * */ function parseHTML(astrTrnDate, astrStockCode, astrContent) { var objReturn = new Array(); /** * * 建立瀏覽器物件。 * * @author ace * * @version 2010/11/16 v0.1 * * @see <a href="http://us.generation-nt.com/answer/parsing-html-jscript-help-59686112.html">Parsing HTML with JScript</a> * @see <a href="http://www.eggheadcafe.com/software/aspnet/36239301/jquery.aspx">Jquery</a> * */ var htmlfile = new ActiveXObject("htmlfile"); var window = htmlfile.parentWindow; var navigator = window.navigator; var document = window.document; var location = document.location; window.ActiveXObject = {}; // todo:載入html檔案發生錯誤時,無法被JavaScript的catch語法攔截?! htmlfile.open(); htmlfile.write("<script type=\"text/javascript\">window.onerror = function () {};</script>"); htmlfile.write(astrContent); htmlfile.close(); var objTR = document.getElementsByTagName("tr"); for (var intIndex = 0; intIndex < objTR.length; intIndex++) { var objTD = objTR[intIndex].getElementsByTagName("td"); if (objTD.length == 12) { objReturn.push(astrTrnDate); objReturn.push(astrStockCode); objReturn.push(objTD[2].firstChild.innerHTML); // 成交金額多了<b>標籤,再往下一個結點取資料。 objReturn.push(objTD[3].innerHTML); objReturn.push(objTD[4].innerHTML); objReturn.push(objTD[6].innerHTML.replace(",", "")); objReturn.push(objTD[7].innerHTML); objReturn.push(objTD[8].innerHTML); objReturn.push(objTD[9].innerHTML); objReturn.push(objTD[10].innerHTML); break; } } return objReturn; } /** * * 寫入Access資料表。 * * @author ace * * @version 2010/11/30 v0.1 * * @param {String} astrTrnDate 交易日期。 * @param {String} astrStockCode 股票代碼。 * @param {Array} aobjData 資料陣列。 * * @return * * @description 2010/11/30 陣列資料內容: * aobjData[0]:交易日期。 * aobjData[1]:股票代碼。 * aobjData[7]:開盤價格。 * aobjData[8]:最高價格。 * aobjData[9]:最低價格。 * aobjData[2]:收盤價格。 * aobjData[5]:成交張數。 * */ function insertAccess(astrTrnDate, astrStockCode, aobjData) { var objConn = WScript.CreateObject("ADODB.Connection"); try { strDatabase = new String("Stock.mdb"); var strSQL = "insert into stocks_day_trn_log " + "(trn_date, stock_code, open_price, high_price, low_price, close_price, trn_qty) " + "values " + "('" + aobjData[0] + "', '" + aobjData[1] + "', " + aobjData[7] + ", " + aobjData[8] + ", " + aobjData[9] + ", " + aobjData[2] + ", " + aobjData[5] + ")"; objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strDatabase; objConn.Open(); objConn.Execute(strSQL); } catch (e) { throw e; } finally { objConn.Close(); } } // Program Start Here try { var objToday = new Date(); // 以系統日期當作交易日期,理想作法應以網頁記載時間為準。 var strTrnDate = new String(""); strTrnDate = objToday.getFullYear().toString() + (objToday.getMonth() + 1).toString() + objToday.getDate().toString(); var strStockCode = new String("2002"); insertAccess(strTrnDate, strStockCode, parseHTML(strTrnDate, strStockCode, getHttp(strStockCode))); } catch (e) { WScript.Echo("執行過程有誤,錯誤訊息:" + e.description); } ]]> </script> </job> </package>
在這裡採用自組SQL語法的方式寫入資料,主要是SQL語法自己常用、比較熟悉,只是寫完之後才發現程式碼看起來比較不容易閱讀(得要自己算清楚單引號)。再加上JavaScript的除錯並不是非常方便,也許該考慮使用RecordSet物件來撰寫,結構看起來會比較好。(在不考慮程式效能的前提下,把程式碼改的清楚易懂也是個好的設計方向@@)
其實這篇沒什麼技巧,對我來說主要是把連結Access資料庫的連結字串記錄下來,方便以後可以回來查,免得每次寫程式都還要花時間去找XD
沒有留言:
張貼留言