在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
沒有留言:
張貼留言