回 帖 发 新 帖 刷新版面

主题:[原创]VB使用ADODB操作数据库的常用方法

ADO常用方法

下面是我所掌握的使用ADO对数据库操作的一些常用方法,主要是提供给初学者作为参考,有不对的地方请指正。如有补充不胜荣幸

准备工作
========


Dim conn As New  ADODB.Connection  '创建一个 Connection 实例,在这里使用New等于将Dim和Set合并为一段代码执行
Dim rs As ADODB.Recordset    '创建一个 Recordset 实例,不使用New 是因为,经常需要重复使用Set,因此没必要在这里使用
Dim CnStr As String, Sql As String  '创建两个字符串变量分别存放两个集合的SQL语句代码段


1、装载数据库(不属于Recordset集合)
=============
Dim FileNamw$, DbIp$, DbName$, DbUser$, DbPw$
'以上5个字符串变量分别表示文件路径和文件名、数据库地址、数据库名、数据操作员用户名、操作员密码

FileName = App.Path & "\'数据库名'"
DbIp = "数据库地址"
DbName = "数据库名"
DbUser = "数据操作员用户名"
DbPw = "操作员密码"
'以上变量根据数据库类型的不同而不同,有可能只需要1至两个变量

'1)连接Access数据库:
'-------------------
CnStr = "PROVIDER=microsoft.jet.oledb.3.51;persist security info =false;data source=" & FileName & ";Jet OLEDB:Database Password=" & DbPw

'2)连接Oracle数据库:
'-------------------
CnStr = "PROVIDER=MSDAORA.1;Password=" & DbPw & ";User ID=" & DbUser & ";Data Source=" & FileName & ";Persist Security Info=True"

'其中:
'PASSWORD:      密码
'User ID:       用户号
'Data Source:   数据库名
'Persist Security Info:
'Provider:

'3)连接VF的DBF库:
'----------------
CnStr = "PROVIDER=MSDASQL.1;Persist Security Info=False;Driver={Microsoft Visual FoxPro Driver};UID=" & DbUser & ";SourceDB=" & FileName &

";SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;"

'4)连接SQL的数据库
'------------------
CnStr = "PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;uid=" & DbUser & ";pwd=" & DbPw & ";DRIVER=SQL Server;DATABASE=" & DbName & ";WSID=GQSOFT;SERVER=" &

DbIP

'也可以使用这段简易代码 CnStr = "Provider=SQLOLEDB;Data Source=" & DbIp & ";DATABASE=" & DbName & ";UID=" & DbUser & ";pwd=" & DbPw

Conn.Open cnstr '使用 Connection 集合的 Open 方法 与数据库建立连接

2、Recordset集合的常用方法
==========================

'1)打开一个表
'------------

Sql = "select * from 表名" 'SQL查询语句
Set rs = New ADODB.Recordset '新建一个实例
rs.Open Sql, conn '使用 Open 方法打开数据库中的一个表

'注意,这种打开方式只能使用 rs.MoveNext (即,向后移动行坐标)而不能像其他方向,并且不能修改数据内容
'
'rs.Open Sql, conn,1 '虽然只加了个“1”,但这种方法可以向任何方向移动行坐标。
'
'以下参数代表了这个可选值的含义
'0 = adOpenForwardOnly (默认值)打开仅向前类型游标。
'1 = adOpenKeyset       打开键集类型游标。
'2 = adOpenDynamic      打开动态类型游标。
'3 = adOpenStatic       打开静态类型游标。
'
'虽然使用以上方法可以可以实现行坐标(游标)的任意移动,但是仍然无法写入数据。因此需要进一步的对Open 方法进行完善

'rs.Open Sql, conn, 1, 3  '后面的3是确定读写权限的

'以下参数代表了这个可选值的含义
'1 = adLockReadOnly        (默认值)只读 — 不能改变数据。
'2 = adLockPessimistic     保守式锁定(逐个) — 在编辑时立即锁定数据源的记录。
'3 = adLockOptimistic      开放式锁定(逐个) — 只在调用 Update 方法时才锁定记录。
'4 = adLockBatchOptimistic 开放式批更新 — 用于批更新模式(与立即更新模式相对)。
'
'2)读写数据
'----------
'增加一行记录并对新记录的内容进行修改并保存可以如下写法
rs.AddNew '增加一行记录
rs("...")="..."    '数据读写操作
...
rs.UpDate '保存写入资料,如果使用只读权限,则不能使用这个方法
rs.Close  '这个方法用来关闭你所代开的表,如果不使用这个方法也可以,但是数据库仍然认为你在对标进行锁定,可造成数据库负担过重

2、对数据进行筛选和排序
=======================
Sql = "select * from 表名" 'SQL查询语句
'以上为打开一个表的所有内容

Sql = "select top 50 * from 表名" 'SQL查询语句
'以上为只打开前50行的记录

Sql = "select top 50 列名1,列名2,列名5 from 表名" 'SQL查询语句
'以上为只打开前50行的记录,并且只打开第1、2、5列数据

Sql = "select * from 表名 where 列名1='" & 字段 & "'" 'SQL查询语句
'以上为一个简单的筛选,表示打开的内容必须符合[列名1='" & 字段 & "'"]的内容
'需要注意的是,数据库列的类型必须匹配,比如字符串类型需要以单引号括起
'而数字类型则不能用单引号括起
'另外SQL语句还支持通配符,例如 列名1 like '%" & 字段 & "%'" 表示包含[字段]
'在表达式中的匹配
'? _(下划线) 任何单一字符
'* or %        零个或多个字符
'#             任何单一数字(0 — 9)
'[charlist]    任何在字符表中的单一字符
'[!charlist]   任何不在字符表中的单一字符
'注:根据数据库的不同?、_和*、%的应用有所差别,比如SQL只使用% 和 _ 分别代表多个字符和单一字符

Sql = "select * from 表名 where 列名1='" & 字段 & "' ORDER BY 字段1 ASC" '对查询结果进行升序排列
Sql = "select * from 表名 where 列名1='" & 字段 & "' ORDER BY 字段1 DESC"  '对查询结果进行降序排列
Sql = "select * from 表名 where 列名1='" & 字段 & "' ORDER BY 字段1 DESC, ORDER BY 字段2 DESC"  '对查询结果进行多维降序排列(速度奇慢,不推荐使用)

3、Recordset集合的常用属性方法
==============================
rs.BOF        '是否游标在最上边
rs.EOF        '是否游标在最下边
rs.RecordCount    '记录集的行数(如果使用像前类型的游标,可能返回不准确)
rs.AddNew    '新建一行记录
rs.Update    '保存当前行被修改的记录
rs.Delete    '删除当前行
rs.Close    '关闭记录集

4、Fields集合的一些属性的解释
=============================
'以下为简写,正常情况需要rs.Fileds.。。。但是Fields属于Recordset的一个默认集合,因此可以省略

rs()  '括号内可以是列名也可以是列的序号例如:rs("姓名")、rs(3) 都是是可以的

rs(3).Name  '返回列名
rs(3).Type  '返回列的类型
rs(3).Value '返回当前行的值
rs.Fields.Count '返回列数



回复列表 (共91个回复)

71 楼

呵呵, 师傅 ,你好帅 !!!!
  顶

72 楼

4.0的才能连接上ACCESS97以后的版本
楼猪用3.5连不上啊
我试N遍了

73 楼

这个帖子要置顶 .  因为学VB的就不能不学它

74 楼

好铁

75 楼


请问能详细解释open方法的参数吗
我用分页功能,总是提示
错 误 码:0x80040E21
错误代码:rs.Open "select * from shujuku where "&request.form("keyfield")&" like '%"&trim(request.form("text"))&"%' order by 年期",cn,1,1
错误描述:ODBC 驱动程序不支持所需的属性。
原程序
Dim cn,rs,iPage
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open "Driver={SQL Server};Server=tsglx;Database=肿瘤;" & _
          "UID=sa;PWD=sa"
Set rs = Server.CreateObject("ADODB.RecordSet")

select case request.form("RadioGroup1")
case 0
rs.Open "select * from shujuku where "&request.form("keyfield")&" like '%"&trim(request.form("text"))&"%' order by 年期",cn,1,1
case else
rs.Open "select * from shujuku where "&request.form("keyfield")&" like '%"&trim(request.form("text"))&"%' order by 年期 desc",cn,1,1
end select
rs.PageSize = 5
If Len(Request("page")) = 0 Then
  iPage = 1
Else
  iPage = Request("page")
End If

rs.AbsolutePage = iPage
%>
</p>
<p>&nbsp; </p>
<form name="form1" method="post" action="search3fuben.asp" target="result">
  <p> 检索字段:
      <select name="keyfield" id="keyfield">
        <option value="0" selected>篇名</option>
        <option value="1">作者</option>
        <option value="2">年期</option>
      </select> 
      关键词:
      <input name="text" type="text" id="text">
       年期排序:
      <label>
    <input type="radio" name="RadioGroup1" value="0">
    升序</label>
    <label>
    <input name="RadioGroup1" type="radio" value="1" checked>
    降序</label> 
    <input name="Submit1" type="submit" id="Submit12" onClick="href=&quot;search3fuben.asp&quot;" value="二次检索">
  </p>
</form>
<p>记录共有
  <% =rs.recordcount %>
条,共
<% = rs.PageCount %>
页,第
<% =iPage%>
页<% If CInt(iPage) = 1 Then %>
  第一页|上一页|
  <% Else %>
  <a href="search3fuben.asp?page=1">第一页</a>| <a href="search3fuben.asp?page=<% = iPage - 1 %>">上一页</a>|
  <% End If %>
  <% If CInt(iPage) = CInt(rs.PageCount) Then %>
  下一页| 最后一页
  <% Else %>
  <a href="search3fuben.asp?page=<% = iPage + 1 %>">下一页</a>| <a href="search3fuben.asp?page=<% = rs.PageCount %>">最后一页</a>
  <% End If %>
</p>
<table width="778" height="41" border="0" bordercolor="#99CCFF">
  <tr bordercolor="#E9F2F9" bgcolor="#A8D8F6">
    <td width="30" height="15"><div align="center">序号</div></td>
    <td width="60"><div align="center">原文下载</div></td>
    <td width="299"><div align="center">篇名</div></td>
    <td width="158"><div align="center">作者</div></td>
    <td width="138"><div align="center">来源</div></td>
    <td width="67"><div align="center">年期</div></td>
  </tr>
<%
dim j,backcolor
j=1
backcolor="#FFFFFF"
For i =1 To rs.PageSize
  If Not rs.Eof Then
%>  
  <tr bordercolor="#99CCFF" bgcolor="<%=backcolor%>">
    <td width="30" height="15"><%=i%></td>
    <td width="60"><a href="data/<%=rs(6)%>" target=_blank><IMG src="image/download1.gif" width="14" height="13" border=0> <%=rs(1)%></a></td>
    <td width="299"><a href="detail1.asp?id=<%=rs(0)%>" target=detail><%=rs(2)%></a></td>
    <td width="158"><%=rs(3)%></td>
    <td width="138"><%=rs(4)%></td>
    <td width="67"><%=rs(5)%></td>
  </tr>
<%
End If
  If Not rs.Eof Then rs.MoveNext
  j=j+1
  if backcolor="#FFFFFF" then
  backcolor="#E9F2F9"
  else backcolor="#FFFFFF"
  END IF
Next   
%>
</table>

<%
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
%>

76 楼


[em4][em4][em4]
好~~~~~~~~~~~~~~~~

77 楼

不错
这样还是挺实用的

78 楼

现在正忙着编链接数据库,谢了[em1][em1][em1][em1][em1][em1]

79 楼

不错!~的确是常用方法!~

80 楼

顶出来,好好学!

我来回复

您尚未登录,请登录后再回复。点此登录或注册