起因
调用代码: var access = require('./access.js'); var util = require('util'); var accessfile = 'demo.mdb'; access.create({ accessfile: accessfile }, function(data){ console.log(data); }); access.existsTable({ accessfile: accessfile, tablename: 'demo' }, function(data){ if (data.result == 'ok' && !data.exists){ access.execute({ accessfile: 'demo.mdb', sql: "CREATE TABLE demo(id Counter Primary key, data Text(100))" }); } }); access.execute({ accessfile: 'demo.mdb', sql: util.format("INSERT INTO demo(data) VALUES('zswang 路过!%s')", +new Date) }, function(data){ console.log(data); }); access.query({ accessfile: 'demo.mdb', sql: "SELECT * FROM demo" }, function(data){ console.log(data); });
最新代码: http://code.google.com/p/nodejs-demo/source/browse/#svn%2Ftrunk%2Fdatabase
有人提问“如果用nodejs访问sql server?”
找了找资料,发现有两类解决方法,使用第三方nodejs插件:https://github.com/orenmazor/node-tds、使用ADODB.ConnectionActiveX对象。
参考:
如果用
ActiveX那么在Windows下nodejs将会无所不能,类似写asp。那它们怎么通信?得动手试试
经过
思路
用
nodejs通过
cscript.exe
(windows脚本进程)间接访问
ActiveX
cscript能解析
jscript和
vbscript两种脚本,无疑为方便维护选
jscript开发。
需解决的问题
1、跨进程通信
新版的nodejs里增加了对子进程的操作,跨进程通信不是问题。
var
util=require(
'util'
),
exec=require(
'child_process'
).exec,
child;
child=exec(
'cat *.js bad_file | wc -l'
,
function
(error,stdout,stderr){
console.log(
'stdout: '
+stdout);
console.log(
'stderr: '
+stderr);
if
(error!==null){
console.log(
'exec error: '
+error);
}
});
如例我们可以拿到控制台的输出内容
stdout!
2、数据库访问相关ActiveX,ADODB.Connection
var
connection=
new
ActiveXObject(
"ADODB.Connection"
);
var
result=
'ok'
;
try
{
connection.Open(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+params.accessfile);
connection.Execute(params.sql);
}
catch
(ex){
result=ex.message;
}
return
{
result:result
};
connection.Open(
connectionString),链接字符串参数可以设置访问sql server。
3、为方便维护,特别将cscript和nodejs的脚本合并,用
typeof exports判断当前运行环境。
4、字符编码cscript代码使用ascii编码
非ascii码字符进行“\uHHHH”Unicode编码。
5、命令行字符需转义,双引号、百分号在命令行有特殊意义。
参数传递使用base64编码,避免冲突
cscript环境MSXML2.DOMDocument可以做base64编解码
functionbase64Decode(base64){
var
xmldom=
new
ActiveXObject(
"MSXML2.DOMDocument"
);
var
adostream=
new
ActiveXObject(
"ADODB.Stream"
);
var
temp=xmldom.createElement(
"temp"
);
temp.dataType=
"bin.base64"
;
temp.text=base64;
adostream.Charset=
"utf-8"
;
adostream.Type=
1
;
// 1=adTypeBinary 2=adTypeText
adostream.Open();
adostream.Write(temp.nodeTypedValue);
adostream.Position=
0
;
adostream.Type=
2
;
// 1=adTypeBinary 2=adTypeText
var
result=adostream.ReadText(-
1
);
// -1=adReadAll
adostream.Close();
adostream=null;
xmldom=null;
return
result;
}
总结
调用流程
1、创建子进程,传递经过编码的参数;
2、子进程处理完毕将数据JSON格式化输出到控制台;(子进程自动结束)
3、读取控制台的数据,执行回调函数。
优势
1、使nodejs拥有访问ActiveX对象的能力;
2、实现简单,开发维护方便。
劣势
1、只能运行在Windows平台;
2、数据编解码会消耗更多cpu;
3、每次调用需要创建一个子进程重新连接。(可改进)
总结
1、具有一定实用性;
2、跨进程通信性能可继续探索。
模块代码:
调用代码: var access = require('./access.js'); var util = require('util'); var accessfile = 'demo.mdb'; access.create({ accessfile: accessfile }, function(data){ console.log(data); }); access.existsTable({ accessfile: accessfile, tablename: 'demo' }, function(data){ if (data.result == 'ok' && !data.exists){ access.execute({ accessfile: 'demo.mdb', sql: "CREATE TABLE demo(id Counter Primary key, data Text(100))" }); } }); access.execute({ accessfile: 'demo.mdb', sql: util.format("INSERT INTO demo(data) VALUES('zswang 路过!%s')", +new Date) }, function(data){ console.log(data); }); access.query({ accessfile: 'demo.mdb', sql: "SELECT * FROM demo" }, function(data){ console.log(data); });
最新代码: http://code.google.com/p/nodejs-demo/source/browse/#svn%2Ftrunk%2Fdatabase