JScript 快速开发框架 Edk:DAO 数据库连接

访问 http://code.google.com/p/naturaljs/on Google Code 可获取 JScript快速开发框架 Edk 之源码。

相信许多人学 Web 的第一步便是从连接数据开始,封装过程亦如是。连接数据库这道板斧似乎不用多说,无非那个几个步骤,但还是有必要讲讲的。于是,在介绍代码之前,先重温调用数据的一般执行步骤。一、连接数据库;二、执行 SQL 操作。三、返回数据集合。这里有个优化的地方,也是常见的技巧,就是其中连接了的数据库应该对象不应立刻销毁,应予保留,以便反复使用。因为一次请求就会有不止一次的查询,所以保留下来就可以重复使用链接对象。但是为什么不使用链接池(Pool)?由于 JScript 不是守护进程,一次请求关闭一个线程,立刻回收率代码“所占”的资源,所以连接池的算法可能就无用武之地了。

学习了 Java,想起来 Java 的那些概念,所以,连类名称都叫做 DAO。DAO = Data Access Object 数据访问对象,既可读又可写的。当前 DAO 不包含读写的操作,而是分别由 $$.sql.writer.Writer 和 $$.sql.reader.Reader 提供数据库数据的写、读。

DAO 的核心方法为 execute():

有没有发现,connect Object 只创建一次?以后反复调用这个单例。但值得一提的是,我们把数据库连接对象 connect Object 的引用定义在 execute() 方法上!——仔细想想,也没有什么好奇怪的。利用 JavaScript 的超强动态绑定,甚至可以在方法上定义新的元素,建立新的引用,也是毫无问题。现在我们就是利用这个方法设计 DAO 的数据结构。(当然,一些情况就不是“毫无问题”的,例如客户端编程中,DOM 对象千万就不要绑定其他内容,否则极容易 Memory Leak,保持其 DOM API怎么样就怎么样便对了)。这样,我们的数据库连接对象不直接依附在 this 对象上,而是通过 this.execute.connectObj 才可访问。目的就是避免 this 的 API 太乱。

关于静态属性

上述定义一个 connect Object 可以说进行了一次静态属性的分配。为什么是静态的而不是动态的呢?静态的原因在于值只要分配一次;实例属性则依据每次实例化不同而有不同的值。不过 JavaScript 的 OO 特性并不明显,很难从代码中说明我那个地方就是要“静态属性”的,呵呵。怎么搞才好?我开始的做法是写一个 getStaticProerty() 函数,经过这个函数来返回属性,而不是直接获取的。但是这个方法虽然封装是封装了,不过我后来却否决了这个想法,原因就在于一个问题,原本实现静态的逻辑很简单,就是设置一个变量,然后判断是否 undefined,如 undefined 则写入静态值,然后以后不断地访问这个函数就返回静态值。很简单没有什么复杂的地方。特别另外地写一个 getStaticProerty() 函数,反而带来额外的维护成本,也不见得复用性有多么的明显,于是,决定以后在具体实现中实现“静态属性”的思想就可以了,不搞什么 getStaticProerty()。

 不过为了更加说明问题所在,我列一列原来的方案,方便理解我说的话:

 当前 DAO 支持 Access、MySQL(要装ODBC驱动)和 SQLite(同样,也要装驱动)的字符连接串。

 针对已查询出来的记录集,是不是要再经过一定的处理呢?是的。我们是 JS 的语言,就转换为转换为天然的 JSON 结构吧。过程很简单,就是双循环 RecordSet。其中要注意的就是 ADO RecordSet 数量类型变为JS类型,即 sql2json(value, dataType) 函数。当前我选择一个简单的转换,如果要复杂、全面的 ADO 类型检测,可以通过请查阅文件: adovbs.inc 了解更多常量信息,该文件在系统中默认的路径为: C:/Program Files/Common Files/System/ado/adovbs.inc,或者直接看看我后面贴的函数。这个函数很全面的了,但我用不上很多的地方,所以就进行简化,于是得到当前的 sql2json。

文章最后谨记:在程序写完阶段关闭数据库连接,即 $$.sql.close();

附:

 附:

在 ASP 程序中使用参数化查询

ASP 环境下的参数化查询主要由 Connection 对象和 Command 对象完成。

Access 数据库只支持匿名参数,在传入参数的位置用问号代替即可。SQL Server 数据库虽然支持匿名和非匿名的参数,但是在 ASP 中也仅能使用匿名参数。

var conn = Server.CreateObject("ADODB.Connection");
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Test.mdb");
conn.Open();

var cmd = Server.CreateObject("ADODB.Command");
cmd.ActiveConnection = conn;
cmd.CommandType = 1;
cmd.CommandText = "SELECT TOP 1 * FROM [User] WHERE UserName = ? AND Password = ?";
cmd.Parameters.Append(cmd.CreateParameter("@UserName", 200, 1, 20, "user01"));
cmd.Parameters.Append(cmd.CreateParameter("@Password", 200, 1, 16, "123456"));

var rs = cmd.Execute();
Response.Write(rs("UserId").value);

rs.Close();
conn.Close();
http://heeroluo.net/Article/Detail/61

评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sp42a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值