使用连接对象
与数据库的所通信都要通过一个打开的连接来进行。在对一个数据库进行数据的插入和读取之前,必须先打开与这个数据库的连接。这种打开和关闭一个连接的操作与打电话的过程有相似之处。在你能够与SQL Sever进行通信之前,你必须先呼叫它。
这一节讲如何使用ADO连接对象。首先你将学习如何打开和关闭一个对数据库的连接。接下来,你将学会如何通过一个打开的连接执行SQL语句。最后,你将学习如何用连接对象创建事务处理。
打开和关闭数据库连接
要打开与一个数据库的连接,你可以创建连接对象的一个实例。创建了这个实例之后,你就可以调用连接对象的open方法,打开一个连接。这里有一个例子:
<%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open
“FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn”MyConn.Execute
“INSERT Mytable (mycolumn) VALUES (‘Hello World!’)”MyConn.Close
%>
在这个例子中,创建了连接对象的一个实例MyConn。然后调用连接对象的open方法。接下来,调用连接对象的Execute方法,执行了一个SQL语句。最后,关闭这个连接。
每次打开一个新连接时都要输入文件数据源的路径和名字,这实在是个另人厌烦的工作。你可以把这个字符串分配给一个session变量或者在一个包含文件中把它定义为一个常量。这样,你只需要键入一个变量名即可,而不必输入文件数据源的完整名称。要定义一个包含有文件数据源名字的session变量,你可以在文件Global.asa中定义。例如,你可以把下面的内容添加到文件Global.asa的session_onstart脚本中:
session(
“connectionstring”)=”FILEDSN=d:\Program Files\CommonFiles\ODBC\Data Sources\MyData.dsn
”
注意
要了解使用session变量的更多信息,请参阅第16章“使用Active Sever Pages Sessions”。
建立了这个session变量后,你就可以用如下的脚本打开一个连接:
<%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open Session(
“connectionstring”)%>
把文件数据源的名字分配给一个session变量的另一个好处是,你将来可以很容易地改变数据源。如果你需要使用另外一个数据源,你只要改变文件Global.asa中的一个session变量的值即可。
使用完一个连接后,你应该关闭它。这就象挂断一个电话,从而释放占用的线路。连接对象的close方法可以关闭一个连接。关闭了一个连接后,你就不能在用这个连接与数据库进行通信。因此,依赖这个连接支持的其它对象也不能再与数据库相通信。
通过打开的连接执行
SQL语句通过打开的连接执行SQL语句,要用到Execute方法。这个方法有两种形式:一种形式用来从数据库中返回信息,当不需要返回信息时,则使用另一种形式。
下面的例子演示了如何使用Execute方法执行一个没有返回结果的SQL语句:
<%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open
“FILEDSN=d:\Program Files\Common Files\OBDC\Data Sources\MyData.dsn
”MyConn.Execute
“INSERT Mytable (MyColumn) VALUES(‘Hello World!’)”MyConn.Close
%>
在这个例子中,用Execute方法执行了一个SQL SELECT 语句。因为没有返回结果,Execute方法不使用括号。
你也可以用Execute方法从一个查询返回结果。如下例所示:
<%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open
“FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn
”Set RS=MyConn.Execute(
“SELECT * FROM Mytable”)MyConn.Close
%>
在这个例子中,使用了Execute()方法以返回一个SQL SELECT查询的结果。与上一个例子不同,这个Execute方法使用了括号。当你要返回结果时,千万别忘了使用括号,否则你会收到错误信息 Expected end of statement.
这个SQL查询的结果被读取到记录集对象的一个实例RS中。该记录集由Execute()方法自动创建。你将在下一章中学习如何使用记录集。
Execute方法包含两个可选参数。你可以给一个RecordsAffected参数,用来保存被执行的SQL语句所操作的记录个数。你还可以给一个Options参数,用来提供被执行的SQL语句的有关信息。下面的例子同时使用了这两种可选参数:
<!--#INCLUDE VIRTUAL=
”ADOVBS.inc”--><%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open
“FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn
”MyConn.Execute
“UPDATE Mytable Set Mycolumn=’Goodbye!’”,HowMany,adCMDTextResponse.Write(HowMany)
MyConn.Close
%>
在这个脚本中,执行了一个SQL UPDATE语句,改变了表Mytable中所有记录的值。Execute方法带有两个参数。第一个参数是RecordAffected参数。在这个例子中,变量HowMany被作为RecordAffected参数。这个SQL语句执行后,变量HowMany中将存有该语句所操作的记录数。例如,如果表中有32条记录被更新,变量HowMany的值将是32。
上例中Execute方法的第二个参数是Options参数。在这个例子中,Options参数被指定为常量adCMDText。这个常量用来告诉ADO,它应该把字符串的内容解释为命令文本,而不是一个表的名字或一个存储过程。通过告诉ADO被执行的字符串的内容的有关信息,这个常量使得ADO更高效地执行这个命令。(要了解命令的更多信息,请参见第24章“使用命令”。)
你可以使用下面的常量作为Options参数:
在你能够在一个ASP网页中使用这些常量之前,你必须先包含一个名为ADOVBS.inc的特殊文件。文件ADOVBS.inc中包含ADO使用的所有VBSript常量。上例中第一行的INCLUDE语句包含了文件ADOVBS.inc。
在你安装ASP时,这个文件应该已经被自动安装了。一般来说,它会被安装在c:\Program Files\Common Files\System\ADO目录下。但是,你也许不得不使用WINDOWS NT任务栏中的Find命令,找到这个文件的确切位置,找到它之后,把这个文件拷贝到你的Active Sever Pages目录中。
注意
如果你使用Jscript,而不是VBSript,ADO常量的包含文件应该是ADOJAVAS.inc。
打开一个连接后,你需要调用Execute方法多少次,你就可以调用多少次。
例如,下面的脚本向表Mytable中输入了32个字符串:
<!--#INCLUDE VIRTUAL=
”ADOVBS.inc”--><%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open
“FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn
”FOR i=1 TO 32
MySQL=
”INSERT Mytable (Mycolumn) VALUES (‘ This is entry “&i&” ’)”MyConn.Execute MySQL, HowMany,adCMDText
NEXT
MyConn.Close
%>
这段脚本使用了一个FOR
……NEXT循环,向表Mytable中插入了32条记录。变量MySQL包含Execute方法使用的SQL命令字符串。注意书写SQL字符串时如何使用单引号和双引号。单引号用来标记SQL语句内部的引用。双引号用来指定VBSript内字符串的开始和结束。用Execute方法几乎可以这些所有的SQL命令。例如,下面的脚本创建了一个表,然后添加数据,清除数据,最后删除这个表:
<!--#INCLUDE VIRTUAL=
”ADOVBS.inc”--><%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open
“FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn
”‘
create a new tableMySQL=
”CREATE TABLE newtable (mycolumn VARCHAR(255))”MyConn.Execute MySQL
‘
populate the tableMySQL=
”INSERT newtable (mycolumn) VALUES(‘hello’)”MyConn.Execute MySQL
‘
truncate the tableMySQL=
”TRUNCATE TABLE newtable”MyConn.Execute MySQL
‘
drop the tableMySQL=
”DROP TABLE newtable”MyConn.Execute MySQL
Myconn.Close
%>
创建事务处理
当一组语句构成一个事务处理时,如果一个语句没有执行成功,则所有的语句都不成功。如果你需要更新多个表中的数据,你不希望对一个表的操作失败,而对其它表的操作成功了。这时所有事务处理是有用的。
例如,假设某个时间有人在你的站点上买了东西,有关的交易信息存储在两个表中 。一个表用来保存买者的信用卡信息,另一个表包含了要买的商品的信息。
现在,假如有一个人正试图从你的站点上买东西。他的信用卡号码已经输入了第一个表中。但是,就在这时,发生了意外情况,一道闪电击中了你的服务器,使第二个表没有被更新。在这种情况下,当然最后是两个表都没有被更新过。你当然不想收这个人的钱去买他不想买的东西。使用事务处理,你可以防止第二个表没有被更新而第一个表被更新的情况出现:
<%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open
“FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn
”MyConn.BeginTrans
MyConn.Execute
“INSERT CreditCard (CCNum) VALUES (‘5555-55-444-44-4444’)”MyConn.Execute
“INSERT Shipping (Address) VALUES(‘Paris,France’)”MyConn.CommitTrans
MyConn.Close
%>
在这个例子中,用BeginTrans方法和CommitTrans方法来标记事务处理的开始和结束。在BeginTrans方法被调用之后,CommitTRans方法被调用之前,不管出现什么错误,两个表都不会被更新。
你也可以恢复一个事务处理的操作(操作作废)。要做到这一点,应使用RollBackTrans方法。考虑如下的脚本:
<%
Set MyConn=Sever.CreateObject(
“ADODB.Connection”)MyConn.Open
“FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn
”MyConn.BeginTrans
MyConn.Execute
“INSERT CreditCard (CCNum) VALUES (‘5555-55-444-44-4444’)”MyConn.Execute
“INSERT Shipping (Address) VALUES(‘Paris,France’)”IF WEEKDAYNAME(WEEKDAY(DATE))=
”Sunday” THENMyConn.RollBackTrans
ELSE
MyConn.CommitTrans
END IF
MyConn.Close
%>
在这个例子中,使用了RollBackTrans方法,如果是星期天,就取消事务处理所做的操作。在星期天两个表都不能被更新。
总结
这一章介绍了Activex数据对象。第一节是ADO的概述。在第二节,你学会了如何配置服务器以使用ADO。最后,向你介绍了最重要的ADO对象之一:连接对象。