晕倒,论坛说一个帖子里总字数不能超过一定数字,ASP里关于数据库的连接部分就写这儿吧。 7.与Microsoft Access数据库建立连接
(ADActiveX Data Objects)。想得到字段大小 (如192 Bytes)用ADO中Field对象的ActualSize属性。
连接例一:Server对象的MapPath方法将指定的虚拟路径转换为真实的文件路径,下例的路径结果为C:\InetPub\asp\Northwind.mdb
<% @LANGUAGE = VBScript %><% Option Explicit
Dim Cnn, StrCnn
Set Cnn = Server.CreateObject("ADODB.Connection") '创建 Connection 对象
StrCnn="Driver={Microsoft Access Driver(*.mdb)};DBQ=" & Server.MapPath("\asp")&"\NorthWind.mdb;"
'DSNStatement = "DRIVER=Microsoft Access Driver (*.mdb);DBQ="&Server.MapPath("//my.mdb")
Cnn.Open StrCnn '使用 Connection 对象的 Open 方法打开数据库
Response.Write Server.MapPath("\asp") & "\NorthWind.mdb;" & "<br>"
Response.Write "数据库连接成功: " & Cnn.State & "<br>"
Cnn.close '使用 Connection 对象的 Close 方法关闭连接
Response.Write "数据库已经关闭: " & Cnn.State '输出数据库状态
Set Cnn = Nothing %> '将Connection 对象从内存中删除,以释放资源
连接例二:用OLE DB创建Microsoft Access连接,下面列出关键部分。
<% @LANGUAGE = VBScript %><% Option Explicit
Response.Expires=0 '必须写,确保数据不是缓存在客户端的数据, 而是服务器端随时更新过的最新数据
Dim Cnn, rsTest
Set Cnn = Server.CreateObject("ADODB.Connection") '第一部分: 建立连接
Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\Northwind.mdb"
'下面为第二部分: Connection 对象的 Execute 方法得到记录集
Set rsTest = Cnn.Execute("Select * From 运货商")%><HTML><BODY>
<% Do While Not rsTest.EOF '第三部分: 将得到的记录集显示到浏览器上
Response.Write rsTest("运货商ID") & "/" & rsTest("公司名称") & "/" & rsTest("电话") & "/"&"<BR>"
'此句结果同上:Response.Write rsTest(0)&"/" &rsTest(1) & "/" & rsTest(2) & "/" & "<BR>"
rsTest.MoveNext '移到下一条记录
Loop
Cnn.close: Set rsTest = Nothing: Set Cnn = Nothing %></BODY></HTML>
连接例三:通过创建 Recordset 对象(初学者只须掌握这方法)。
Dim Cnn, rsTest '第一部分: 建立连接
Set Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open "Provider = Microsoft.Jet.OLEDB.4.0; Data Source= C:\Northwind.mdb"
Set rsTest = Server.CreateObject("ADODB.Recordset") '第二部分:创建 RecordSet对象
rsTest.Open "运货商" '也可以用SQL语句:rsTest.open "SELECT * FROM 产品"
连接例四:第一部分的数据连接同例二.但要首先加入<!--#include file="adovbs.inc"-->语句(因为下面用了里面的几个常量,此文件电脑里都有,拷到当前目录下)
Dim rsTest '第二部分: 通过创建 RecordSet 对象得到记录集
Set rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.Open "运货商",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable%>
<HTML><BODY><% Do While Not rsTest.EOF '第三部分: 将得到的记录集显示到浏览器上
Response.Write rsTest(0) & "/" & rsTest(1) & "/" & rsTest(2) & "/" & "<BR>"
rsTest.MoveNext
Loop
rsTest.Close: Cnn.Close
Set rsTest = Nothing: Set Cnn = Nothing%></BODY></HTML>
分析语句:rsTest.Open "运货商",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable
第一个参数可以是表名,也可以是SQL语句。第二个参数指定当前的连接。
第三个参数指示CursorType,打开Recordset时使用的游标类型。
AdOpenForwardOnly:仅向前游标,默认值,只能在记录中向前滚动。可节省资源并提高性能。
AdOpenStatic:静态游标。可用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所作的添加、更改或删除不可见。 推荐在ASP中只使用这两种游标。
AdOpenKeyset:键集游标。与动态游标相似,不同的只是禁止查看其他用户添加的记录,并禁止访问其他用户删除的记录,其他用户所作的数据更改将依然可见。
AdOpenDynamic:动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进行所有类型的移动。
第四个参数指示LockType,打开Recordset时应该使用的锁定(并发)类型。这里指定为只读。
AdLockReadOnly:默认值,以只读方式打开记录集。
AdLockPessimistic:保守式记录锁定(逐条)。采用编辑时立即锁定数据源的记录的方式。此时,其他用户不能访问该数据。
AdLockOptimistic:开放式记录锁定(逐条)。只在调用 Update 方法时锁定记录。
AdLockBatchOptimistic:开放式批更新。用于成批更新数据,与UpdateBatch方法相对应。
第五个参数与第一个参数相关,第一个参数如为表名则第五个参数使用adCmdTable,第一个参数如为SQL语句则第该参数为adCmdText,如:
rsTest.Open "Select * From 运货商",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdText
这五个参数,也可以利用Recordset对象的属性来设置:
Dim rsTest '第二部分: 通过创建 RecordSet 对象得到记录集
Set rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.ActiveConnection = Cnn
rsTest.CursorType = adOpenForwardOnly
rsTest.LockType = adLockReadOnly
rsTest.Open "运货商", , , ,adCmdTable
连接例五:通过引入 Command 对象,连接数据库及显示数据同前。
Dim StrSQL, rsTest, cmdTest '第二部分: 通过创建 Command 对象得到记录集
Set cmdTest = Server.CreateObject("ADODB.Command") '创建 Command 对象
StrSQL = "SELECT * FROM 产品"
cmdTest.CommandText = StrSQL
cmdTest.CommandType = adCmdText '表明命令类型为 SQL 语句
Set cmdTest.ActiveConnection = Cnn
Set rsTest = cmdTest.Execute '使用 Command 对象的 Execute 方法得到记录集。
添加记录例一: 使用Recordset对象的Addnew方法
rsTest.open StrSQL,Conn,1,3
rsTest. AddNew '添加新记录,当然,数据的输入可以是通过htm表单提交到asp来
rsTest ("Item")=request("Item") 'rsTest ("Item")="Roae"
rsTest ("Name")=request("Name")
rsTest ("Size")=request("Size")
rsTest ("Weight")=request("Weight")
rsTest.update
rsTest.close: Cnn.close:set rsTest =nothing:set Cnn=nothing
response.redirect(request.servervariables("HTTP_REFERER"))'转回原调用asp的htm网页中
'rsTest.CursorType = adOpenKeySet或adOpenDynamic 第一句效果等同这三句
'rsTest.LockType = adLockOptimistic '更新一条数据可用这个参数,上面用adOpenKeySet即可
'rsTest.Open "运货商",Cnn,,,adCmdTable
添加记录例二:用Connection对象的Execute 添加新数据。使用SQL语句向Access数据库中添加数据时必须使用Insert Into,而向SQL Server数据库中添加数据,使用Insert就可以了。只有当游标类型设为adOpenKeyset或adOpenStatic时,才能使用RecordCount获取总记录数。如果数据库中没有任何数据,就无法使用MoveFirst方法,所以使用前先用rsTest.EOF属性判断数据库中是否有数据。
Dim StrSQL, rsTest
StrSQL = "INSERT INTO 运货商 (公司名称,电话) VALUES('wu feng','0571-7227298')"
Cnn.Execute StrSQL %>
<HTML><BODY><% '第三部分: 将得到的记录集显示到浏览器上
Set rsTest = Cnn.Execute("Select * From 运货商")
Do While Not rsTest.EOF…………
修改记录例一:如数据库是Access日期用#55-03-04#括起来;如是SQL Server日期要用'55-03-04'括起来。
Dim StrSQL, rsTest '第二部分: 使用 Connection 对象的 Execute 方法修改数据
StrSQL = "UPDATE 运货商 SET 电话 = '(503) 555-3188' WHERE 电话 LIKE '%99%'"
Cnn.Execute StrSQL '"LIKE"、"%"在模糊查询时经常用到,把电话号码改为(503) 555-3188。
修改记录例二:使用 Recordset 对象的 Update 方法。
StrSQL = "SELECT 姓氏,名字,出生日期 FROM 雇员 WHERE 出生日期 = #55-03-04#"
rsTest.Open StrSQL, Cnn,,,adCmdText
rsTest("名字") = "中文"
rsTest.Update '修改当前记录(符合条件的第一条记录)
删除记录例一:使用 SQL 语句。
Dim StrSQL, rsTest
StrSQL = "DELETE FROM 运货商 WHERE 电话 = '0571-7227298'"
Cnn.Execute StrSQL
删除记录例二:使用 Recordset 对象的 Delete 方法。
Dim StrSQL, rsTest
Set rsTest = server.CreateObject("ADODB.Recordset")
rsTest.LockType = adLockOptimistic
StrSQL = "SELECT * FROM 运货商 WHERE 电话 = '0571-7227298'"
rsTest.Open StrSQL, Cnn,,,adCmdText
While Not rsTest.EOF
rsTest.Delete
rsTest.MoveNext
Wend '若记录集中有多条记录符合条件,则必须使用循环,否则,Delete方法只删除第一条记录。
批量更新数据:可使提供者将多个记录的更改存入缓存,然后使用 UpdateBatch 方法在单个调用中将它们传送给数据库。缺省为立即更新模式(Update)。使用批更新模式,要使用客户端游标。
Dim StrSQL, rsTest
Set rsTest = server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient '使用客户端游标类型, 另一个值为adUseServer(默认)
rsTest.LockType = adLockBatchOptimistic
StrSQL = "SELECT * FROM 运货商 WHERE 电话 LIKE '%99%'"
rsTest.Open StrSQL, Cnn,,,adCmdText
rsTest.MoveFirst
While Not rsTest.EOF
rsTest("公司名称") = "中文"
rsTest.MoveNext
Wend
rsTest.UpdateBatch%><HTML><BODY><% '第三部分: 将得到的记录集显示到浏览器上
rsTest.Requery 'Requery方法刷新Recordset 对象全部内容。等于相继调用Close和Open方法。
Do While Not rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Loop '最后关闭数据库。
'Recordset对象的Filter 属性为筛选出符合条件的记录,而其它记录则被过滤掉,可在打开数据后用,如rsTest.Filter = "公司名称 = 'wu feng'"。清除Filter属性:rsTest.Filter=""
读取内容并以列表形式输出: rs.MoveFirst
While Not rs.EOF '判断是否过了最后一项,在这句下可以加条件,如:If rs("语文")>=60 Then
Row = "<TR>"
For i=0 to rs.Fields.Count-1:Row = Row & "<TD>" & rs(i) & "</TD>":Next
Response.Write Row & "</TR>" : rs.MoveNext
Wend
输出时分页技巧:在打开数据库后: rs为数据库连接,是否连接成功:<% If Not (rs Is Nothing) Then %>
<%Myself = Request.ServerVariables("PATH_INFO")
rs.PageSize = 10 '一页显示10条记录
Page = CLng(Request("Page"))
If Page < 1 Then Page = 1
If Page > rs.PageCount Then Page = rs.PageCount
ShowOnePage rs, Page%> '显示第Page页
<DIV ALIGN=right><P><HR><FORM Action=<%=Myself%> Method=GET>
<%If Page <> 1 Then ' 如果不是位于第一页%>
<A HREF=<%=Myself%>?Page=1>第一页</A><A HREF=<%=Myself%>?Page=<%=(Page-1)%>>上一页</A>
<%End If
If Page <> rs.PageCount Then%> '如果不是位于最后一页
<A HREF=<%=Myself%>?Page=<%=(Page+1)%>>下一页</A>
<A HREF=<%=Myself%>?Page=<%=rs.PageCount%>>最后一页</A>
<%End If%>
输入页次:<INPUT TYPE=TEXT Name=Page SIZE=3>
页次:<FONT COLOR="Red"><%=Page%>/<%=rs.PageCount%></FONT></FORM></P></DIV>
<%Sub ShowOnePage( rs, Page ) 'Page为要显示第几页
Response.Write "<CENTER><TABLE BORDER=1><TR BGCOLOR=#66CCCC><TD>编号</TD>"
For i=0 to rs.Fields.Count-1:Response.WRITE "<TD>" & rs.Fields(i).Name & "</TD>":Next
Response.Write "</TR>" '上行为读取表单字段名
rs.AbsolutePage = Page '将记录指针移到第Page页的第一行
For iPage = 1 To rs.PageSize 'rs.PageSize为每页显示的记录数,为变量.
Response.Write "<TR>"
RecNo = (Page - 1) * rs.PageSize + iPage 'RecNo为每条记录前附加的编号
Response.Write "<TD>" & RecNo & "</TD>"
For i=0 to rs.Fields.Count-1
Response.WRITE "<TD>" & rs.Fields(i).Value & "</TD>"
Next
Response.Write "</TR>"
rs.MoveNext
If rs.EOF Then Exit For
Next
Response.Write "</TABLE></CENTER>"
End Sub%>
|