使用连接对象

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

- adCMDTable。被执行的字符串包含一个表的名字。

- adCMDText。被执行的字符串包含一个命令文本。

- adCMDStoredProc。被执行的字符串包含一个存储过程名。

- adCMDUnknown。不指定字符串的内容。（这是缺省值。）

在你能够在一个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对象之一：连接对象。