初学ajax,昨天做项目的同时,写了一个操作cookies的js框架,比较符合jsp或者asp操作cookies的习惯(因为JavaScript里本身没有这样的对象,操作cookies等于操作字符串,所以比较麻烦)。源代码已经上传点击下载该文件,以下是框架接口说明:
对象:document.xCookie / xCookie (两个对象同等)
方法:
document.xCookie.load(d) 预加载当前已存cookies,参数d为文档对象,默认为当前文档,即document。此函数是预加载,需在所有cookie操作前使用。
document.xCookie.save() 保存对cookies的修改
document.xCookie.clear() 清除当前文档所有cookies
document.xCookie.$(name) 返回以name命名的cookie对象(document.xCookie.cookie类),相当于asp里的 Response.Cookies(name)。用点语法或[]语法访问该cookie的属性值,即 document.xCookie.$(name).prop或document.xCookie.$(name)[prop]。如果属性值不存在,则返回undefined(null)
类:document.xCookie.cookie (操作以name命名的cookie对象,document.xCookie.$(name)返回的就是这个类的实例,所以这个类的实例可以不必单独自行创建)
构造函数:
function(document, name, timeout, path, domain, secure),document为文档对象(必填);name为cookie的名字(必填);timeout为cookie过时设置,单位为分钟,可缺省,默认为暂时保存;后三个参数不在赘述,不明白的请参考有关JavaScript里的cookie知识,可缺省。
方法:
class.read(),读取当前cookie的属性值对(创建类实例时已经执行)
class.write(),写入对当前cookie的修改
class.remove(),删除当前cookie
class.toString(),返回属性值对的字符串表示形式
属性:
class.prop,访问当前cookie的prop属性
举例:
document.xCookie.load();
document.xCookie.$('myname').first='terry';
document.xCookie.$('myname').last='king';
document.xCookie.$('sex').sex='male';
document.xCookie.save();
alert(document.xCookie.$('myname').toString());
alert(document.xCookie.$('sex').toString());
备注,压缩包里一共有两个源文件,xCookie+prototype.js是沿用了prototype(1.4)框架的一些方法,需要prototype框架的支持
另外一个xCookie是没有沿用prototype框架的。
点击下载此文件
Post还是Get
客户端提交调用AjaxUpdater.Update(“GET”,”userValidator.asp”,display);
后,服务器端Request不到userName和Password值
/**
类名:Ajax
创建日期:2008-3-12
版本:1.0
功能说明:
处理异步提交请求,和对请求状态的处理,以及对返回内容类型的分别处理
**/
Ajax={};
//提交请求
//method:post或get方法
//url:服务器端的URL
//callbackMethod:返回响应后的处理函数
Ajax.makeRequest=function (method,url,callbackMethod)
{ //根据浏览器类型创建request对象
if (window.XMLHttpRequest)
{
this.request=new XMLHttpRequest();
}else{
this.request=new ActiveXObject("MSXML2.XMLHTTP");
}
//设置回调函数
this.request.onreadystatechange=callbackMethod;
//设置异步请求
this.request.open(method,url,true);
//发送请求
this.request.send(url);
}
//根据返回状态代码,进行不同的页面异步显示
Ajax.checkReadyState=function(_id)
{
switch(this.request.readyState)
{
case 1:
document.getElementById(_id).innerHTML="Loading....";
break;
case 2:
document.getElementById(_id).innerHTML="Loading....";
break;
case 3:
document.getElementById(_id).innerHTML="Loading....";
break;
case 4://成功返回结果
//alert(this.request.status);
AjaxUpdater.isUpdating=false;
document.getElementById(_id).innerHTML='';
return HTTP.status(this.request.status);
default:
document.getElementById(_id).innerHTML = "An unexpected error has occurred.";
}
}
//返回请求对象的响应属性类型的内容
Ajax.getResponse=function()
{ //如果是返回内容首部含有xml格式的数据,则直接返回xml文档内容
if(this.request.getResponseHeader('Content-Type').indexOf('xml')!=-1)
{
return this.request.responseXML.documentElement;
}else
{//否则返回字符格式的文本内容
//alert(this.request.responseText);
return this.request.responseText;
}
}
/**
类名:AjaxUpdater
创建日期:2008-3-12
版本:1.0
功能说明:
处理异步提交请求,和对请求状态的处理,以及对返回内容类型的分别处理
**/
AjaxUpdater={};
//初始化设置isUpdating属性为false
AjaxUpdater.initialize=function()
{
//isUpdating用于应用程序任何地方确定一个请求是否正在运行
AjaxUpdater.isUpdating=false;
}
//初始化
AjaxUpdater.initialize();
//更新请求对象方法
//method:post或get方法
//service:也就是URL或附加?名=值&名=值的字符串
//callback:是可选参数,因为有一个默认的onResponse方法进行处理
AjaxUpdater.Update=function (method,service,callback)
{
//如果callback为空则默认设置onResponse方法进行处理
if(callback==undefined||callback=="")
{
callback=AjaxUpdater.onResponse;
}
//调用Ajax的发送请求方法进行异步请求
Ajax.makeRequest(method,service,callback);
//设置当前运行标识为true
AjaxUpdater.isUpdating=true;
}
//默认响应方法,当请求成功也就是=200时,将正在运行状态isUpdating设置为false,防止程序状态混乱
//注意:传入的参数loading是默认页面上id为loading的div或其他元素
//因此彼此页面中含有id为loading的元素
AjaxUpdater.onResponse=function ()
{
//返回状态200
if(Ajax.checkReadyState("loading")==200)
{
AjaxUpdater.isUpdating=false;
}
}
function initialize()
{
//alert("userValidator.asp");
AjaxUpdater.Update("GET","userValidator.asp",display);
}
function display()
{
try{
if(Ajax.checkReadyState('loading')=='OK')
{
alert("here");
info=Utilities.getElement("info");
//alert(Ajax.getResponse());
info.innerHTML=Ajax.getResponse();
}
}catch(e)
{
//alert(e);
document.write(e);
}
}
</script>
<body>
<div id="loading"></div>
<div id="info">
<form method="post">
<div>用户登陆</div>
<div>用户名:<input type="text" id="userName" name="userName"/></div>
<div>密码:<input type="text" id="password" name="password"/></div>
<div><input type="button" value="submit" onclick="initialize();" /></div>
</form>
</div>
</body>
</html>
<%
'Response.Write("<div>测试</div>")
'if Request("Action")="login" then
userName=Request.QueryString("userName")
password=Request.QueryString("passWord")
if Request.QueryString("userName")="" or Request.QueryString("password")="" then
Response.Write("<div>Is Empty</div>")
else
Set rs=Server.CreateObject("ADODB.RecordSet")
sql="select * from userInfo where userName='"&userName&"' and password='"&password&"'"
'response.write sql
rs.open sql,conn,2,2
if not rs.EOF then
'Response.Cookies("userInfo")
Response.Write("<div id='panel'><div>我的收藏</div><div>修改资料</div><div>我的好友</div></div>")
else
Response.Write("<div>登陆失败</div>")
end if
end if
'end if
%>
Request的取值方法
一般来说还使用万能的request(“id”)比较好
Request从几个集合取数据是有顺序的,从前到后的顺序依次是 QueryString,Form,最后是ServerVariables。Request对象按照这样的顺序依次搜索这几个集合中的变量,如果有符合的就中止,后面的就不管了。
现在我们来分析下你得问题.
假设有个页面 test.asp?id=111
这里我们的页面是用GET的方法.这时用request.querystring(“id”)与request(“id”)是一样得,应该如果不指定REQUEST得集合,首先就会从Querystring搜索.
而如果我们的页面是用的是POST的方法发送数据给test.asp,那么用request.querystring(“id”)是不行的了(他只能取 GET),而要用request.from(“id”),而如果还用request(“id”)他也能取到数据,但先检测QUERYSTRING的值,显然速度就慢了.
下面是个检测的例子你可以看看:
<%
If Request("submit")<>“” then
Response.Write “直接取:”& Request(“username”) & “
”
Response.Write “取Get:” & Request.QueryString(“username”) & “
”
Response.Write “取Post:” & Request.Form(“username”) & “
”
End if
%>
Flex3 Code key
不多说了:
1377-4260-4983-2510-8542-5740
用STOMP集成Flex3.0和RabbitMQ
用STOMP集成Flex3.0和RabbitMQ
作者 Moxie Zhang译者 宋玮 发布于 2008年3月16日 下午8时48分
社区
Java
主题
RIA,
消息传送
在Flex on Rails上张贴的一篇文章中,Derek Wischusen与我们分享了他使用ActionScript 3 STOMP客户端将RabbitMQ与Flex 3集成在一起的试验。
RabitMQ是一个开源的企业消息传递系统:
RabitMQ是一个完整的、高可靠的企业消息传递系统。RabbitMQ客户端类库及后台程序(broker daemon)可一起被用于创建一个AMQP网络,或者单独使用它们以便给建立起来的网络带来RabbitMQ的好处。
RabitMQ是AMQP协议的实现,该协议是消息传递中间件的一个开放标准。STOMP则是面向流文本的消息传递协议。Wischusen所尝试的是去利用RabbitMQ的STOMP适配器。
为了使读者理解该试验是如何工作的,Wischusen给我们共享了相应的资源和源代码:
o 按照其指南所示步骤,让带有STOMP适配器的RabbitMQ来运行。
o 下载Flex例子应用的项目文件。
接下来,Wischusen解释了这个Flex例子项目到底实现了什么:
该项目有两个单独的应用组成:ImageSender和ImageReceiver。该项目文件也包含了已编译的as3-stomp类库,这样你就无需单独下载它了。
ImageSender和ImageReceiver应用将通过STOMP协议使用RabbitMQ交换消息来进行通讯。为了证明来自两个应用的Flex代码是如何与STOMP客户端一起工作的,Wischusen分享了这一代码片断。
在ImageSender方面:
“stomp” />
…
private function init () : void
{
var ch: ConnectHeaders = new ConnectHeaders();
ch.login = “guest”;
ch.passcode = “guest”
stomp.connect(“localhost”, 61613, ch);
}
…
private function sendImage():void
{
var image: ByteArray = ImageSnapshot.captureImage(canvas).data;
stomp.send(destination, image);
}
在ImageReceiver方面:
“stomp” message=”handleMessages(event)” />
…
private var destination: String = “/queue/images”;
private function init () : void
{
var ch: ConnectHeaders = new ConnectHeaders();
ch.login = “guest”;
ch.passcode = “guest”
stomp.connect(“localhost”, 61613, ch);
stomp.subscribe( destination );
}
…
private function handleMessages(event : MessageEvent) : void
{
var bd: BitmapData = new BitmapData(canvas.width, canvas.height);
var loader : flash.display.Loader = new flash.display.Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded);
loader.loadBytes(event.message.body);
function onBytesLoaded (event : Event) : void
{
var content : DisplayObject = LoaderInfo( event.target ).content;
bd.draw( content );
canvas.graphics.beginBitmapFill(bd);
canvas.graphics.drawRect(0,0, canvas.width, canvas.height);
canvas.graphics.endFill();
}
}
该试验示范了一个图像是如何从Flex应用端(ImageSender)被捕获的,该图像怎么被发送至RabbitMQ服务器,消息如何被发送到消息消费者应用(ImageReceiver),以及这个消息怎样触发了一个事件而从RabbitMQ服务器装载这个图像。这是面向消息的RIA应用概念的一个有趣的演示。
查看英文原文:Integrating Flex 3.0 and RabbitMQ Using STOMP
Flex测试工具RIATest发布Beta版
Flex测试工具RIATest发布Beta版
作者 Moxie Zhang译者 郭晓刚 发布于 2008年3月12日 上午12时40分
社区
Java
主题
RIA
RIATest是一个Flex自动化GUI测试工具,它刚刚公开发布了Beta版。InfoQ为此采访了RIATest的创造者Tigran Najaryan。
Najaryan首先谈到了创造RIATest的目的:
RIATest是一个用来对Adobe Flex 3程序进行自动化GUI测试的工具。创造RIATest的目的是为了给商业和专业开发者提供一个简单、干净的测试自动化方案,帮助他们保证产品的质量。我们在定价上非常激进,一心把测试自动化带给更多的Flex用户,而这些用户以前都负担不起其它的Flex测试自动化方案。
说到RIATest如何工作的时候,Najaryan解释说:
从技术上看,RIATest由两部分组成:Agent和IDE(或者命令行执行器)。Agent呆在浏览器一方,直接与被测程序打交道。Agent提供了组件查看器(Component Inspector),让你检查和监视被测程序的GUI组件及其属性。Agent还通过TCP连接与IDE相连。Agent与IDE在回放期间(IDE向 Agent发送指令并接收结果)以及录制期间(Agent把录下的动作通知给IDE)都经由这个TCP连接相互沟通。
测试脚本是用RIAScript语言写的。RIAScript是一个简化版的ActionScript(另有些微扩展)——因此熟悉ActionScript的开发者很容易学会编写RIATest的测试脚本。
RIATest是用什么开发的?Najaryan回答说:
RIATest从一开始就是作为Flex 3测试自动化工具来设计的,它使用了Flex的测试自动化框架。RIATest IDE是用C++和wxWidgets库写的。RIATest Agent是用Flex 3开发的。
由于现在已经可以见到不少Flex测试工具,所以InfoQ请Najaryan将RIATest与其它工具比如FlexUnit作一下比较:
RIATest作为一个自动化GUI测试工具,与单元测试等其他测试手段是相辅相成的。必须通过多种自动化测试手段才能得到最高质量的保证,自动化GUI测试和单元测试都包括在内。
谈到如何测试连通性,如HTTP请求和SOAP连接:
RIATest内建了按照指定条件自动或手动进行同步的功能,因此即使程序需要与远程数据源通信,RIATest也能完全胜任自动化测试的工作。QA工程师可以通过“'waitfor'”操作让测试脚本与被测程序的组件状态同步。
最后,Najaryan给出了一段测试脚本的例子:
RIATest Script
查看英文原文:RIATest for Flex Released Beta Product
ASP数据库连接类
ASP数据库连接类
本帖发表在我是网管论坛,帖子地址:http://bbs.54master.com/119846,1,1
多数人定义conn文件的时候,都是这样.但在这样我并没有说不对.(如下代码)
conn.asp
[Copy to clipboard] [ – ]
CODE:
<%
dim conn
dim connstr
dim db
db="database/data_asp.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
conn.Open connstr
%>
其实我们可以更好的利用conn这个文件做数据初始化的操作.今天把以前写过一个连接数据库类文件拿出来与大家分享一下,让我们一起慢慢接触ASP里的类的调用.
文档目录:
[Copy to clipboard] [ – ]
CODE:
Data:数据库文件夹
Inc :系统文件夹
inc/Fel_AsenSystem.asp:数据库类文件
Conn.asp :连接数据库文件
Index.asp:首页
很简单,我们来简单看一下Fel_AsenSystem.asp文件的代码:
[Copy to clipboard] [ – ]
CODE:
<%
'文 件 名:Fel_AsenSysTem.asp
'文件功能:封装类库代码
'开 发 组:Dreams Creation 项目开发组
'开发模块:数据库类
'组 成 员:特蓝克斯
'作 者:特蓝克斯
'创建时间:2006-04-20
'完成时间:?-?-?
%>
<%
'/*******************数据库类*******************/
Class Fel_DataBase
Private ConnStr
Public Property Let ConnValue(ByVal Val)
ConnStr = Val
End Property
Public Property Get ConnValue()
ConnValue = ConnStr
End Property
Public Function OpenConnection(DbType)
Dim TempConn
On Error Resume Next
Set TempConn = Server.CreateObject("ADODB.Connection")
TempConn.Open ConnValue
Set OpenConnection = TempConn
Set TempConn = Nothing
If Err Then
Err.Clear
Response.Write "
”
Response.End
Else
Response.Write “
数据库连接正常!
”
End If
End Function
End Class
%>
定义一个数据库类Class Fel_DataBase而这里在conn文件实例化数据库类
conn.asp
[Copy to clipboard] [ – ]
CODE:
<%
'文 件 名:Conn.asp
'文件功能:连接数据库文件
'开 发 组:Dreams Creation 项目开发组
'开发模块:数据库类
'组 成 员:特蓝克斯
'作 者:特蓝克斯
'创建时间:2006-04-20
%>
<%
Dim DbPath
Dim Conn,Rs
Dim Db
Dim IsSqlDataBase
Dim SqlUsername,SqlPassword,SqlDatabaseName,SqlLocalName
Set Db = New Fel_DataBase '实例化数据库
IsSqlDataBase = 0 '主数据库类型,"1"SQL,"0"为ACCESS
'====ACCESS版 数据库参数=====
Const InstallDir= "/" Rem 网站安装目录,根目录用“/”,请用"/"开头及结尾:如安装在asen_conn目录下,则值为:“/asen_conn/”
DbPath = InstallDir & "Data/Data.mdb" 'Access版主数据库文件的位置(请用绝对路径)
'====SQL版 数据库参数=====
SqlUsername ="asen" '主数据库登录用户
SqlPassword ="asen" '主数据库登录密码
SqlDatabaseName="Fellow_cms" '主数据库名
SqlLocalName="(local)" '数据库服务器,本机用“(local)”
Sub OpenConn() '连接数据库函数
if IsObject(Conn) then Exit Sub
if IsSqlDataBase=1 then
Db.ConnValue = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"
else
Db.ConnValue="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(DbPath)
end If
Set Conn=Db.OpenConnection("主数据库")
End Sub
Sub CloseAllObj()
On Error Resume Next
Set Db = Nothing
Conn.Close:Set Conn = Nothing
end Sub
%>
实例化对象为
[Copy to clipboard] [ – ]
CODE:
Set Db = New Fel_DataBase '实例化数据库
代码很简单,只是提供一个这样思路给大家,要尽量合理的利用conn文件,等在以后的时间里我在给大家讲一下模板及缓存的时候,在介绍详细一些.这里代码COPY过去,就可以用.不需要改什么,当然了,路径问题是一定要考虑的,自己看吧.
ASP中实现通用的数据库路径文件方法
ASP中实现通用的数据库路径文件方法
作者:吕海鹏 文章来源:深度空间原创
在开发ASP + Access的Web应用时,常会遇到数据库文件路径的定位问题。如果在自己的计算机上实现时可以直接指定了事,但如果做的项目要上传到别的服务器或移动别的机器上运行使用,每次都要把这个路径改来改去的话显得有些繁锁,下面结合我做这个网站的经验来解决这个问题,让我们可以“一劳永逸”。
这里以“深度学习网址导航系统”(http://www.deepteach.com/DT_WebDir/)为例,网站的目录结构如下(只列出了相关部分):
DT_WebDir
|- DataBase ’数据库文件目录
| |- data.mdb
|
|- Admin ’后台管理程序所在
| |- login.asp
| |- admin.asp
|
|- index.asp
|- ConnDB.asp ’数据库连接文件
因为index.asp和ConnDB.asp在同一目录下,因此ConnDB.asp中的连接语句这么写的:
Dim ConnStr,Conn
DBpath =”DataBase/data.mdb” ’数据库文件的位置
ConnStr = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=”& Server.MapPath(DBPath)
set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.Open ConnStr
直接在index.asp文件中加入语句实现引用
在ASP中使用Server.MapPath (“file.asp”)语句后,会返回该文件在本地驱动器上的绝对路径,如“D:\DT_WebDir\DataBase\data.mdb”“D:\ DT_WebDir\Admin\DataBase\data.mdb”,所以在不同的子目录的不同文件使用这条语句就只会返回那个文件所在路径,这样我们就不能简单地利用这条语句解决上面的问题,但只要稍加利用这条方法和其它与个字符函数就可以轻松解决上面的问题。
只要我们在需要访问数据库的asp文件中加入以下语句。
“深度学习网址导航系统”实现代码如下:
====================
ConnDB.asp文件
====================
Dim DBpath,ConnStr,Conn
DBpath =DBpath & “DataBase/#data.mdb” ’数据库文件的位置
ConnStr = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=”& Server.MapPath(DBPath)
On Error Resume Next ’启用错误处理程序
set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.Open ConnStr
’=====================
If Err Then
err.Clear
Set Conn = Nothing
Response.Write ”
数据库连接出错,请检查链接路径和数据库名称!
”
Response.End
End If
’======================
On Error GoTo 0 ’禁用错误处理程序
’┌──────────────────── 深度空间 深度学习 ──┐
’│过程名:CloseConnDB
’│作 用:关闭数据库
’│参 数:无
’│日 期:2006/1/16
’└──────────────────── www.DeepTeach.com ──┘
sub CloseConnDB()
Conn.Close
set conn=nothing
end sub
=======================
只要我们在不同目录的需要访问数据库的asp文件中加入以下语句:
=======================
例如:Class_Manage.asp 如下图:

上述方法实现了在不同目录只需调用一个数据库路径文件,这样在应用时只需更改相对应的这个文件就可以实现整站程序的数据库路径 或数据库文件名的变更……
当你改变你站点的目录名称或移到别的机器的情况下就可以不需要理会数据库文件的存取路径问题了。
设置Cookies的有效时间
Response.Cookies(“user_name”).Expires=Date+1 '指定cookie保存时间
保留COOKIES一个小时
Response.Cookies(“MyCookie”).Expires= (now()+1/24)
Response.Cookies(“MyCookie”).Expires = DateAdd(“h”, 1, Now())
Response.Cookies(“CookieName”).Expires=DateAdd(“m”,60,now())
设置60个月以后过期
Response.Cookies(“User”).expires=second()+7
在expires后面定义的时间可以用时间函数代替
例如:date()+7就表示在今天的时间上加上7天,而second()+7则是7秒了。
Response.Cookies(“字段名”).expires=时间函数+N,例如:
Response.Cookies(“name2”).expires=date+1,表示Cookies保存1天,再比如:
Response.Cookies(“name2”).expires=Hour+8,表示Cookies保存8小时。
这种方法我测试过不行(在2003server,iis6.0中),不管second后面有无加(),访问时会出现500错误(还是无法显示网页?忘了)。
织梦尤文:这里的时间累加建议还是使用DateAdd函数,比如我们要累加一小时,则使用:
Response.Cookies(“baidooglecom”).expires = DateAdd(“h”, 1, Now())
30分钟:
Response.Cookies(“CookieName”).Expires=DateAdd(“n”,30,now())
dateadd(“S”,30,now()) 得到秒
Expires 指定 cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上,或在许多时候,我们希望能更长时间地在访问者的计算机上保存cookie。必须设置该日期。
若此项属性的设置未超过当前日期,则在任务结束后 cookie 将到期。
cookie的使用到期时间为“2010年1月1日”: Response.Cookies(“CookieName”).Expires=#January 01, 2010#
cookie的过期时间为“cookie的创建时间+365天”:Response.Cookies(“CookieName”).Expires=Date+365 推荐的
但最好不要随便写 Response.Cookies(“CookieName”).Expires=Date,这样页面之间的调用时值会为空。
Asp使用RecordSet操作数据库实例
在基于微软IIS/PWS的网络平台上,通过服务器端运行的ASP程序来访问后台数据库,是一种最常见的模式了。而对于小型的数据库应用需求,微软的 Access数据库,应该是与ASP程序配套使用的首选。由于Access数据库的ODBC驱动程序支持的SQL指令全,执行效率高,所以Access后台数据库+ASP服务器端程序+客户端IE浏览器,是一个精练实用高效的组合模式。
在这种使用模式中,ASP程序无疑是最重要的,是沟通客户端和后台数据库之间的桥梁。在ASP程序中,通过VB Script,建立对Access数据库的连接,是客户能够访问后台数据库的前提。
一、建立Access数据库连接的常用方法
在ASP中建立对Access数据库连接的一般格式如下:
<%
DbPath=Server.MapPath(数据库名)
Set Conn=Server.CreatObject(“ADODB.Connection”)
Conn.Open “driver={Microsoft Access Driver (*.mdb)};dbq=”& DbPath
Set rs=Server.CreatObject(“ADODB.Recordset”)
Rs.Open 数据表名或SQL指令,Connection对象,Recordset类型,锁定类型
… …
%>
它的各步骤及参数意义如下:
第一行程序:利用Server对象的MapPath函数,取得要打开数据库的完整的文件路径,并存储在变量DbPath中。这其中,数据库名是我们需要指定的参数,应该用我们要打开的数据库的实际名称替代。如果数据库名是直接作为常量出现,要用引号将其括起来,并且不能丢掉扩展名。例如数据库是Test.mdb,则该行程序成为:DbPath=Server.MapPath(“Test.mdb”)。
第二行程序:建立一个ADO对象集中的Connection对象,也即连接对象。这是建立数据库连接的初始步骤。执行这行程序后,Conn成为一个连接对象。
第三行程序:利用连接对象Conn的Open方法打开一个指定的数据库。因为我们要打开的是Access数据库,所以要指定ODBC驱动程序参数,表示要透过Access的ODBC驱动程序来访问数据库:driver={Microsoft Access Driver (*.mdb)};。另一个参数dbq= & DbPath,运算后等效于dbq=Server.MapPath(数据库名) ,是利用了第一行的Server.MapPath(数据库名)函数,用来指定要打开的数据库文件。到这里,就已经打开了数据库名指定的数据库。如果数据库名是“test.mdb”,则打开Access数据库Test.mdb。在这一行里指定的参数,要严格按照格式原样写出,不能省略或改动,也没有可变参数。
第四行程序:建立一个ADO对象集中的Recordset对象,以便利用Recordset对象操作数据库(当然,这只是对数据库操作的多种方式之一)。执行这行后,rs就成为一个Recordset对象。
第五行程序:利用rs对象的Open方法打开数据库中的数据表。这其中有四个参数,其意义如下:
数据表名或SQL指令串:在这个参数里指定要打开的数据库内的数据表名称,或者是用SQL的Select指令串确定的数据表的指定范围数据,例如,数据库Test.mdb中有数据表Number,则该参数成为“Number”,注意引号不能丢;若想打开数据表Number中xh字段值小于90 的数据记录,则该参数可能成为如下的形式:
“Select * From Number Where xh < 90”。
Connection对象:指定已经打开的数据库的Connection对象,在这里固定是Conn,注意无须引号的。
Recordset类型:表示打开数据表的方式,有四种选择。数字0表示只读方式,且当前记录只能下移;数字1表示可读写方式,当前记录可自由上下移动,但不能及时看到别的用户建立的新记录,除非重新启动;数字2表示可读写方式,当前记录可自由移动,而且可以及时看到别的用户增加的新记录;数字3表示只读方式,但当前记录可以自由移动。一般选择2为好,除非为了禁止数据被修改。
锁定类型:这个参数指定数据库的锁定功能。因为网络上的数据库都是多用户的,很可能同时有多个用户在操作数据库。为了避免错误,让同一时间只可能有一个用户修改数据,就要用锁定功能。有四种选择:数字1表示只读方式锁定,用户不能更改数据;数字2表示悲观锁定,当一个用户用rs对象开始修改数据时就锁定数据库,直到用户用rs.Update更新记录后,才解除锁定;数字3表示乐观锁定,只有在数据写入数据库中时候才锁定,不保险,慎用!数字4 表示批次乐观锁定,只有在使用rs.UpdateBatch成批更新数据时候才锁定数据记录。属于很少使用的。一般地,使用悲观锁定比较安全,但是效率要低些。
二、使用Recordset对象操作数据
用上面的方法打开数据库,是利用了Recordset对象建立的数据库连接,然后的对数据操作,也要使用该对象。
用rs.open “数据表名”,Conn,2,2 方式打开数据表,就可以方便的对数据进行操作:
常见的操作对象:
rs.addnew :添加一个新记录在数据表末尾。
rs.delete :删除当前记录。
rs.eof :判断是否已过最后记录。
rs.bof :判断是否移过首记录。
rs.update :数据修改生效。
rs(“字段名”):当前记录指定字段的值。
从数据表中提取数据:用x=rs(“字段名”)的格式,提取数据表中当前记录指定字段的值。
向数据表中填入或修改数据:用rs(“字段名”)=数据值或变量的方式,修改当前记录指定字段的值。
三、使用SQL指令操作数据库
在使用SQL指令对数据库进行操作时,要用如下方式打开数据库和操作:
<%
DbPath=Server.MapPath(数据库名)
Set Conn=Server.CreatObject(“ADODB.Connection”)
Conn.Open “driver={Microsoft Access Driver (*.mdb)};dbq=”& DbPath
Sql=操作数据库的指令串
Conn.Execute sql
… …
%>
四、使用DSN连接数据库
在以上连接数据库的方式中,都是在程序中指定数据库,指定ODBC驱动程序。如果数据源有变化,就需要修改程序。如果在系统级别上,预先定义好数据源DSN,就可以避免这个麻烦。
在定义DSN的过程中,就已经指定好了数据源需要的ODBC驱动程序,也指定好了数据库文件的实际路径和名字,我们在程序中,只需要引用预先定义的数据源名DSN即可。
设定义好的DSN为test,则打开数据库的方式为:
<%
Set Conn=Server.CreatObject(“ADODB.Connection”)
Conn.Open “DSN=test”
Set rs=Server.CreatObject(“ADODB.Recordset”)
Rs.Open 数据表名或SQL指令,Connection对象,Recordset类型,锁定类型
… …
%>
五、结束语
在ASP程序中,建立数据库的连接和访问数据库,有很多方式和技术细节,在此难以一一详述。实际上,对SQL Server数据库,DBF数据库,文本文件,电子表格文件等,也都可以很方便的打开和访问,与对Access数据库的访问大同小异而已。如果说方便, Access应该是首选。如果考虑安全保密性,SQL数据库更好些。使用系统数据源DSN的方式建立对数据库的连接,具有更大的灵活性,也更简便些。
Mikel