打印本文 打印本文  关闭窗口 关闭窗口
ASP与SQL网站数据库程序设计(12)
作者:. 文章来源:科学出版社 点击数: 更新时间:2004/1/25 0:19:01

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: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

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 直接使用ADOSQL连接

<%

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

设置记录集对象的光标类型,共分为四种,分别为DynamicStaticForward-onlyKeyset

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程序处理,如下所示。

分类编号

产品代号

产品名称

产品简述

记录指针

55

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操作同时写同一条记录。

·         当前记录指针的位置:RecordsetMoveFirst方法可以将记录指针移到第一条记录的位置,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对象RsOpen方法打开“产品基本信息”表,第二个参数为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.CloseConnection对象的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: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

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  EOFBOF属性

   

功 能 简 述

BOF

只读属性,当前指针是否在记录集合的开头,即第一条记录之前

EOF

只读属性,当前的指针是否在记录集合的最后,即最后一条记录之后

24~31行:利用“Do...Loop”语句作为Recordset对象的有效记录集合范围控制。

26~28行:利用“For...Next”循环语句,将记录集合中的各个字段内容显示出来。

30行:将有效的记录指针向下移一条记录。

35~37行:关闭与数据库的连接,同时释放RsOBJConn变量。

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

Bit10的整数数据

程序内容

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

在数值1RecordCount之间,指定记录指针的位置,如果这个数值为负,则以“adPosUnkonwn”表示,代表没有符合的记录可供读取

上表所示的AbsolutePosition属性可以使用在CursorTypeadOpenStatic参数上。对于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支持四种游标类型,分别为DynamicStaticKeysetForward-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”循环语句,将所有的错误信息输出到浏览器上。



打印本文 打印本文  关闭窗口 关闭窗口