使用连接对象

与数据库的所通信都要通过一个打开的连接来进行。在对一个数据库进行数据的插入和读取之前,必须先打开与这个数据库的连接。这种打开和关闭一个连接的操作与打电话的过程有相似之处。在你能够与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\Common

Files\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,adCMDText

Response.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 table

MySQL=CREATE TABLE newtable (mycolumn VARCHAR(255))

MyConn.Execute MySQL

populate the table

MySQL=INSERT newtable (mycolumn) VALUES(hello)

MyConn.Execute MySQL

truncate the table

MySQL=TRUNCATE TABLE newtable

MyConn.Execute MySQL

drop the table

MySQL=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 THEN

MyConn.RollBackTrans

ELSE

MyConn.CommitTrans

END IF

MyConn.Close

%>

 

在这个例子中,使用了RollBackTrans方法,如果是星期天,就取消事务处理所做的操作。在星期天两个表都不能被更新。

 

 

总结

这一章介绍了Activex数据对象。第一节是ADO的概述。在第二节,你学会了如何配置服务器以使用ADO。最后,向你介绍了最重要的ADO对象之一:连接对象。