ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: hyefeifei

[原创] 再讲ADO

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-4-3 20:43 | 显示全部楼层
本帖已被收录到知识树中,索引项:ADO技术
hyefeifei 发表于 2016-4-3 16:09
你的这个看了一下,没试你的程序,一般没这样做的,非从excel表更新数据库表的话,可用openrowset函数,
...

因为openrowset对SQL服务器有一定限制,不好操作。谢谢你的回复以及建议

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-3 21:49 | 显示全部楼层
microyip 发表于 2016-4-3 20:43
因为openrowset对SQL服务器有一定限制,不好操作。谢谢你的回复以及建议

一个函数而已,对服务器没限制,需要开启administer bulk operations 权限,至于说开启这个权限有什么安全问题,可以说真的无所谓,放心开启使用就是了。实在不放心,网上找一下开启关闭的sql语句加到程序里。

TA的精华主题

TA的得分主题

发表于 2016-4-3 23:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-4-4 04:57 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-4-4 07:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个必须顶一下,正想学找不着地儿呢

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-4 19:44 | 显示全部楼层
本帖最后由 hyefeifei 于 2016-5-16 14:28 编辑

  话说上一讲说到,要正确插入数据,必须先用Parameters Pefresh方法向数据库取元数据,然后才可以正确插入数据,但是数据库表是我们创建的,我们自然知道字段信息,所以不必去数据库取,直接告诉ado即可。

  全过程如下:

  1、创建一个command对象cmd,为cmd的commandtext属性赋值:

Cmd.CommandText ="INSERT INTO Fltab VALUES (?,?,?,?,?)

  2、用Cmd的createparameter(创建参数)方法,创建5个参数,对应查询语句的5个问号。
  3、把创建的5个参数用参数集合的append方法添加到Parameters(参数集合)中。
  4、为5个参数赋值。
  5、用execute方法执行命令

  见图:

  
12.jpg


  这里第2步创建5个参数,即是告诉ado表的字段信息,这样就不必用refresh方法连数据库去取字段信息了。

  简单讲一下createparameter方法:
   13.jpg
  我把数据库表五个字段的数据类型截给大家看一下:
   14.jpg
  这里sqlnvarchar对应的是adVarChar,也就是说ADO有自己的一套常数,对应于sql的数据类型,那么,我怎么知道sql的int,nvarchar等对应的ado常数呢?在这里,我把常用的整理放在下面,供各位朋友参考,欲求全的话,可以百度一下:

                    ADO                                        SQL Server   
    adBoolean    bit
    adChar
    char
    adCurrency
    money  smallmoney
    adDBTimeStamp
    datetime  smalldatetime
    adDouble
    float
    adInteger
    identity  int
    adNumeric
    decimal  numeric
    adVarWChar
    nvarchar
    adWChar
    nchar

  完整程序代码如下:

  1. Sub InsertAdd()
  2.     Dim cmd As Object
  3.     Dim arr
  4.     Dim i As Long
  5.     Connect "test"
  6.     Conn.Open
  7.     Set cmd = CreateObject("adodb.command")
  8.     arr = ThisWorkbook.Worksheets("Fltab").Range("a2:e29")
  9.     With cmd
  10.         .CommandText = "INSERT INTO Fltab VALUES (?,?,?,?,?)"
  11.         Set .activeconnection = Conn
  12.         '.Parameters.Refresh         '由于下面人工定义了参数类型,所以就不必从服务器取参数类型了
  13.                 '建议这样做,虽然代码多了些,但执行效率高了。
  14.         .Parameters.append .createparameter(, adVarChar, adParamInput, 30)
  15.         .Parameters.append .createparameter(, adInteger, adParamInput)
  16.         .Parameters.append .createparameter(, adVarChar, adParamInput, 20)
  17.         .Parameters.append .createparameter(, adVarChar, adParamInput, 20)
  18.         .Parameters.append .createparameter(, adVarChar, adParamInput, 20)
  19.         For i = 1 To UBound(arr)
  20.             .Parameters(0) = arr(i, 1)
  21.             .Parameters(1) = arr(i, 2)
  22.             .Parameters(2) = arr(i, 3)
  23.             .Parameters(3) = arr(i, 4)
  24.             .Parameters(4) = arr(i, 5)
  25.             .Execute Options:=adCmdText + adExecuteNoRecords
  26.         Next
  27.     End With
  28. End Sub[/align]
复制代码


  这种直接操作数据库的方式虽然没啥问题,但是,我始终感觉,最好还是用select语句,把数据取回本地形成本地临时表,然后再操作数据库比较方便,在这个例子中虽然体现不出这种方式的好处,但你总用临时表,就会越来越觉得临时表方式的方便之处了。那么该如何做呢?

  如果有下一讲,那就下一讲再说吧。

TA的精华主题

TA的得分主题

发表于 2016-4-4 20:58 | 显示全部楼层
hyefeifei 发表于 2016-4-3 10:06
上一讲虽然应者寥寥,还是继续一讲再看吧。
在回答上讲未了提出的问题前,先讲点题外话:
1、虽然是以提 ...
3、学习之前,应该搭建环境,强烈推荐vmware workstation 这款软件,它甚至可以搭建
vsphere环境,强大之处各位可百度一下。有了它,建一个虚拟机,装上sql server2008,学
ado就方便多了,如果没有它,也没有局域网环境,这个ado还真没学。


希望老师在搭建环境的这方面内容可否再扩展一点讲,sql是否一定要装在NT系统上,或win7即可?等等.....谢谢老师!

TA的精华主题

TA的得分主题

发表于 2016-4-4 21:44 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-4-5 08:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-4-5 08:28 | 显示全部楼层
楼主辛苦了,谢谢楼主花那么多时间来和大家分享,我相信应该会有较多的网友需要这部分的知识的,支持!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-4 17:07 , Processed in 0.050679 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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