ADO对象的基础与应用
11-1 ADO对象的结构
11-2 Connection对象
11-3 Rrcordset对象的基础
11-4 ADO对象与ODBC的应用
11-5 Error对象
11-1 ADO对象的结构
既然ODBC如此方便,那么为什么又要推出新的OLE DB结构呢?ODBC对于SQL的存取使用了C语言接口,而OLE DB则是为COM (Component Object Model)而设计的。因此,对于用户而言,采用OLE DB将会比ODBC的存取效率更高,这就是ASP要构建于OLE DB之上的原因。
11-1-1 ADO对象
· 面向对象的程序设计概念让程序的编写以模块化方式进行。如此会使程序更有效率,也会因为模块化设计的因素而使得维护工作变得比较容易。
· 数据库的存取将趋于一致性。
· ADO可以省去不少时间而去学习各种不同的SQL系统。
· ADO可以将看起来复杂的数据库系统的连接、维护工作变成一件相当容易的事。
11-1-2 ADO的结构
要创建一个Recordset,必须提供详细的用户识别码、连接密码及想要查询的条件,这样才可以顺利连接到相应的数据库去进行数据的存取操作。例如,用户要从数据库服务器上取得数据,首先必须经过用户帐号及密码的确认,确认无误后才可进一步取得和数据库的连接,这种状态会一直持续到应用程序结束为止。假如用户在任何时候想使用Recordset对象连接到数据库,必须遵照前面连接到数据库的操作。
在ADO结构之下,提供了几种对象供程序设计人员应用。它们分别是:
· Connection对象
· Recordset对象
· Command对象
· Error对象
· Connection对象
<% Set OBJConn=Server.CreateObject(“ADODB.connection”)%>
在这条语句执行之后,实际上尚未连接到任何数据库系统,只能说完成数据库连接前的定义工作,下面将介绍如何连接到数据库系统。
11-2 Connection对象
<% Set OBJConn=Server.CreateObject (“ADODB.connection”)%>
在这个实例执行之后,实际上并未连接到任何数据库系统,只是完成数据库连接前的声明操作,下面主要介绍如何连接到数据库。
11-2-1 连接、打开数据库的方法
OBJConn.open ConnectionString, UserID, Password
其中ConnnectionString代表一个数据源(Data Source Name,DSN),UserID代表数据库系统授权连接的用户名,Password代表该用户的连接密码,至于数据源请参考ODBC说明。
假设系统已经安装了MS SQL Server 2000,则可以用以下的范例来连接数据库:
<%
Set OBJConn=Server.CreateObject(“ADODB.Connection”)
OBJConn.open “Trade”, “test” , “test1”
%>
在此范例中,使用上一章创建的“Trade”数据源。
范例程序:EX11-01.asp
程序内容
01: <!-- EX11-01.asp 与SQL Server 建立连接 -->
02: <HTML>
03: <HEAD>
04: <
05: <TITLE>EX11-01.asp 与SQL Server 建立连接</TITLE>
06: </HEAD>
07: <BODY>
08: <%
09: On Error Resume Next
10: TableName = "产品基本信息"
11: Set OBJConn = Server.CreateObject("ADODB.Connection")
12: OBJConn.open "Trade", "test" , "test1"
13: if OBJConn.State = 1 then
14: Response.Write "OBJConn 与数据库连接成功"
15: OBJConn.Close
16: else
17: Response.Write "OBJConn 对象的执行过程产生错误!"
18: end if
19: Set OBJConn = Nothing
20: %>
21: </BODY>
22: </HTML>
程序说明
第11行:使用Server.CreateObject方法创建一个Connection对象,并赋给名为OBJConn的对象变量。
第12行:使用OBJConn变量的打开属性,打开名为“Trade”的ODBC系统数据源,同时在打开的过程中,使用的登录ID为“Test”,密码为“test1”。
第13行:若帐号或密码错误,OBJConn变量的状态值将会返回“0”。正常连接时,状态值将会返回“1”。
第14行:若返回的值为“1”,显示“OBJConn与数据库连接成功”的信息。
第15行:关闭OBJConn所打开的连接通道。
第17行:若返回的状态值为“0”,显示“OBJConn变量的执行过程产生错误!”的信息。
第19行:将自定义的OBJConn变量释放。
11-2-2 直接使用ADO与SQL连接
<%
Set OBJConn = Server.CreateObject ("ADODB.Connection")
OBJConn.Open "Driver={SQL Server};Database=数据库名称; Server=服务器IP;UID=帐号;PWD=密码"
%>
11-2-3 直接与Access MDB连接
程序内容
<%
Connection.Open "driver={Microsoft Access Driver (*.mdb)};” &_
“dbq=e:\PWS\PWS.mdb"
%>
或是
<%
Connection.Open "driver={microsoft access driver (*.mdb)};” &_
“dbq="& server.mappath("pws.mdb")
%>
上述范例的第二种方法使用“server .mappath("pws.mdb")”打开数据库,此方法可将Access数据库直接放在网站的ASP执行目录中存取。因其不使用ODBC就可打开数据库,因此适用于免费网站。此种方法也有助于隐藏ODBC的连接,不易被窃取ODBC的路径信息。
11-3 Recordset对象的基础
Recordset对象的属性如表11-1所示。
表11-1 Recordest对象的属性说明
属 性 |
说 明 |
AbsolutePage |
设置当前记录所在位置是第几页 |
AbsolutePosition |
设置记录集对象所在位置是第几条记录 |
ActiveConnection |
设置记录集属于哪一个Connection对象 |
BOF |
检验当前记录集对象所指位置是否在第一条记录之前,若成立,则返回True,否则返回False |
续表
属 性 |
说 明 |
EOF |
检验当前记录集对象所指位置是否在最后一条记录之后。若成立,则返回True,否则返回False |
CacheSize |
设置记录集对象在内存中缓存的记录数 |
Cousor |
设置记录集对象的光标类型,共分为四种,分别为Dynamic,Static,Forward-only,Keyset |
EditMode |
指定当前是否处于编辑模式 |
LockType |
在记录集的当前位置锁定记录 |
PageSize |
设置记录集对象一页所容纳的记录数 |
PageCount |
显示记录集当前的页面总数 |
Recordset对象的方法如表11-2所示。
表11-2 Recordset对象的方法
方 法 |
说 明 |
AddNew |
添加一条空白记录 |
CancelBatch |
取消一个批处理更新操作 |
CancelUpdate |
取消已存在的和新的记录所做的任何改变 |
Close |
关闭打开的记录集 |
GetRows |
取得记录集的多条记录 |
Movefirst |
将RS记录集对象的指针移至记录集对象中最顶端的记录 |
Moveprevious |
将RS记录集对象的指针向上移动一条 |
Movenext |
将RS记录集对象的指针向下移动一条 |
Movelast |
将RS记录集对象的指针移至记录集对象中最底端的记录 |
Open |
打开一个记录集 |
Requery |
重新执行查询 |
Update |
向数据库提交对一条记录的改变或添加 |
Fields.count |
显示该记录集对象内所含有的字段数 |
Recordset对象可以创建一个记录集合,并且将所需的记录从表中取出,同时,使用虚拟表格的方式,每一行为一条记录,每一列则代表一个字段,提供给ASP程序处理,如下所示。
分类编号 |
产品代号 |
产品名称 |
产品简述 | |
记录指针 |
0001000001 |
LA-Gear Mouse PAD |
MODEL No. TMP – 0312 | |
55 |
0001000002 |
LA-Gear Mouse PAD 1 |
MODEL No. TMP – 04 |
· Recordset中的记录指针具有游标类型(CursorType)。不同的游标类型,可对记录集进行不同的操作,默认值为0,代表记录指针只能向前移动记录集,也可定义成其他值,允许记录指针在记录集中上下移动。
· 数据源本身具有锁定的能力(LockType)。具有这项功能最主要的目的在于避免两个SQL Query操作同时写同一条记录。
· 当前记录指针的位置:Recordset的MoveFirst方法可以将记录指针移到第一条记录的位置,MoveLast方法可将记录指针移到记录集合的最后一条,MoveNext方法可使指针移到下一条,MovePrevious方法则是移到上一条。
Recordset对象在使用前同样需要使用Connection对象建立数据库的连接,其步骤如下所示:
(1)创建Connection对象,打开数据源。
首先需要创建一个Connection对象,并保存在OBJConn变量中,然后打开数据源,程序代码如下所示:
Set OBJConn = Server.CreateObject("ADODB.Connection")
OBJConn.Open strDSN ' 打开数据源
(2)创建Recordset对象。
在取得与数据库的连接之后,接着即可创建Recordset对象,其程序代码如下所示:
Set Rs = OBJConn.Execute( SQLstr )
(3)打开Recordset取得数据。
在Recordset对象创建完成之后,即可打开Recordset对象的内容。此Recordset对象的内容可以是表、SQL查询语句,如果是表,其命令如下所示:
Rs.Open "产品基本信息", OBJConn, adOpenStatic, adLockReadOnly, adCmdTable
或是
Set Rs = OBJConn.Exceute(CommandText, RecordsAffected, Options)
上述程序代码使用Recordset对象Rs的Open方法打开“产品基本信息”表,第二个参数为Connection对象OBJConn,后面三个参数为定义在文件adovbs.inc中的常数,定义Recordset对象的存取方式。
(4)处理Recordset对象的记录。
在打开Recordset对象的记录集合之后,即可开始使用Recordset对象的属性及方法,进行表的操作或取得当前的状态。例如:取得Recordset对象的状态属性State,如下所示:
If Rs.State = 1 Then
Response.Write("<b>Rs 对象目前处于打开的状态</b><br>")
Else
Response.Write("<b>Rs 对象目前处于关闭的状态</b><br>")
End If
上述程序代码是利用“If...Then...Else”语句的方式,检查状态属性State,查看当前Recordset对象的打开状态。如果返回值为“1”,则代表状态已打开,返回值为“0”则代表状态已关闭。
(5)关闭Recordset对象。
Rs.Close
Set Rs = Nothing
在执行上述程序代码之后,将会关闭Recordset对象,并且由“Set Rs = Nothing”释放Recordset对象。
(6)关闭与数据库的连接。
最后关闭数据库连接,OBJConn.Close(Connection对象的Close方法),如下所示:
OBJCConn.Close
set OBJConn = Nothing
范例程序:EX11-02.asp
Set Rs=OBJConn.execute(“Select 产品代号, 产品名称 from 产品基本信息”)
程序内容
01: <!-- EX11-02.asp Recordset 执行范例 -->
02: <HTML>
03: <HEAD>
04: <
05: <TITLE>EX11-02.asp Recordset 执行范例</TITLE>
06: </HEAD>
07: <BODY>
08: <Table Border=1>
09: <%
10: On Error Resume Next
11: TableName = "产品基本信息"
12: Set OBJConn = Server.CreateObject("ADODB.Connection")
13: strDSN = "DSN=Trade;uid=test;pwd=test1"
14: OBJConn.Open strDSN
15: SQLstr = "Select 产品代号, 产品名称 from " & TableName
16: Set Rs = OBJConn.Execute (SQLstr)
17: Response.Write "<TR>"
18: For I = 0 To Rs.Fields.Count -1
19: Response.Write("<TD Align=Center><B>" & Rs(I).Name & "</B></TD>")
20: Next
21: Response.Write "</TR>"
22: if Not Rs.Eof then
23: Rs.MoveFirst
24: Do While Not Rs.Eof
25: Response.Write "<TR>"
26: For I=0 to Rs.Fields.Count -1
27: Response.Write "<Td>" & Rs(I) & "</TD>"
28: Next
29: Response.Write "</TR>"
30: Rs.MoveNext
31: Loop
32: else
33: Response.Write "没有相符的信息可供读取!"
34: end if
35: OBJConn.Close
36: Set Rs = Nothing
37: Set OBJConn = Nothing
38: %>
39: </Table>
40: </BODY>
41: </HTML>
程序说明
第15行:设置希望执行的SQL Query变量。
第18~20行:取得字段的名称
第22行:如果Recordset对象当前记录指针的位置不是在文件尾,即可使用Rs.MoveNext方法逐条移动记录指针。因此,在判断记录指针是否到达文件尾时,可以参考以下的设置信息。
表11-3 EOF与BOF属性
属 性 |
功 能 简 述 |
BOF |
只读属性,当前指针是否在记录集合的开头,即第一条记录之前 |
EOF |
只读属性,当前的指针是否在记录集合的最后,即最后一条记录之后 |
第24~31行:利用“Do...Loop”语句作为Recordset对象的有效记录集合范围控制。
第26~28行:利用“For...Next”循环语句,将记录集合中的各个字段内容显示出来。
第30行:将有效的记录指针向下移一条记录。
第35~37行:关闭与数据库的连接,同时释放Rs,OBJConn变量。
11-3-1 取得字段名称与内容
Fields对象属于Recordset对象的Fields数据集合,其可以在ASP程序中取得字段的信息。常用属性如表11-4所示:
表11-4 Fields的常用属性
属 性 |
功 能 简 述 |
Count |
取得当前Recordset对象记录集合中的字段数量 |
Name |
取得当前Recordset对象记录集合中的字段名称 |
Value |
取得当前Recordset对象记录集合中的字段内容 |
Type |
取得当前Recordset对象记录集合中,字段的数据类型 |
如果需要取得当前Recordset对象记录集合中的字段数量,可以采用如下的程序代码取得:
FieldCount = Rs.Fields.Count
在上述程序代码执行之后,将会取得当前Recordset对象记录集合中的字段数量。在取得字段数量之后,即可根据索引来取得字段的名称、数据类型、长度等信息。程序代码如下所示:
Rs.Fields(I).Name
Rs.Fields(I).Value
Rs.Fields(I).Type
Rs.Fields(I).Attributes
Rs.Fields(I).DefinedSize
上述程序的索引变量I是从“0”开始,增量为“1”,持续累加直到I为“FieldCount - 1”为止,依次取得字段的相关信息。
范例程序:EX11-03.asp
用ASP程序所创建的Recordset对象,打开“产品基本信息”表,以HTML表格形式,将表字段名称、内容以及数据类型,逐项显示在浏览器上。
字段的“数据类型”,但是这些数据类型全部都以数字形式表示,到底这些数字代表什么意义,请参考表11-5即可得知。
表11-5 数据类型
数据类型 |
SQL Server 2000 的数据类型 |
200 |
varchar(可变长度字符数据类型) |
131 |
decimal(固定精度和小数位的数字数据) |
129 |
Char(固定长度字符数据类型) |
11 |
Bit(1或0的整数数据) |
程序内容
01: <!-- EX11-03.asp 取得字段详细信息 -->
02: <HTML>
03: <HEAD>
04: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
05: <TITLE>EX11-03.asp 取得字段详细信息</TITLE>
06: </HEAD>
07: <BODY>
08: <Table Border=1>
09: <%
10: ' On Error Resume Next
11: TableName = "产品基本信息"
12: Set OBJConn = Server.CreateObject("ADODB.Connection")
13: strDSN = "DSN=Trade;uid=test;pwd=test1"
14: OBJConn.Open strDSN
15: SQLstr = "Select * from " & TableName
16: Set Rs = OBJConn.Execute (SQLstr)
17: if Not Rs.Eof then
18: Rs.MoveFirst
19: FdCount = Rs.Fields.Count
20: Response.Write "<Tr><Td Colspan=2>字段总数</Td><Td Colspan=2>" & FDCount & "</Td></Tr>"
21: Response.Write "<Tr>"
22: Response.Write "<Td>字段索引</Td><Td>字段名称</Td>"
23: Response.Write "<Td>字段内容</Td><Td>数据类型</Td>"
24: Response.Write "<Td>字段属性</Td><Td>定义长度</Td>"
25: Response.Write "<Td>实际内容长度</Td>"
26: Response.Write "</Tr>"
27: For I = 0 to FdCount - 1
28: Response.Write "<TR>"
29: Response.Write "<Td>" & I & "</Td>"
30: Response.Write "<Td>" & Rs.Fields(i).Name & "</Td>"
31: Response.Write "<Td>" & Rs.Fields(i).Value & "</Td>"
32: Response.Write "<Td>" & Rs.Fields(i).Type & "</Td>"
33: Response.Write "<Td>" & Rs.Fields(i).Attributes & "</Td>"
34: Response.Write "<Td>" & Rs.Fields(i).DefinedSize & "</Td>"
35: Response.Write "<Td>" & Rs.Fields(i).ActualSize & "</Td>"
36: Response.Write "</TR>"
37: next
38: else
39: Response.Write "没有相符的信息可供读取!"
40: end if
41: OBJConn.Close
42: Set Rs = Nothing
43: Set OBJConn = Nothing
44: %>
45: </Table>
46: </BODY>
47: </HTML>
程序说明
第15行:产生希望执行的SQL Query内容。
第18行:将记录指针移到第一条记录。
第19行:设置变量FdCount为“Rs.Fields.Count”字段总数量。
第20行:显示“产品基本信息”表中字段的总数。
第30行:显示字段的名称。
第31行:显示字段的内容。
第32行:显示字段的数据类型。
第33行:显示字段的属性。
第34行:显示字段定义的长度。
第35行:显示字段的实际内容长度。
11-3-2 取得、移动记录指针
在Recordset对象取得指定的记录之后,通常需要将记录指针移到相应记录上,也就是说,将表的记录指针移到指定的记录上。Recordset对象的相关方法如下所示。
表11-6 方法
方 法 |
功 能 简 述 |
MoveFirst |
将记录指针移到第一条记录 |
MoveLast |
将记录指针移到最后一条记录 |
MoveNext |
将记录指针移到下一条记录 |
MovePrevious |
将记录指针移到上一条记录 |
在上述属于Recordset对象的记录浏览方法上,可以根据不同的CursorType值从而支持不同的方法,这些方法如下所示。
表11-7 不同的值支持不同的方法
CursorType参数 |
可供使用的方法 |
adForwardOnly |
只适用于MoveFirst以及MoveNext方法 |
adOpenStatic |
支持Recordset对象所有的方法 |
当然,除了记录的浏览方法之外,Recordset对象还提供如表11-8所示的属性。
表11-8 Recordset对象的属性
属 性 |
功 能 描 述 |
RecordCount |
这是一个只读的属性,用以返回符合查询条件的记录总数 |
AbsolutePosition |
在数值1到RecordCount之间,指定记录指针的位置,如果这个数值为负,则以“adPosUnkonwn”表示,代表没有符合的记录可供读取 |
上表所示的AbsolutePosition属性可以使用在CursorType的adOpenStatic参数上。对于adForwardOnly参数,它并不支持AbsolutePosition属性。
在Recordset对象的数据集合产生之后,用户就可使用Recordset对象所提供的四种方法,在与查询条件相符的记录中,自由地移动记录指针。
程序范例:Ch11-04.asp
使用Recordset对象取得相符的数据后,用Recordset对象的方法在相符的记录集合中,移动记录指针。
程序内容
01: <!-- EX11-04.asp 记录指针移动范例 -->
02: <HTML>
03: <HEAD>
04: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
05: <TITLE>EX11-04.asp 记录指针移动范例</TITLE>
06: </HEAD>
07: <BODY>
08: <Table Border=1>
09: <%
10: On Error Resume Next
11: TableName = "产品基本信息"
12: strDSN = "DSN=Trade;uid=test;pwd=test1"
13: Set OBJConn = Server.CreateObject("ADODB.Connection")
14: OBJConn.Open strDSN
16: Set Rs = Server.CreateObject("ADODB.RecordSet")
17: RS.Open "产品基本信息",OBJConn, adOpenStatic
19: if Not Rs.Eof then
20: Response.Write "<Tr>"
21: Response.Write "<Td>产品代号</Td><Td>目前状态</Td>"
22: Response.Write "</Tr>"
24: Rs.MoveFirst
25: Response.Write "<Tr>"
26: Response.Write "<Td>" & Rs("产品代号") & "</Td>"
27: Response.Write "<Td>第一条</Td></Tr>"
29: Rs.MoveNext
30: Response.Write "<Tr>"
31: Response.Write "<Td>" & Rs("产品代号") & "</Td>"
32: Response.Write "<Td>下一条</Td></Tr>"
34: else
35: Response.Write "没有相符的信息可供读取!"
36: end if
37: OBJConn.Close
38: Set Rs = Nothing
39: Set OBJConn = Nothing
40: %>
41: </Table>
42: </BODY>
43: </HTML>
程序说明
第24行:将当前的记录指针移动到第一条相符的记录上,第26行显示该记录的产品代号。
第29行:将当前的记录指针移动到下一条相符的记录上,第31行显示该记录的产品代号。
11-3-3 Field对象
Recordset本质上是由字段构成的,而字段本身有一些属性(Attribute)的设置,例如字段的大小、数据存放格式、字段名称、字段的外框属性、字段内所存储的内容等。用户可以使用Field对象(字段对象)来取得每一个字段内的数据,例如:
范例程序:EX11-05.asp
如果用户希望从数据库中读取特定的记录内容,可使用以下所示的程序代码,将与条件相符的记录内容显示在浏览器上。
程序内容
01: <!-- EX11-05.asp 取得字段的详细内容 -->
02: <HTML>
03: <HEAD>
04: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
05: <TITLE>EX11-05.asp 取得字段的详细内容</TITLE>
06: </HEAD>
07: <BODY>
08: <Table Border=1>
09: <%
10: ' On Error Resume Next
11: TableName = "产品基本信息"
12: Set OBJConn = Server.CreateObject("ADODB.Connection")
13: strDSN = "DSN=Trade;uid=test;pwd=test1"
14: OBJConn.Open strDSN
15: strSQL = "Select * from " & TableName
16: Set Rs = OBJConn.Execute (strSQL)
18: if Not Rs.Eof then
19: Rs.MoveFirst
20: FdCount = Rs.Fields.Count
21: Response.Write "<TR>"
22: For I = 0 to FdCount - 1
23: Response.Write "<Td><Font Size=2>" & Rs.Fields(i).Name & "</Font></Td>"
24: next
25: Response.Write "</TR>"
26: Do While Not Rs.Eof
27: Response.Write "<Tr>"
28: For I = 0 to FdCount - 1
29: Response.Write "<Td><Font Size=2>" & Rs.Fields(i).Value & "</Font></Td>"
30: Next
31: Response.Write "</Tr>"
32: Rs.MoveNext
33: Loop
34: else
35: Response.Write "没有相符的信息可供读取!"
36: end if
37: OBJConn.Close
38: Set Rs = Nothing
39: Set OBJConn = Nothing
40: %>
41: </Table>
42: </BODY>
43: </HTML>
程序说明
第20行:将Recordset对象查询的字段总数赋予FdCount变量。
第22~24行:以表格形式显示字段的名称。
第26~33行:在符合查询条件的记录范围内,逐条移动记录指针。
第28~30行:用“For...Next”循环语句将每一条记录内的各字段内容以表格形式显示出来。
前面所讨论的Recordset对象是由一条以上的记录所组合而成的,对于EX11-05.asp,说明了如何从字段的角度出发,取得记录中每一个字段的值。如果要取得其他记录的值,应如何处理呢?用户可以想象由ADO所创建出来的所有Recordset对象均可以视为一个游标类型,用户可以任意地向上或向下移动到希望的记录位置上。ADO支持四种游标类型,分别为Dynamic、Static、Keyset、Forward-only。
Dynamic:这是最常使用并且功能最为齐全的游标类型,用户可以任意移动记录指针,也可以进行记录的更新及删除,值得注意的是这里所做的任何记录修改均可由其他人读取。
Keyset的功能有点类似Dynamic,但是所做的任何记录修改均无法由其他人读取。
Static游标类型提供只读功能,不能修改任何数据。
Forward-only游标类型也是提供只读功能,而且只能单方向移动指针。
默认的游标类型为Forward-only,这正好符合大多数网页的需求。一般而言,从数据库服务器取得数据后,再把这些数据显示出来,在这段时间,用户不会将记录中的数据更新回存到数据库。如果从网页上读取数据,并且将数据回存到数据库,通常也不会去参考以前从数据库上获得的记录。在游标类型中,Forward-only使用较少的资源,是四种类型中效率最高的。若有特殊要求,读者也可以将游标类型改为Dynamic。
11-4 ADO对象与数据库的应用
在上一节中,虽然笔者应用了许多以ADO对象读取数据库的内容范例程序,但大多都以简单的说明带过。为了让读者对ADO对象在数据库的应用方面有更进一步的认识,同时也可以更熟悉数据库中有关记录的处理,在本节中,将在数据库记录的添加、删除、更新等方面,提供更多的范例与说明,同时,将会为用户示范更多有关SQL语句的操作。
11-4-1 添加记录
如果用户希望在数据库特定表中添加一条记录,则必须使用INSERT语句,以下是INSERT语句的语法:
INSERT INTO 表名 [(字段名称1 [, 字段名称2[, ...]])]
VALUES (数据1 [, 数据2 [, ...]])
在使用INSERT添加数据时必须注意以下几点:
· 表名后面括号内字段名称的排列顺序与VALUES后面括号内数据的排列顺序必须一致。否则进行数据添加时会发生添加失败。
· 未设置的字段,添加数据时其默认值为Null。
· 添加的一条数据记录,在建立时就给予其默认值,而值是Null。
范例程序:EX11-06.asp
以下的这个范例是对“产品基本信息”表中添加一条记录的范例程序。
当用户输入必要的信息后单击“确定新增”按钮后,用户就会见到如上图所示已经增加了一条记录到表中,而上述执行的程序代码如下所述:
程序内容
01: <!-- EX11-06.asp 新增一条类别信息 -->
02: <%
03: sTrDSN = "DSN=Trade;uid=test;pwd=test1"
04: %>
05: <HTML>
06: <HEAD>
07: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
08: <TITLE>EX11-06.asp 新增一条类别信息</TITLE>
09: </HEAD>
10: <BODY>
11: <%
12: If Request.Form("Submit") <> "确定新增" Then
13: MainScreen
14: Else
15: InsertQuery
16: end if
17: %>
18: </BODY>
19: </HTML>
21: <% Function MainScreen %>
22: <form method='post' id=form1 name=form1>
23: <table Border=1 align="center">
24: <Tr><Td colspan="2">新增分类</Td></Tr>
25: <Tr>
26: <Td>类别编号</Td>
27: <Td>类别名称</Td>
28: </Tr>
29: <Tr>
30: <Td><Input Type="text" Name="NewClassifyNo" Value="" Si-ze="10" Maxlength=4></Td>
31: Td><Input Type="text" Name="NewClassifyInfo" Value="" Si-ze="40"></Td>
32: </Tr>
33: <Tr>
34: <Td Colspan="2"><Input type="Submit" Name="Submit" Val-ue="确定新增"></Td></Tr>
36: </Table>
37: </form>
38: <% End Function %>
40: <%
41: Function InsertQuery
42: TableName = "产品类别"
43: Set OBJConn = Server.CreateObject("ADODB.Connection")
44: strDSN = "DSN=Trade;uid=test;pwd=test1"
45: OBJConn.Open strDSN
46: strSQL = "Insert Into " & TableName & " Values(" & _
47: "'" & Request.Form("NewClassifyNo") & "'," & _
48: "'" & Request.Form("NewClassifyInfo") & "')"
49: Set Rs = OBJConn.Execute ( strSQL )
50: strSQL = "Select * From " & TableName
51: Set Rs = OBJConn.Execute ( strSQL )
52: Response.Write "SQL Query 的内容:" &strSQL
53: if Not Rs.Eof then
54: Response.Write "<Table Border=1>"
55: Rs.MoveFirst
56: FdCount = Rs.Fields.Count
57: Response.Write "<TR>"
58: For I = 0 to FdCount - 1
59: Response.Write "<Td><Font Size=2>" & Rs.Fields(i).Name & "</Font></Td>"
60: next
61: Response.Write "</TR>"
62: Do While Not Rs.Eof
63: Response.Write "<Tr>"
64: For I = 0 to FdCount - 1
65: Response.Write "<Td><Font Size=2>" & Rs.Fields(i).Value & "</Font></Td>"
66: Next
67: Response.Write "</Tr>"
68: Rs.MoveNext
69: Loop
70: Response.Write "</Table>"
71: else
72: Response.Write "没有相符的信息可供读取!"
73: end if
74: OBJConn.Close
75: Set Rs = Nothing
76: Set OBJConn = Nothing
77: End Function
78: %>
程序说明
第11~17行:利用Request.Form(“Submit”),检查“确定新增”按钮是否被按下。如果Request.Form(“Submit”)的值不是“确定新增”,则执行自定义函数“MainScreen”。如果按下了“确定新增”则执行自定义函数“InserQuery”。
第21~38行:HTML文件的输入窗体部分。
第40~78行:自定义函数“InsertQuery”。这是用来将刚才输入的文字作为SQL语句的数据来源,同时对表添加一条记录之后,将表中的所有记录显示在浏览器上,以便验证是否确实将数据添加到表中。
第46行:将窗体中输入的数据加入SQL语句,赋予变量。
第56~60行:在浏览器上输出字段的名称。
第62~69行:将Recordset对象的记录集合输出到浏览器上。
11-4-2 记录的更新
在数据库的操作上,可分为“添加”、“修改”、“删除”及“读取”等。在了解了“添加”及“读取”操作后,接下来要为用户解说如何更新表中的记录。
上面已经介绍过如何连接数据库并读取数据库中的记录,但是要更新数据库中的记录应如何处理呢?游标类型应设置成Dynamic,更新数据使用UPDATE语句,基本语法如下:
UPDATE 表名
SET 字段1=数据1, 字段2=数据2,…
WHERE 语句
对于更新操作而言,可分为几个部分。
· 所有记录全部更新:可以对表所有的记录同时进行内容的更新。
· 不更新索引键值而只更新其他字段的内容:仅仅更新每一条记录内的非索引字段内容。
· 更新索引键值:必须连带地更新其他表中相关联的记录内容。
以下范例说明如何利用Update来更新数据库中的记录。
范例程序:EX11-07
这个范例程序主要用来更新刚添加记录的内容。本例共分为三部分:
(1)输入希望更新的类别编号。
(2)取出该类别编号的相关内容。
(3)对该记录进行更新。
接着笔者针对各种不同操作,分别加以说明。
范例程序:EX11-07A.asp
程序内容
01: <!-- EX11-07A.asp 更新类别信息的内容-输入类别编号 -->
02: <HTML>
03: <HEAD>
04: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
05: <TITLE>EX11-07A.asp 更新类别信息的内容-输入类别编号</TITLE>
06: </HEAD>
07: <BODY>
08: <Form method='post' id=form1 Name=”form1” Action="EX11-07B.asp">
09: <Table Border=1 align="center">
10: <Tr><Td colspan="2">更新类别编号</Td></Tr>
11: <Tr>
12: <Td>类别编号</Td>
13: <Td><Input Type="text" Name="ClassifyNo" Size="10" Max-length="4" Value=""></Td>
14: </Tr>
15: <Tr>
16: <Td Colspan="2"><Input type="Submit" Name="Submit" Val-ue="输入"></Td></Tr>
17: </Table>
18: </Form>
19: </BODY>
20: </HTML>
程序说明
第8行:设置当单击“输入”按钮后执行“EX11-07B.asp”。
范例程序:EX11-07B.asp
程序内容
01: <!-- EX11-07B.asp 更新类别信息的内容-取出类别信息 -->
02: <%
03: sTrDSN = "DSN=Trade;uid=test;pwd=test1"
04: TableName = "产品类别"
05: %>
06: <HTML>
07: <HEAD>
08: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
09: <TITLE>EX11-07B.asp 更新类别信息的内容-取出类别信息</TITLE>
10: </HEAD>
11: <BODY>
12: <%
13: Set OBJConn = Server.CreateObject("ADODB.Connection")
14: OBJConn.Open strDSN
15: strSQL = "Select * From " & TableName & " Where 类别编号='" & Request.Form("ClassifyNo") & "'"
16: Set Rs = OBJConn.Execute ( strSQL )
17: Response.Write "SQL Query 的内容:<BR><B><I>" & strSQL & "</I></B>"
18: If Not Rs.Eof Then
19: %>
20: <form method='post' id=form1 name=form1 Action="EX11-07C.asp">
21: <table Border=1 align="center">
22: <Tr><Td colspan="2">更新类别编号</Td></Tr>
23: <Tr>
24: <Td>类别编号</Td>
25: <Td><% = Rs.Fields("类别编号")%>
26: <Input Type=Hidden Name="ClassifyNo" Value="<% = Rs.Fields("类别编号")%>">
27: </Td>
28: </Tr>
29: <Tr>
30: <Td>类别名称</Td>
31: <Td>
32: <Input Type="text" Name="ClassifyName" Size="20" Value= "<% = Rs.Fields("类别名称")%>">
33: <Input Type="Hidden" Name="ClassifyNameOri" Size="20" Va-lue="<% = Rs.Fields("类别名称")%>">
34: </Td>
35: </Tr>
36: <Tr>
37: <Td Colspan="2"><Input type="Submit" Name="Submit" Value= "更新确认"></Td></Tr>
38: </Table>
39: </Form>
40: <%
41: Else
42: Response.Write "没有相符的信息可供读取!"
43: End If
44: OBJConn.Close
45: Set Rs = Nothing
47: Set OBJConn = Nothing
48: %>
49: </BODY>
50: </HTML>
程序说明
第3行:设置本次连接使用的DSN名称、帐号以及密码等信息。
第4行:设置本次连接的表名。
第13~14行:打开与数据库的连接。
第15~16行:设置取得特定类别相关信息的SQL Query内容并且执行SQL Query。
第17行:显示本次即将执行的SQL Query内容,最主要的目的在于检查即将执行的SQL Query内容是否正确。
第20行:设置在单击“更新确认”按钮之后,执行ASP程序“EX11-07C.asp”
第20~39行:显示所有“产品类别”各项字段的内容。
范例程序:EX11-07C.asp
执行SQL Query的结果显示。
程序内容
01: <!-- EX11-07C.asp 更新类别信息的内容-执行更新程序 -->
02: <%
03: sTrDSN = "DSN=Trade;uid=test;pwd=test1"
04: TableName = "产品类别"
05: %>
06: <HTML>
07: <HEAD>
08: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
09: <TITLE>EX11-07C.asp 更新类别信息的内容-执行更新程序</TITLE>
10: </HEAD>
11: <BODY>
12: <%
13: strSQL = "Update " & TableName & " Set 类别名称='" & _
14: Request.Form("ClassifyName") &"' " & _
15: " Where 类别编号='" & Request.Form("ClassifyNo") & "'"
16: %>
17: <Table Border=1>
18: <Tr>
19: <Td>编号</Td>
20: <Td><% = Request.Form("ClassifyNo") %></Td>
21: </Tr>
22: <Tr>
23: <Td>原始类别名称</Td>
24: <Td><% = Request.Form("ClassifyNameOri")%></Td>
25: </Tr>
26: <Tr>
27: <Td>更改后类别名称</Td>
28: <Td><% = Request.Form("ClassifyName")%></Td>
29: </Tr>
30: <Tr>
31: <Td Colspan="2">SQL Query 内容</Td>
32: </Tr>
33: <Tr>
34: <Td Colspan=2><% = strSQL %></Td>
35: </Tr>
36: </Table>
37: <%
38: Set OBJConn = Server.CreateObject("ADODB.Connection")
39: OBJConn.Open strDSN
40: Set Rs = OBJConn.Execute ( strSQL )
41: %>
42: </BODY>
43: </HTML>
程序说明
第3行:设置本次连接所使用的DSN名称、帐号以及密码等信息。
第4行:设置本次连接的表名。
第13行:设置更新程序所使用的SQL Query内容。
第38~40行:根据各项设置的信息,执行更新程序。
11-4-3 记录的删除
要在表中删除一条记录,必须使用DELETE语句,使用该语句必须特别注意,一旦数据被删除,将无法恢复。如果没有指定Where语句,将删除表中的所有记录。以下是DELETE语句的语法:
DELETE FROM 表名 WHERE 语句
范例程序:EX11-08A.asp
例如希望永久删除表中某一条类别编号时,则程序如下所示:
程序内容
01: <!-- EX11-08A.asp 删除类别信息的内容-输入类别编号 -->
02: <HTML>
03: <HEAD>
04: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
05: <TITLE>EX11-08A.asp 删除类别信息的内容-输入类别编号</TITLE>
06: </HEAD>
07: <BODY>
08: <Form method='post' id=form1 Name=form1 Action="EX11-08B.asp">
09: <Table Border=1 align="center">
10: <Tr><Td colspan="2">删除类别编号</Td></Tr>
11: <Tr>
12: <Td>类别编号</Td>
13: <Td><Input Type="text" Name="ClassifyNo" Size="10" Maxle-ngth="4" Value=""></Td>
14: </Tr>
15: <Tr>
16: <Td Colspan="2"><Input type="Submit" Name="Submit" Value= "删除"></Td></Tr>
17: </Table>
18: </Form>
19: </BODY>
20: </HTML>
程序说明
第8行:设置当单击“删除”按钮之后,执行“EX11-08B.asp”。
范例程序:EX11-08B.asp
这个范例程序的作用在于接收EX11-08A.asp文件所传送过来的类别编号信息,并且从数据库中读取相关的信息,并且显示出来。
程序内容
01: <!-- EX11-08B.asp 删除类别信息的内容-取出类别信息 -->
02: <%
03: sTrDSN = "DSN=Trade;uid=test;pwd=test1"
04: TableName = "产品类别"
05: %>
06: <HTML>
07: <HEAD>
08: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
09: <TITLE>EX11-08B.asp 删除类别信息的内容-取出类别信息</TITLE>
10: </HEAD>
11: <BODY>
12: <%
13: Set OBJConn = Server.CreateObject("ADODB.Connection")
14: OBJConn.Open strDSN
15: strSQL = "Select * From " & TableName & " Where 类别编号='" & Request.Form("ClassifyNo") & "'"
16: Set Rs = OBJConn.Execute ( strSQL )
17: Response.Write "SQL Query 的内容:<BR><B><I>" & strSQL & "</I></B>"
18: If Not Rs.Eof Then
19: %>
20: <form method='post' id=form1 name=form1 Action="EX11-08C.asp">
21: <table Border=1 align="center">
22: <Tr><Td colspan="2">更新类别编号</Td></Tr>
23: <Tr>
24: <Td>类别编号</Td>
25: <Td><% = Rs.Fields("类别编号")%>
26: <Input Type=Hidden Name="ClassifyNo" Value="<% = Rs.Fie-lds("类别编号")%>">
27: </Td>
28: </Tr>
29: <Tr>
30: <Td>类别名称</Td>
31: <Td Width="200"><% = Rs.Fields("类别名称")%>
32: </Td>
33: </Tr>
34: <Tr>
35: <Td Colspan="2"><Input type="Submit" Name="Submit" Value= "删除确认"></Td></Tr>
36: </Table>
37: </Form>
38: <%
39: Else
40: Response.Write "没有相符的信息可供读取!"
41: End If
42: OBJConn.Close
43: Set Rs = Nothing
44: Set OBJConn = Nothing
45: %>
46:
47: </BODY>
48: </HTML>
程序说明
第3行:设置本次连接所使用的DSN名称、帐号以及密码等信息。
第4行:设置本次连接的表名。
第13~14行:打开与数据库的连接。
第15~16行:设置取得特定类别相关信息的SQL Query内容并执行SQL Query。
第17行:显示本次读取表内容的SQL Query详细内容,最主要的目的在于检查即将执行的SQL Query内容是否正确。
第20行:设置在单击“删除确认”按钮后,执行“EX11-08C.asp”。
第20~37行:显示所有“产品类别”各项字段的内容。
范例程序:EX11-08B.asp
执行删除“产品类别”表中特定的类别编号。
程序内容
01: <!-- EX11-08C.asp 删除类别信息的内容-执行更新程序 -->
02: <%
03: sTrDSN = "DSN=Trade;uid=test;pwd=test1"
04: TableName = "产品类别"
05: %>
06: <HTML>
07: <HEAD>
08: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
09: <TITLE>EX11-08C.asp 删除类别信息的内容-执行更新程序</TITLE>
10: </HEAD>
11: <BODY>
12: <%
13: strSQL = "Delete From" & TableName & " Where 类别编号='" & _
14: Request.Form("ClassifyNo") & "'"
15: Response.Write "SQL Query 内容:<Br><B>" & strSQL & "</B>"
16: Set OBJConn = Server.CreateObject("ADODB.Connection")
17: OBJConn.Open strDSN
18: Set Rs = OBJConn.Execute ( strSQL )
19: OBJConn.Close
20: Set Rs = Nothing
21: Set OBJConn = Nothing
22: %>
23: 类别编号:<% = Request.Form("ClassifyNo") %> 已经删除完毕
24: </BODY>
25: </HTML>
程序说明
第3行:设置本次连接所使用的DSN名称、帐号以及密码等信息。
第4行:设置本次连接的表名。
第13行:设置删除程序所使用的SQL Query内容。
第16~18行:设置SQL Query的内容,打开与数据库的连接,并执行删除程序。
11-5 Error对象
Connection对象中有一个搜集错误信息的组件,那就是Error对象。在这个对象中有一个count属性,它专门搜集ADO运行过程中总共有多少个错误产生,而Clear方法则可将Error对象所搜集到的错误清除。
Error对象本身自己定义了一些错误信息,如错误的类型、错误描述等。用户也可以使用下列的方式掌握错误的处理原则。
范例程序:EX11-09A.asp
这个范例的主要目的在于指导读者如何取得数据库系统的错误信息。对于一般人而言,打错字是很常见的事,但是对于数据库系统而言,执行的SQL Query只要有一个错字,其结果往往无法正常执行。本范例的主要用意即为取得SQL Server的错误信息并且显示在浏览器上。
程序内容
01: <!-- EX11-09A.asp 查询类别信息的内容-输入类别编号 -->
02: <HTML>
03: <HEAD>
04: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
05: <TITLE>EX11-09A.asp 查询类别信息的内容-输入类别编号</TITLE>
06: </HEAD>
07: <BODY>
08: <Form method='post' id=form1 Name=form1 Action="EX11-09B.asp">
09: <Table Border=1 align="center">
10: <Tr><Td colspan="2">查询类别编号</Td></Tr>
11: <Tr>
12: <Td>类别编号</Td>
13: <Td><Input Type="text" Name="ClassifyNo" Size="10" Maxle-ngth="4" Value=""></Td>
14: </Tr>
15: <Tr>
16: <Td Colspan="2"><Input type="Submit" Name="Submit" Value= "送出查询"></Td></Tr>
17: </Table>
18: </Form>
19: </BODY>
20: </HTML>
程序说明
这只是一个简单的数据输入画面,主要用途在于提供给“EX11-09B.asp”在执行时的数据来源,因此笔者在此不多作说明。
范例程序:EX11-09A.asp
这个程序主要在于接收“EX11-09A.asp”所传送过来的“类别编号”,并且向SQL Server进行记录的查询。但是在输入SQL Query的过程中,却不慎将“Select”输入成“Selects”,造成SQL Server无法执行此SQL Query,并且将错误信息返回。
程序内容
01: <!-- EX11-09B.asp 删除类别信息的内容-取出类别信息 -->
02: <%
03: sTrDSN = "DSN=Trade;uid=test;pwd=test1"
04: TableName = "产品类别"
05: %>
06: <HTML>
07: <HEAD>
08: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
09: <TITLE></TITLE>
10: </HEAD>
11: <BODY>
12:
13: <%
14: On Error Resume Next
15: strSQL = "Selects * Froms " & TableName & " Where 类别编号='" & _
16: Request.Form("ClassifyNo") & "'"
17: Response.Write "SQL Query 内容:<Br><B>" & strSQL & "</B>"
18:
19: Set OBJConn = Server.CreateObject("ADODB.Connection")
20:
21: OBJConn.Open strDSN
22: OBJConn.Errors.Clear
23:
24: Set Rs = OBJConn.Execute ( strSQL )
25:
26: IF OBJConn.Errors.Count <> 0 then
27: Response.Write("<BR>Connection Errors Encountered:<BR>")
28: FOR j = 0 to OBJConn.Errors.Count -1
29: Response.Write( OBJConn.Errors(j).description & "<BR>")
30: NEXT
31: OBJConn.Errors.Clear
32: END IF
33: OBJConn.Close
34: Set Rs = Nothing
35: Set OBJConn = Nothing
36: %>
37:
38: </BODY>
39: </HTML>
程序说明
第15行:因为输入错误,将“Select”输入成“Selects”。
第22行:清除错误对象内的错误总数量。
第26行:如果在执行SQL Query的过程中产生错误,则“OBJConn.回Errors.Count”的数值将大于“0”。反之,如果一切正常,“OBJConn. Errors.Count”的数值将会等于“0”。
第28~30行:利用“For...Next”循环语句,将所有的错误信息输出到浏览器上。