87,907
社区成员
发帖
与我相关
我的任务
分享
var connString="..."
var conn=Server.CreateObject("...")
var rs=Server.CreateObject("...")
//每次打开数据库都需要如斯操作:
rs.open(sql,conn,3,3)
Response.Write(rs("...")) // 主要是写 rs("")太麻烦了, 又是括号又是引号
rs.close()
var rs=new RS("select * from ...")
Response.write(rs.id) // 省掉括号引号
rs.execute("select * from ...") //重写execute函数, 若没有关闭连接则先自动关闭
function RS(sql){
return function(fieldName){
return rs(fieldName)
}
}
function RS(sql){
rs.id=rs("id")
return rs
}
function RS(sql, mode){
var rs=null
var field=function(fieldName){
return rs(fieldName)
}
var execute=function(sql,mode){
if(!rs)rs=createRecordset()
if(rs.state!=0){
rs.Close()
field.length=0
}
if(mode==0 || !mode){
rs.open(sql,db,1,1)
rebuildField()
}else if(mode==1){
rs.open(sql,db,1,1)
recycle(rs)
}else if(mode==2){
rs.open(sql,db,1,2)
rebuildField()
}
}
var rebuildField=function(){
if(rs.EOF || rs.BOF)return false
for(var i=0; i<rs.Fields.Count; i++){
switch(rs.Fields(i).Type){
case 3: // Integer
case 11: // Boolean
case 17: // TinyInt
eval("field."+rs(i).Name+'='+rs(i)+'');break;
case 135:
eval("field."+rs(i).Name+'=oDate(rs(i))');break;
case 200:
case 201:
case 202:
case 203:
eval("field."+rs(i).Name+'="'+String(rs(i)).replace(/\\/g,"\\\\").replace(/\"/g,"\\\"")+'"')
break;
}
}
}
field.recordset=rs
execute(sql,mode)
return field
}
// 打开记录集, 连接对象在里面已经处理好了, 而且多个实例中是共享的Recordset池, 防止重复的调用CreateObject而没有及时回收加大服务器开销
// 如果有空闲的Recordset对象, 则投入使用, 若没有空闲的, 则自动CreateObject创建一个
var rs=RS("select ddNickName from ddUser", 0) // 最后的参数为0=只读方式打开, 1=一次性调用, 调用结束后关闭连接, 2=可读写方式打开
var a=rs.ddNickName // 这里传的是变量的值, 而不是field的引用, 这样可以避免很多麻烦
//例如 一个Date类型的field对象字段, rs("ddBirthday").getFullYear()这样是错的,
//而 rs.ddBirthday.getFullYear() 则是OK的,
//程序会自动根据字段的类型来重新映射字段的值, 并且类型不会丢失, 当然, 目前只支持各种格式的 数字, 布尔, 字符串 和 日期, 其他格式很少使用, 所以就暂不支持了
rs.moveNext() // 支持游标操作, 如果哪位能够做出不加括号也能调用这个方法, 请告诉我, 非常感谢, 这样就能够像真正的Recordset对象一样
rs.ddNickName="hello" // 赋值操作
rs.update() // update 函数也重写了, 后面的参数是 是否将当前记录作为新的记录来更新
rs.addNew() // 增加新记录操作
rs.ddNickName="world"
rs.update() // 按照常规模式, AddNew是不需要update,可是为了节省编写代码的时间, 所以还是靠update来更新, 而不是在游标移动或者关闭连接时来更新
rs.moveFirst() // 游标操作
for(var i=0; i<rs.length; i++){ // 使用rs.length代替了rs.recordset属性, 一来recordset太长, 二来不符合js的习惯, 例如字符串, 数组等都是length
Response.write(rs.ddNickName+"<br />")
rs.moveNext()
}
rs.moveLast()
while(!rs.bof){ // bof, eof 属性完美的支持
Response.write(rs.ddNickName+"<br />")
rs.moveProv()
}
rs.close()
System.data = {
connection:function(){
var db = Server.MapPath(paths + "bak/abs.mdb");
var conn = Server.CreateObject("ADODB.Connection");
conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;User ID=admin;Data Source=" + db);
return conn;
},
/*
return
Array
{
readonly bool
pageSplit bool
pageSize int
pageIndex int
pageCount int
classType "recordset"
Fields array(string)
}
[item]
Object
{
classType "record"
}
*/
recordSet:function(sql,o){
var options = {
readonly:true,
pageSplit:false,
pageSize:20,
pageIndex:1
}
System.extend(options,o);
var oconn = System.data.connection();
var rs = Server.CreateObject("ADODB.RecordSet");
//System.view(sql,true);
rs.Open(sql,oconn,options.readonly?1:3,options.readonly?1:3);
var arr = [];
var arr1 = [];
options.pageCount = rs.PageCount;
for(var i=0,l=rs.Fields.Count;i<l;i++)
arr1[arr1.length] = rs.Fields.Item(i).Name;
if(!rs.EOF)
{
if(options.pageSplit)
{
rs.PageSize = options.pageSize;
options.pageCount = rs.PageCount;
if(options.pageIndex<1)options.pageIndex = 1;
if(options.pageIndex>rs.PageCount)options.pageIndex = rs.PageCount;
rs.AbsolutePage = options.pageIndex;
}
var pageSize = options.pageSize;
while(!rs.EOF && (!options.pageSplit || pageSize-->0))
{
var obj = {classType:"record"};
for(var i=0,l=arr1.length;i<l;i++)
{
obj[arr1[i]] = rs.Fields.Item(arr1[i]).Value;
switch(typeof(obj[arr1[i]]))
{
case "string":obj[arr1[i]] = String(obj[arr1[i]]);break;
case "boolean":obj[arr1[i]] = RegExp.Cache.booleanTrue.test(new String(obj[arr1[i]]));break;
case "number":obj[arr1[i]] = Number(obj[arr1[i]]);break;
case "date":obj[arr1[i]] = new Date(Date.parse(obj[arr1[i]]));break;
}
}
arr[arr.length] = obj;
rs.MoveNext();
}
}
else
{
for(var i=0,l=rs.Fields.Count;i<l;i++)
arr1[arr1.length] = rs.Fields.Item(i).Name;
options.pageIndex = 0;
}
arr.commandText = sql;
arr.Fields = arr1;
arr.classType = "recordset";
System.extend(arr,options);
rs.Close();
oconn.Close();
return arr;
},
/*boolean*/ execute:function(/*string*/ sql)
{
var oconn = System.data.connection();
var returnvalue = true;
try{
oconn.Execute(sql);
}catch(e){
if(System.debug)
returnvalue = e.message;
else
returnvalue = false;
}
oconn.Close();
return returnvalue;
}
}