ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 42712|回复: 107

[分享] 我的ADO学习笔录

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2008-12-13 10:42 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:ADO技术
以下是引用前辈学习的资料,简单易懂,不忍删章去节,作为引子:

Access数据库与ADODB编程入门

    即然已经了解了那些数据库中的基本概念,那么我们就只说说在VB中使用数据库编程
    首先有一点要注意,数据库的使用与我们以往所使用的文本文件不同.例如我们使用文本文件,来记录各种有用的数据.那么大致有以下几步:
     
    读取文件 -- 格式化数据 -- 关闭文件 -- 使用数据


    如果数据量较大,需要进行筛选,且存放数据的源文件可能不定时变更,那么我们可以用一个临时文件来存放有用的数据,
这样可大大提高程序的效率.要[格式化数据]时,我们首先要进行筛选,然后还得进行分类,
这样文件中的字符串才能被转换成有用的信息来供程序使用.这样一来,不用说,处理速度将大大减慢,
而且就算你设计的数据格式比较科学,当数据量非常大时,文件的容量也会变的让普通计算机无法承受.
相对文本文件来说数据库的使用也大致分为以下几步:


    打开数据库 -- 查找数据 -- 使用数据 -- 关闭数据库


    从中可以看出,里面少了一步格式化数据,因为数据库本身在存储数据时,它就是按照一定的格式来进行存储的.

    其次是,数据库与文本文件返回数据的方法不同.如果把文本文件比作一个Textbox 的话,
那么数据库更像是一个ListBox.使用文本文件时我们需要从整个Textbox中取出有用的信息,
并进行处理,而Listbox则可以根据需要返回特定的某一项.


    由于VB本身并不带有可以访问数据库的类,所以我们需要引用一个包含能访问数据库的类来使用数据库.
这里我们采用ADODB,相比DAO和能访问数据库的API来说,它比DAO更灵活,更强大;而比起API,它更简单易用,更适合初学者.
而Access数据库比起SQL,也相对简单了很多,且能够满足中小型应用程序的需要,所以我们在使用数据库时,选择了Access.


    就像使用文本文件来存储数据一样,我们需要先设计好数据结构,只不过在设计Access数据库的结构时,
我们需要用到其它的程序来进行详细的规划.建议采用的程序是office中的Access或VB自带的VISDATA.


    当数据库设计好了以后,我们可以开始"数据库编程"了.


    首先,我们需要引用ADO.具体的方法是,在"工程" -- "引用" 中,找到"Microsoft ActiveX Data Object *.* Library",
这里的"*.*"是指的时ADO的版本号,一般来说,应用程序或ActiveX控件都具有向下兼容性,所以我们尽可能选择比较新的版本.
以确保程序在能识别旧版本Access的同时,也能识别较新版本的Access.


    然后我们需要在程序中创建一个对象.就好比我们在窗体上添加一个FileBox才能看到文件名一样,只有创建了ADO对象,
我们才能够访问数据库.常用的对象有两个,Connection和Recordset.


    创建这两个对象的具体方法是:


    1.在引用后,使用New关键字,如

    Private Conn As New ADODB.Connection

    Private Reco As New ADODB.Recordset


    2.在没引用时,用CreateObject创建对象:

    Dim Conn,Reco

    Set Conn = CreateObject("ADODB.Connection")

    Set Reco = CreateObject("ADODB.Recordset")


    创建了对象之后,下一步我们要做的就是打开数据库了.


    先看下面的代码,可以成功的打开数据库.

    Conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Main.mdb"

    这句代码打开了D盘中的Main.mdb这个数据库.

    Connection.Open方法的第一个参数是连接代码,它将传递给系统的数据库引擎.前半部分"Provider=Microsoft.Jet.OLEDB.4.0",
它表示了数据库的类型.不同的数据库可能会不同.后半句"Source=d:\main.mdb"它表示了数据库所在的绝对路径.


    打开数据库之后,还要打开表.假如数据库中有一个表,表名为"Users",字段有两个,一个为用户名,一个为密码.那么看以下代码.


    1.想返回"Users"中,[用户名]为"去年烟花"的[密码]

    Recordset.open "Select 密码 From Users Where 用户名='去年烟花'",Connection,1,1

    之后我们就可以把用户输入的密码进行比较,看是否允许登录.

    If Recordset.eof and Recordset.bof then

        Msgbox "用户不存在!",16

    Else

        If PassWord =Recordset("密码").value then

            msgbox "登录成功!",64

        Else

            msgbox "密码错误!",32

        End If

    End If

    Recordset.Close


    2.假设Admin已经成功登录系统,我们想把所有的用户名和密码都显示出来

    Recordset.open "Select * From Users",Connection,1,1

    这时,表已经被打开,我们就用以下代码把它显示出来.

    Do whlie Not Recordset.eof

        Print "用户名: " & Recordset("用户名").value & "密码: " & Recordset("密码").value

        Recordset.MoveNext

    Loop

    Recordset.Close


    由以上代码示例可以看出,打开表时,可以只打开其中的一个字段,也可以打开所有.第一个参数是SQL语句.


    Select [字段名] From 表名 [Where 条件]


    这里的条件可以省略.且字段名也可以用"*"来代替所有字段.


    需要注意的是,如果你用(1)中的方法打开,那么(2)后面显示的代码就不能再用在(1)中.因为(1)里并没有打开[用户名]字段,
所以这一句Recordset("密码")就没有值存在,还有可能出错.


    后面的条件,可以用"="、">"、"<"等运算符.比如 "Where ID > 32".(这里假设[ID]为数字型.)



    这是打开的部分.第二个很重要的部分就是查询记录.


    数据库它并不是把所有记录全部放到一个变量中备用的.而是以"当前记录"的形式来返回一个值.所以我们想从中找到有用的信息,
就必须要对信息进行定位/筛选.


    定位:

    移动到下一条 Recordset.MoveNext

    移动到上一条 Recordset.MovePrevious

    移动到最后一条 Recordset.MoveLast

    移动到第一条 Recordset.MoveFrist

    移动到某一条 Recordset.Move Number


    筛选:

    Recordset.Find "条件"


    如:[用方法(2)打开表之后]

    Private Sub Command1_Click()

    Recordset.Find "用户名=" & "text1.text"

    If Recordset.Eof <> True Then

        Msgbox "该用户的密码是:" & Recordset("密码").value,64

    Else

        Msgbox "未找到该用户的资料!",16

    End If

    End Sub


    MoveNext 只有当Eof不为True时,才可用,否则发生错误.而MovePrevious刚是Bof不为True时....

    而只要Eof 和 Bof中有一个不为真时,也就是说只要有一条记录时,它就可以使用.



    Find 方法中的条件和Open时的第一个参数中的条件表述方法是完全一致的.当在已打开的记录集中,找不到该记录时,Eof为True.
找到则当前的值就是符合条件的记录.



    第三个部分就是添加/修改/删除记录.

    修改记录很简单,先按以上的方法找到相关记录之后,给记录赋值就可以了.

    比如:[(修改密码)按方法(1)打开表之后]

    Recordset("密码").value = "123456"

    Recordset.Updata

    需要注意的就是,在修改完成后,要调用Updata方法,这样修改才能生效.


    而添加记录则可以用以下代码来实现:

    Recordset.addnew

    Recordset("用户名").value = "Admin"

    Recordset("密码").value = "Admin"

    Recordset.Updata


    删除记录:

    Recordset.delete

    Recordset.uptata


    这里,先要调用Addnew方法,增加一条新记录,然后对这个新记录中的各字段赋值,最后再调用Updata方法.


    到这里就差不多了,最后说一下上面提到的几个方法.


    Recordset.Open    SQL语句,数据源,游标类型,打开方法


    SQL语句不用说了,就是Select那啥的,目的就是按要求从表中返回数据

    数据源就是一个打开之后的Connection对象.

    去他妈的游标类型,填1(即openkeyset)就可以了 [偷笑ing]

    打开方法对应了几个常数,具体哪几个可以从对象浏览器里看.

    对应数值的意义:

    1 只读 2 独占 3 可写 4 自已可写,别人可读


    Connection.open 连接代码,服务器用户名,密码

    这里的连接代码就不在多说了,服务器用户名,密码只有在连接远程数据库时才用到.

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-12-13 10:44 | 显示全部楼层

补上我做的笔记。

二楼是我计划常总结更新的地方。希望对初学者有些帮助。
笔记取自楼上及爱歌的ADO贴子,爱歌实践性代码太强了,但初学不易。


使用ADO的优点在于:
不用打开文件,只需连接,很灵活的取到目标数据。

经验:
1、同时建两个连接比先打开一个连接,关闭后再打开另一个连接似乎要快些

定义及引用AOO
'若要使用 RST.RecordCount 计算记录个数,一定要设置引用:
'VBE 中菜单“工具-引用-Microsoft ActiveX Data Objects 2.5 Library”

1.在引用后,使用New关键字,如
    Private Cnn As New ADODB.Connection
    Private rst As New ADODB.Recordset
2.在没引用时,用CreateObject创建对象:
   Dim Conn,Reco
   Set Cnn = CreateObject("ADODB.Connection")
   Set Rst = CreateObject("ADODB.Recordset")
创建了对象之后,下一步我们要做的就是打开数据库了.

先看下面的代码,可以成功的打开数据库.(一句呵成)

   打开MDB文件
   Cnn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Main.mdb"
   Connection.Open方法的第一个参数是连接代码,它将传递给系统的数据库引擎.前半部分"Provider=Microsoft.Jet.OLEDB.4.0",
   它表示了数据库的类型.不同的数据库可能会不同.后半句"Source=d:\main.mdb"它表示了数据库所在的绝对路径.

   如:打开EXCEL文件则为:
   Cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & 带路径文件名

   但以上代码打开了D盘中的Main.mdb这个数据库.但这样写不够层次分明

建议分句显示:
With cnn                                         
  .Provider = "Microsoft.Jet.OLEDB.4.0"    '引用ADO引擎属性
  .ConnectionString = "Data Source=" & 带路径文件名 & ";Extended Properties=Excel 8.0;"     '设置连接串
  .Open                '打开连接
  .Execute  SQL语句    '执行SQL语句,也可先建立好链接,处理完后再放到后面再执行           
End With

关于列标题:
列标题:系统默认 Excel 数据源第一行包含列标题。如果不是则必须将该设置关闭,否则,第一行数据将会“消失”,而被用作字段名称。这

可通过扩展属性添加可选的 HDR= 设置来完成。默认有列标题HDR=Yes。如果没有列标题,则需要指定 HDR=No;提供程序将字段命名为 F1、F2

等等。因为扩展属性字符串现在包含了多个值,所以各值必须用双引号括起来,再加一对双引号,让 Visual Basic 将第一层引号中的内容当

作字面值。且同理,同样位置,使用 IMEX=1 对于数据类型
不一致的列强制为文本型处理。如:

With cnn                                         
  .Provider = "Microsoft.Jet.OLEDB.4.0"    '引用ADO引擎属性
  .ConnectionString = "Data Source=" & 带路径文件名 & ";Extended Properties='Excel 8.0;hdr=no';"     '设置连接串,留意这

个:'Excel 8.0;hdr=no'
                                     多参数值用'参数1;hdr参数2;IMEX参数3'
  .Open                '打开连接
  .Execute  SQL语句    '执行SQL语句,也可先建立好链接,处理完后再放到后面再执行           
End With


'SQL语句的写法:
打开数据库之后,还要打开表.假如数据库中有一个表,表名为"Users",字段有两个,一个为用户名,一个为密码.那么看以下代码.
1.想返回"Users"中,[用户名]为"去年烟花"的[密码]
    Recordset.open "Select 密码 From Users Where 用户名='去年烟花'",Connection,1,1
    Do whlie Not Recordset.eof   如果记录集非空,返回
       Print "用户名: " & Recordset("用户名").value & "密码: " & Recordset("密码").value
       Recordset.MoveNext  '显示下一条记录
    Loop

由以上代码示例可以看出,打开表时,可以只打开其中的一个字段,也可以打开所有.第一个参数是SQL语句.
    Select [字段名] From 表名 [Where 条件]
    这里的条件可以省略.且字段名也可以用"*"来代替所有字段.后面的条件,可以用"="、">"、"<"等运算符

数据库它并不是把所有记录全部放到一个变量中备用的.而是以"当前记录"的形式来返回一个值.所以我们想从中找到有用的信息,
就必须要对信息进行定位/筛选.
定位:
    移动到下一条 Recordset.MoveNext
    移动到上一条 Recordset.MovePrevious
    移动到最后一条 Recordset.MoveLast
    移动到第一条 Recordset.MoveFrist
    移动到某一条 Recordset.Move Number
    记录集(文件)开头   Recordset.Eof
    记录集(文件)结尾   Recordset.Bof
    MoveNext 只有当Eof不为True时,才可用,否则发生错误.而MovePrevious刚是     Bof不为True时与MoveNext同理。
    筛选:
    Recordset.Find "条件"
Find 方法中的条件和Open时的第一个参数中的条件表述方法是完全一致的.当在已打开的记录集中,找不到该记录时,Eof为True.找到则当前的

值就是符合条件的记录.

第三个部分就是添加/修改/删除记录.
    修改记录很简单,先按以上的方法找到相关记录之后,给记录赋值就可以了.
    比如:[(修改密码)按方法(1)打开表之后]
    Recordset("密码").value = "123456"
    Recordset.Updata
    需要注意的就是,在修改完成后,要调用Updata方法,这样修改才能生效.

    而添加记录则可以用以下代码来实现:
    Recordset.addnew
    Recordset("用户名").value = "Admin"
    Recordset("密码").value = "Admin"
    Recordset.Updata

    删除记录:
    Recordset.delete
    Recordset.uptata

    这里,先要调用Addnew方法,增加一条新记录,然后对这个新记录中的各字段赋值,最后再调用Updata方法.
    到这里就差不多了,最后说一下上面提到的几个方法.

    Recordset.Open    SQL语句,数据源,游标类型,打开方法

    SQL语句不用说了,就是Select那啥的,目的就是按要求从表中返回数据
    数据源就是一个打开之后的Connection对象.
    去他妈的游标类型,填1(即openkeyset)就可以了 [偷笑ing]
    打开方法对应了几个常数,具体哪几个可以从对象浏览器里看.
    对应数值的意义:
    1 只读 2 独占 3 可写 4 自已可写,别人可读
    Connection.open 连接代码,服务器用户名,密码
    这里的连接代码就不在多说了,服务器用户名,密码只有在连接远程数据库时才用到.

   


'基本常识:
'1、将SQL的关键字以空格分隔,常用关键字:SELECT、[ALL] 、[DISTINCT]、UPDATA、WHERE、UNION 、BTWEEN、GROUP BY、HVING BY等
'2、字段名之间用逗号分隔,而最后一个字段名后无逗号,结束语句为空或用";"号
'3、字符或固定常量需加'字符或常量',有时在LIKE用[字符]表示串中带某字符位置。
'4、变量用连接符&成串
'5、代码转行时用 " _"移下行
'6、表名用[表名$]
'7、或(or) 、与(and) 、非(not)、LIKE在逻辑中的用法




'模型:
'Sql = sql关键字 关键参数 字段  from [表名$]  where 条件   
'Sql = sql 语句  union   sql 语句
'例子:
Sql = "select 品号,品类,sum(数量),sum(金额),'','','','','','',类型 from [明细表$] where month(日期)=" & Month(Range(“J2”))

& " group by 品号,类型,品类 order by 品号,类型 desc"
'以上查询为:
查询月份=J2 的记录,按指定字段名进行显示,并按 品号 类型 品类 分组,以 品号、品类 降序(desc)排序,其中某些字段求和。

更复杂的如:
SQL = "select a.摘要,SUM(a.总收入笔数),SUM(a.总收入金额),SUM(a.总支出笔数),SUM(a.总支出金额) from (select 摘要,COUNT(收入金额

) as 总收入笔数,SUM(收入金额) as 总收入金额,0 as 总支出笔数,0 as 总支出金额 from [sheet1$] " & _
        "where 收入金额<>0 group by 摘要 " & _
        "Union All select 摘要,0 as 总收入笔数,0 as 总收入金额,COUNT(支出金额) as 总支出笔数,SUM(支出金额) as 总支出金额 from

[sheet1$] " & _
        "where 支出金额<>0 group by 摘要) as a  group by 摘要 order by 摘要"



'执行SQL语句:
[A2].CopyFromRecordset Cnn.Execute(Sql) '这里的记录数据是没有字段名的,只是数据
RST.Open Sql, Cnn, adOpenStatic         'adOpenStatic静态指针,以便计算记录个数


'结果处理的分析
'手工选取连接的文件数遍历连接,也可用FILESEARCH对象,排好序后再遍历
'预先无法知道此数组大小,因预先无法知道要打开的文件数
Dim Filename As Variant   '定义变量数组
'打开选取文件对话框,将选取的各文件全路径名存于 Filename 数组中
Filename = Application.GetOpenFilename("Microsoft Office Excel Files (*.xls), *.xls", , "请选取文件", , MultiSelect:=True)  
'如果未选取文件,则退出程序
If Not IsArray(Filename) Then Exit Sub
'在整个选择的范围内循环, fn 为 Filename 数组中的一项,是其中的一个全路径名
For Each fn In Filename
sName = Dir(fn)
...
next   







'结束时处理方式:  
RST.Update            ‘执行记录集的更新
RST.Close:CNN.Close   ‘关闭对象,并未释放内存,用冒号分隔多行成一行
Set CNN = Nothing: Set RST = Nothing  释放对象及内存



参考文献:
Connection对象(代表打开的、与数据源的连接。)
RecordSet对象(代表来自基本表或命令执行结果的记录的全集。)
至于和存储过程密切相关的Parameter对象和Command对象会在以后的教程中详细说。
先来说一下Connection对象的方法:
1、Open方法
connection.Open ConnectionString, UserID, Password, Options
ConnectionString   可选,字符串,包含连接信息。
UserID   可选,字符串,包含建立连接时所使用用户名。
Password   可选,字符串,包含建立连接时所使用密码。
Options   可选,ConnectOptionEnum 值。决定该方法是在连接建立之后(异步)还是连接建立之前(同步)返回。可以是如下某个常量:
adConnectUnspecified (默认)同步打开连接。
adAsyncConnect 异步打开连接。
2、Execute方法
connection.Execute CommandText, RecordsAffected

CommandText    字符串,包含要执行的 SQL 语句、表名、存储过程或特定提供者的文本。

RecordsAffected    可选,长整型变量,提供者向其返回操作所影响的记录数目。
3、Close方法
connection.Close
使用 Close 方法可关闭 Connection 对象以便释放所有关联的系统资源。
需要注意的是:
(1)关闭对象并非将它从内存中删除,可以更改它的属性设置并且在此后再次打开。
(2)要将对象从内存中完全删除,可将对象变量设置为 Nothing。
(3)使用 Close 方法关闭 Connection 对象的同时,也将关闭与连接相关联的任何活动 Recordset 对象。
(4)关闭 Connection 对象后,调用任何需要打开与对数据源连接的方法都将产生错误。

以上三种方法,大家都应该是熟知的。
下面说一下Connection对象的属性,简单提一下。
1、Provider属性
使用 Provider 属性指定 OLE DB 提供者。
需要注意的是:调用 Open 方法时在多处指定提供者可能会产生无法预料的后果。
2、ConnectionString 属性
包含用于建立连接数据源的信息。
3、ConnectionTimeout 属性
指示在终止尝试和产生错误前建立连接期间所等待的时间,等待连接打开的时间的长整型值(单位为秒)。默认值为 15。
4、Mode 属性
指示在 Connection 中修改数据的可用权限。
常量 说明
AdModeUnknown 默认值。表明权限尚未设置或无法确定。
AdModeRead 表明权限为只读。
AdModeWrite 表明权限为只写。
AdModeReadWrite 表明权限为读/写。
AdModeShareDenyRead 防止其他用户使用读权限打开连接。
AdModeShareDenyWrite 防止其他用户使用写权限打开连接。
AdModeShareExclusive 防止其他用户打开连接。
AdModeShareDenyNone 防止其他用户使用任何权限打开连接。
需要注意的是:
使用 Mode 属性可设置或返回当前连接上提供者正在使用的访问权%





Open 方法 (ADO Recordset)
打开游标。
语法
记录集.打开  源,激活连接,游标类型,锁定类型,提供者计算方式,不明白可按F1
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

CursorType参数
常量        说明
AdOpenForwardOnly        (默认值)打开仅向前类型游标。
AdOpenKeyset        打开键集类型游标。
AdOpenDynamic        打开动态类型游标。
AdOpenStatic        打开静态类型游标。

LockType 参数
常量        说明
AdLockReadOnly        (默认值)只读 — 不能改变数据。
AdLockPessimistic        保守式锁定(逐个) — 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。
AdLockOptimistic        开放式锁定(逐个) — 提供者使用开放式锁定,只在调用Update 方法时才锁定记录。AdLockBatchOptimistic       

开放式批更新—用于批更新模式(与立即更新模式相对)。

Options参数   
常量        说明
adCmdText        指示提供者应该将 Source 作为命令的文本定义来计算。
adCmdTable        指示 ADO 生成 SQL 查询以便从在 Source 中命名的表中返回所有行。
adCmdTableDirect        指示提供者更改从在 Source 中命名的表中返回所有行。
adCmdStoredProc        指示提供者应该将 Source 视为存储过程。
adCmdUnknown        指示 Source 参数中的命令类型为未知。
adCmdFile        指示应从在 Source 中命名的文件中恢复保留(保存的)Recordset。
adAsyncExecute        指示应异步执行 Source。
adAsyncFetch        指示在提取 Initial Fetch Size 属性中指定的初始数量后,应该异步提取所有剩余的行。如果所需的行尚未提取,主要的

线程将被堵塞直到行重新可用。
adAsyncFetchNonBlocking        指示主要线程在提取期间从未堵塞。如果所请求的行尚未提取,当前行自动移到文件末尾。

[ 本帖最后由 lichaobin 于 2008-12-13 11:11 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-12-13 10:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

ADO代码记录集

首推爱歌。
论坛中用ADO处理Excel文件的帖子整理(更新中)
http://club.excelhome.net/viewth ... replyID=&skin=0

标准代码:
  '-------------------------------------------------------------------------------------
    Public MyFindInData As String                           '要连接查找的数据库名
    Public MyFindInDwb As String                            '要连接查找的工作薄名
    Public MyFindInSht As String                            '要查找的工作表名
    Public MyFindtoData As String                           '存放查找数据的库名
    Public MyFindToTable As String                          '存放查到数据的表名
    Public MyFindToRange As Range                           'SQL后首位目标数据将要存放的单元格
    Public MyFindToRangecol  As Integer                     'SQL后首位目标数据将要存放的单元格的列
    Public MyFindToRangerow  As Integer                     'SQL后首位目标数据将要存放的单元格的行
    Public Sql As String                                    '执行查询的SQL语句,如select查询

   '以上变量在公用ADO引用中声明
    '-------------------------------------------------------------------------------------
Public Sub publicADO()
    Dim cnn As New ADODB.Connection   '定义并同时建立ADO空链接
    Dim rs As New ADODB.Recordset         '定义ADO操作记录集变量名,不能同时用NEW,因为随时会返因不同记录集.
    Dim i As Integer                  '统计记录数
   
    '定义SQL查询后记录及字段名的存放位置
    MyFindToRangecol = MyFindToRange.Column                       'SQL查询字段定位存放列
    MyFindToRangerow = MyFindToRange.Row                          'SQL查询字段定位存放行

         
    '建立与数据库的连接
   
    With cnn
        .Provider = "microsoft.jet.oledb.4.0"   '在引用,Micresoft ActiveX Data  Objects 2.5   微软激活数据库引警提供者,ADO必声明
      If MyFindInData = "" Then     '如果要链接打开的MyFindInData文件非空,原意为类型为非.MDB数据库文件则
        .ConnectionString = "Extended Properties=Excel 8.0;" _
         & "Data Source=" & MyFindInDwb                  '数据源取自当前打开运用VBA的工作表
      End If
        .Open MyFindInData
    End With
   
    '查询数据表
    Set rs = New ADODB.Recordset
    rs.Open Sql, cnn, adOpenKeyset, adLockOptimistic
   
   
   
    '复制字段名,并加粗
    If MyFindToRangerow = 2 Then    '如果存放数据行不是2不用写入字段名
    For i = 1 To rs.Fields.Count
        Cells(1, MyFindToRangecol - 1 + i) = rs.Fields(i - 1).Name
    Next i
    With Range(Cells(1, MyFindToRangecol), Cells(1, MyFindToRangecol - 1 + rs.Fields.Count))
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
    End With
    End If
   
    '复制全部数据
    MyFindToRange.CopyFromRecordset rs         '从数据的开头位复制记录到单元格MyFindToRange
    '设置工作表格式,自动列宽
    ActiveSheet.Columns.AutoFit
    rs.Close
    cnn.Close
    Set rs = Nothing          '释放
    Set cnn = Nothing         '释放
End Sub




我的EXCEL大脑笔记

ADO:
1、[已解决]在ADO中SQL运行错误:select * from [sheet1$!A2:C4]?
原来是这样:select * from [sheet1$A2:C4],不需要!

2、引用:在VBE-引用-勾找ADO后才能如下定义:
Dim Cnn As New ADODB.Connection
Dim Rst As New ADODB.Recordset
或者直接创建对象:
Set Cnn = CreateObject("ADODB.Connection")
Set Rst = CreateObject("ADODB.Recordset")

了解ADO的Connection、Recordset、Command的常用方法及联系
连接MDB数据库
Cnn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Main.mdb" ‘1
连接EXCEL工作表
Cnn.Open"provider=microsoft.jet.oledb.4.0;extended properties=’excel 8.0 ;hdr=no;IMEX=1’;data source=" & 带路径文件名

顺带说一下:
HDR,是否令第一行为字段名,默认为YES;
IMEX,以文本方式读数据。IMEX=1时解决数字与字符混合时,识别不正常的情况
意义如下:0 ---输出模式;1---输入模式;2----链接模式(完全更新能力)


养成好习惯:
连接.打开Provider数据库引擎名称及类型;数据源=全数据库路经名
可拆成:
With Cnn                                         
  .Provider = "Microsoft.Jet.OLEDB.4.0"    '引用ADO引擎属性
  .ConnectionString = "Data Source=" & 带路径文件名 & ";Extended Properties=Excel 8.0;"     '设置连接串
  .Open                '打开连接
  .Execute  SQL语句    '执行SQL语句,也可先建立好链接,处理完后再放到后面再执行           
End With

一般连接后才操作 Recordset、Command对象,但Recordset、Command对功了直接连接参数,可以一气呵成。
Recordset.open "Select 密码 From Users Where 用户名='去年烟花'",Connection,1,1

Select [字段名] From 表1[JION 连接表名2 ON (连接表达式)] [Where 条件] [GROUP BY 分组][HAVING 分组条件] [ORDER BY 排序]

rst.Open Sql, cnn, adOpenKeyset, adLockOptimistic

例子:
Dim 全路径文件名 As String, SQL语句 As String
全路径文件名 = ThisWorkbook.FullName
SQL语句 = "select * form [原始数据$]"   '设置SQL代码语句
Dim Cnn As New ADODB.Connection
Dim Rst As New ADODB.Recordset
With Cnn
   .Provider = "Microsoft.Jet.OLEDB.4.0"    '引用ADO引擎属性
   'ConnectionString 属性:指示用于建立到数据源的连接的信息,子项参数用分号分开,可选
   'ConnectionString=Properties,Data Source;Extended Properties;UserID, Password, Options 子项参数可选
   '即常见连接串="引擎名称;数据源;扩展属性参数='文件类型;表标题;强制转换文本类型';用户ID;密码PassWord"
   
    '连接EXCEL表需注意事项:
    '例HDR=NO 首行是否为字段名,IMEX 表示是否强制转换为文本,IMEX=1时解决数字与字符混合时,识别不正常的情况
    'HDR,是否令第一行为字段名,默认为YES;IMEX,以文本方式读数据
    'IMEX很关键,默认的IMEX为0,这个东西很恶心,自认为很聪明的把数字和字符串给分开了
    '比如有一列数据
    'sss,
    '212,
    '333,
    'abc
    '当读到sss时会认为该列为字符串,然后读到212时判断为数字,类型不匹配就过滤掉了,结果从Excel表中读数据的时候就造成了很多丢失。
   
   '连接ACCESS常用如下:
   '.Provider = "Microsoft.Jet.OLEDB.4.0;Data Source=D:\Main.mdb"
   
   '连联EXCEL表常用如下:(ADO在EXCEL的SQL注意常量字符多加'单引号引住,关键字留个空格, Data Source只能用文件名即薄名FullName,分号分参数项;[表名$区域]为具体表名指定区域,即具体数据源)
   '例如引用数据源即全路径薄名,如"Data Source=fullname全路径文件名
SQL代码中具体表名需加$,如有指定区域的。则”[具体表名$A1:C65535]",这里表和区域不用!,只用$,且不用加路径及薄名。
   .ConnectionString = "Data Source=" & 全路径文件名& ";Extended Properties='Excel 8.0;hdr=no;IMEX=1'"
Sql = "select * from “ & [" & “原始数据$A6:Z7” & ”] “
   ‘'以下三个常用命令,看情况使用
   ‘'连接后可打开可执行即可用Recordset、Command了,要不直接在Recordset、Command用时再连接也行
   .Open                '可带链接参数ConnectionString并打开,不带即打开之前所设的参数连接,当前表如打开则不能用此命令
  .Execute SQL语句     '连接后执行SQL语句,也可先建立好链接,处理完后再放到后面再执行
End With

返回SQL记录集,可按帮助
Rst.Open SQL语句, Cnn, adOpenKeyset, adLockOptimistic

'复制字段名,并加粗, 复制全部数据
For i = 1 To rs.Fields.Count
   Cells(1, MyFindToRangecol - 1 + i) = rst.Fields(i - 1).Name
Next i
With Range(Cells(1, MyFindToRangecol), Cells(1, MyFindToRangecol - 1 + rst.Fields.Count))
.   Font.Bold = True
HorizontalAlignment = xlCenter
End With
.CopyFromRecordset rst

释放:
Sub ExitNothing()
rst.Close
cnn.Close
Set rst = Nothing          '释放
Set cnn = Nothing         '释放
End Sub

出错描述:
Sub ADO()
On Error GoTo Err
代码
Err:
End
MsgBox Err.Description
Call ExitNothing
End Sub


[ 本帖最后由 lichaobin 于 2009-4-10 01:37 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-13 12:40 | 显示全部楼层
有用的内容,收益不少.3Q

TA的精华主题

TA的得分主题

发表于 2008-12-24 17:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
太感谢了!对我相当有用

TA的精华主题

TA的得分主题

发表于 2008-12-24 17:45 | 显示全部楼层
程序语句后面还加了注释!谢谢楼主分享!

TA的精华主题

TA的得分主题

发表于 2009-3-9 20:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-4-2 13:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-4-2 13:42 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-4-2 16:53 | 显示全部楼层

回复 1楼 lichaobin 的帖子

好,留个记号
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-7 13:37 , Processed in 0.040274 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表