在ASP中,主要通过ADO(Active Data Objects)方式实现连接存取数据库。主要相关三种对象:Connection、Recordset 、Command和Fields。
Connection:负责打开或连接数据。
Recordset:负责存取数据表。
Command:负责对数据库执行行动查询命令。
Connection:负责打开或连接数据。
Recordset:负责存取数据表。
Command:负责对数据库执行行动查询命令。
Field 对象代表使用普通数据类型的数据的列。
举例说明:
共同
Dim conn
Dim rs
Dim System_path
Dim path
Set conn = Server.CreateObject("ADODB.Connection")
System_path = "../"
path = Server.MapPath(System_path & "mdb/kensaku.mdb")
一、 ASP数据库连接
连接各数据库可以使用驱动程序,也可以使用数据源,使用驱动程序非常方便、简单,而使用数据源比较麻烦。
连接各数据库可以使用驱动程序,也可以使用数据源,使用驱动程序非常方便、简单,而使用数据源比较麻烦。
1. 连接Access
conn.Open "driver={Microsoft Access Driver (*.mdb)};DBQ=" & path
2. 连接SQLSERVER
conn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=xuejie;Data Source=erpsv01 "
3. 连接ORACLE
conn.Open "Provider=OraOLEDB.Oracle.1;Persist Security Info=True;User ID=shc;Password=shc;Data Source=hctg"
二、 ASP数据操作
1. 六个实用小函数
(1). 关闭连接
Public Sub DBDisConnect()
conn.close
set conn = nothing
set conn = nothing
End Sub
(2). 建立记录集
Public Sub RSConnect(ByVal strSql)
End Sub
set rs=Server.CreateObject("ADODB.Recordset")
rs.open sSqlStr,cnnPub,1,1
End Sub
(3).关闭记录集
Public Sub RSDisConnect()
rs.close
set rs=nothing
End Sub
rs.close
set rs=nothing
End Sub
(4).建立SQL文查询
Public Sub SqlConnect(ByVal strSql)
DBConnect()
RSConnect(strSql)
End Sub
DBConnect()
RSConnect(strSql)
End Sub
(5).关闭SQL文查询
Public Sub SqlDisConnect()
RSDisConnect()
DBDisConnect()
End Sub
RSDisConnect()
DBDisConnect()
End Sub
(6).建立SQL更新同时关闭
Public Sub SqlExecute(ByVal strSql)
DBConnect()
conn.Execute(strSql)
DBDisConnect()
End Sub
DBConnect()
conn.Execute(strSql)
DBDisConnect()
End Sub
补充说明关于小函数2:
rs.open sSqlStr,cnnPub,1,3中最后2个参数
CursorType,LockType
CursorType:
CursorType:
0(adOpenForwardOnly): 只能在Recordset的记录中向前移动,但速度最快。
1(dOpenKeyset):可以在Recordset中任意移动,其他用户所做的记录修改可见,但其他用户添加的记录不可见,删除的记录字段值不能被使用。
2(adOpenDynamic):可以在Recordset中任意移动,其他用户增、删、改的记录都可见,但速度最慢。
3(dOpenStatic):可以在Recordset中任意移动,其他用户增、删、改的记录都不可见。
LockType:
1(dOpenKeyset):可以在Recordset中任意移动,其他用户所做的记录修改可见,但其他用户添加的记录不可见,删除的记录字段值不能被使用。
2(adOpenDynamic):可以在Recordset中任意移动,其他用户增、删、改的记录都可见,但速度最慢。
3(dOpenStatic):可以在Recordset中任意移动,其他用户增、删、改的记录都不可见。
LockType:
0(adLockReadOnly):recordset的记录为只读
1(adLockPessimistic):只要保持Recordset为打开,别人就无法编辑该记录集中的记录.
2(adLockOptimistic):当update recordset中的记录时,将记录加锁
3(adLockBatchOptimistic):以批模式时更新记录时加锁
注意如果发生RecordCount=-1问题主要是由于记录集游标是服务器游标引起的,解决方法是
1(adLockPessimistic):只要保持Recordset为打开,别人就无法编辑该记录集中的记录.
2(adLockOptimistic):当update recordset中的记录时,将记录加锁
3(adLockBatchOptimistic):以批模式时更新记录时加锁
注意如果发生RecordCount=-1问题主要是由于记录集游标是服务器游标引起的,解决方法是
可以追加设置rs.CursorLocation = 3或者保持rs.open sSqlStr,cnnPub,1,3(CursorType不能设置成2)的设置。
2. Recordset 对象
Recordset 对象表示的是来自基本表或命令执行结果的记录全集。任何时候,Recordset 对象所指的当前记录均为集合内的单个记录。
(1)BOF属性 指示当前记录位置位于 Recordset 对象的第一个记录之前,返回布尔型值。
if rs.bof then
(2)EOF属性 指示当前记录位置位于 Recordset 对象的最后一个记录之后,返回布尔型值。
if rs.eof then
(3)MoveFirst | MoveLast | MoveNext | MovePrevious属性
使用MoveFirst 方法将当前记录位置移动到 Recordset 中的第一个记录。
使用MoveLast 方法将当前记录位置移动到 Recordset 中的最后一个记录。Recordset 对象必须支持书签或向后光标移动;否则调用该方法将产生错误。
使用MoveNext 方法将当前记录向前移动一个记录(向 Recordset 的底部)。如果最后一个记录是当前记录并且调用 MoveNext 方法,则 ADO 将当前记录设置到 Recordset (
EOF 为 True)的尾记录之后。当 EOF 属性已经为 True 时试图向前移动将产生错误。
使用MovePrevious 方法将当前记录位置向后移动一个记录(向记录集的顶部)。Recordset 对象必须支持书签或向后游标移动;否则方法调用将产生错误。如果首记录是当前记录并且调用 MovePrevious 方法,则 ADO 将当前记录设置在 Recordset (BOF 为 True)的首记录之前。而 BOF 属性为 True 时向后移动将产生错误。如果 Recordset 对象不支持书签或向后游标移动,则 MovePrevious 方法将产生错误。
例如:rs.movenext
(4)AbsolutePage属性 识别当前记录所在的页码
例如:rs.absolutePage=1
(5)AbsolutePosition 属性 可根据其在 Recordset 中的序号位置移动到记录,或确定当前记录的序号位置。提供者必须支持该属性的相应功能才能使用该属性。
(6)Pagecount属性 确定 Recordset 对象中数据的页数。“页”是大小等于 pagesize 设置的记录组。 该值为 -1 以表明 PageCount 无法确定。
例如:totalpages = rs.pagecount
(7)Pagesize 属性 可确定组成逻辑数据页的记录数。
例如:pagesize = 10
(8)Recordcount 属性 可确定
Recordset 对象中记录的数目。
例如:total = rs.recordcount
3. 数据操作
(1)不用游标
查询:
call SqlConnect(Sql)
Do while not rs.eof
if cint(i) mod 2 = 0 then
<tr bgcolor="#F7F7E7">
else
<tr >
end if
<td align="center" height ="20" width="8%"><%=I%></td>
rs.movenext
i=i+1
loop
i=i+1
loop
call SqlDisConnect
追加更新削除:
call SqlExecute (sql)
(2)用游标
查询:
rs.cursorlocation = 2
rs.open sql,conn,1,3
rs.open sql,conn,1,3
Do while not rs.eof
redim Preserve s(i)
(i) = rs("xx")
i = i + 1
redim Preserve s(i)
(i) = rs("xx")
i = i + 1
rs.movenext
loop
rs.close
追加:
sql = "select * from xxx where xx='' "(oracle,sqlserver)
sql = "select * from xxx where xx=-1"(Access)
rs.cursorlocation = 2
rs.open sql,conn,1,3
rs.addnew
rs.cursorlocation = 2
rs.open sql,conn,1,3
rs.addnew
rs("xxx") = xxx
rs.update
rs.close
rs.close
更新:
sql = "select * from xxx where xx='" & xx & "'"
rs.cursorlocation = 2
rs.open sql,conn,1,3
rs("xx") = 2
rs.update
rs.close
rs.cursorlocation = 2
rs.open sql,conn,1,3
rs("xx") = 2
rs.update
rs.close
削除:
sql="delete from xxxx where xx='"&xx&"'"
rs.cursorlocation=2
rs.open sql,conn,1,3
rs.cursorlocation=2
rs.open sql,conn,1,3