不少人对windows平台下特有的ActiveX对象颇有微词 -- JS创建Web对象时不兼容其他浏览器;还时常带来不少系统安全问题等等...
个人觉得,MS提供 ActiveX控件对象只是想让广大开发者能够简便调用,以便获得与系统更好的交互罢了.我们也应当看到其积极的一面。只要我们善用这些 ActiveX控件对象,在日常的工作中或开发一些小应用也是非常的便捷、省事。
就如今天在一Witkey网站接洽到一位开发需求者,其要求采集澳门某博彩网站的赔率,并存入Access数据库。
(我开价2K但对方表示只有300 元预算 多付一元也不乐意,够狠! ... 好吧,念及其要求不高,再则时下物价飞涨,能赚多少就多少吧。)
对方的需求很明了简单,既然是Access自然无须考虑什么跨平台了. 整个流程也就是获取网站的数据,简单处理后写入数据两个步骤而已。
打开注册表HKEY_CLASSES_ROOT看看有哪些 ActiveX对象可以调用, Msxml2.XMLHTTP、Msxml2.DOMDocument、ADODB.Connection、ADODB.Recordset...够了,利用 hta(HTML Application)加上这几个ActiveX对象就足可以完成任务了。
第一步获取远程网站xml数据:
var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.onreadystatechange =function(xml){ if (xmlhttp.readyState == 4) // alert(xmlhttp.responseXML.xml); //处理xml 略... } xmlhttp.open("GET",'http://www.macauslot.com/soccer/xml/odds/odds_config.xml',true); xmlhttp.send();
第二步,利用 ADODB组件对象操作Access写入数据:
var connection=new ActiveXObject("ADODB.Connection"); var rs=new ActiveXObject("ADODB.Recordset"); var connectString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb"; connection.open(connectString); connection.execute("INSERT INTO odds VALUES ...");//增删查sql语句 //略...
用CSS适当修饰界面以及一些html表单元素,完成代码编写后保存为hta,双击运行. OK,打完收工! 前后用时包括与对方洽谈不到40分钟,300元顺利入袋,hehe~ 够简单吧?!!!
所以,我们平时工作或开发时,适当灵活地使用windows系统的特性和组件,就可以事半功倍.而不一定事无大小 就上java、C# 等这些拖着笨重的"乌龟壳"开发环境、又或者C/C++这些开发周期慢 调试麻烦的工程.
function JSDB(){ this.connection = null; this.rs = null; } //初始化连接 //db_file 数据库文件名 JSDB.prototype.init = function(db_file){ try{ this.connection=new ActiveXObject("ADODB.Connection"); this.rs=new ActiveXObject("ADODB.Recordset"); var connectString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+db_file; this.connection.open(connectString); return true; } catch(e) { alert("连接数据库时发生异常:\r\n"+e.name+" : "+e.message); return false; } } //查询数据库 //query 查询语句 //queryFunc 对查询结果进行操作的函数,可以没有 JSDB.prototype.query = function(queryString,queryFunc){ try{ this.rs=this.connection.execute(queryString); if(queryFunc){ queryFunc(this.rs); } }catch(e){ alert("查询时发生异常:\r\n"+e.name+" : "+e.message); } } //关闭数据库连接 JSDB.prototype.close = function(){ try{ this.rs.close(); this.connection.close(); return true; }catch(e){} }