ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

ADO中两难的问题(请教figfig兄)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-7-19 09:49 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:ADO技术

在VBA中使用ADO时,使用AddNew的方法写入数据库是很方便的办法,需要写的Sql语句比用Insert Into方法简便多了。但是,如果使用AddNew的方法,就必须定义Recordset集并引用ActiveX,当用户没有引用ActiveX时,程序就会出错。我觉得这与用Execute(strSQL)打开执行Sql语句没有带参数有关,因为默认打开Sql语句是打开仅向前类型的游标,所以导致AddNew出错。有没有办法在用Execute(strSQL)语句时带上参数呢,这样就可两全其美了。

Sub ado() Set cnnExcel = CreateObject("adodb.connection") cnnExcel.Open "Provider=Microsoft.Jet.Oledb.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName strSQL = "Select * From [Data_Item$A:D] " 'Set rstAnswers = cnnExcel.Execute(strSQL)'如果用这句则出现记录集不支持更新的错误 rstAnswers.Open strSQL, cnnExcel, adOpenKeyset, adLockOptimistic'用这句必须引用ActiveX For x = 1 To 5 rstAnswers.AddNew For y = 0 To 3 rstAnswers.Fields(y).Value = Data_Item.Cells(x, y + 6).Value Next y rstAnswers.Update Next x

Set rstAnswers = Nothing Set cnnExcel = Nothing End Sub

[em06]

TA的精华主题

TA的得分主题

发表于 2005-7-19 10:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

加这句试试

set rstanswers=createobject("adodb.recordset")

估计还是不行,好象不支持ADDNEW,DELETE 等等

SQL执行链接式操作,

TA的精华主题

TA的得分主题

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

用figfig兄的办法,在不引用ActiveX的情况下,rstAnswers.Open strSQL, cnnExcel, adOpenKeyset, adLockOptimistic语句出错,报参数类型不正确,我想应该是adLockOptimistic参数不对,但adLockOptimistic是什么意思呢?(我的语句是抄ExcelHome上的,自己都不太明白意思),还有其他参数吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-19 13:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

又看了半天ADO的帮助,看来是不可能实现的了(非常郁闷![em06]),实在不想用Insert Into语句,太麻烦了。引用ActiveX好象是势在必行,但有没有语句可以自动引用ActiveX而不用手工实行呢?期待中……

附:看了半天也没看明白的ADO帮助

Execute 方法 (ADO Connection)

执行指定的查询、SQL 语句、存储过程或特定提供者的文本等内容。

语法

对于非按行返回的命令字符串:

connection.Execute CommandText, RecordsAffected, Options

对于按行返回的命令字符串:

Set recordset = connection.Execute (CommandText, RecordsAffected, Options)

返回值

返回 Recordset 对象引用。

参数

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

RecordsAffected 可选,长整型变量,提供者向其返回操作所影响的记录数目。

Options 可选,长整型值,指示提供者应如何计算 CommandText 参数,可为下列值:

常量说明AdCmdText指示提供者应按命令的文本定义计算 CommandTextAdCmdTable指示 ADO 应生成 SQL 查询以便从 CommandText 命名的表中返回所有行。AdCmdTableDirect指示提供者应从 CommandText 命名的表中返回所有行。AdCmdTable指示提供者应按表名计算 CommandTextAdCmdStoredProc指示提供者应按存储过程计算 CommandTextAdCmdUnknown指示 CommandText 参数中的命令类型未知。adAsyncExecute指示命令应该异步执行。adAsyncFetch指示对在 CacheSize 属性指定的初始数量之后的剩余行使用异步提取。

本列表中前 4 个常量的详细说明请参见 CommandType 属性。

说明

使用 Connection 对象的 Execute 方法,可执行任何在指定连接的 CommandText 参数中传送给方法的查询。如果 CommandText 参数指定按行返回的查询,执行产生的任何结果将存储在新的 Recordset 对象中。如果命令不是按行返回的查询,则提供者返回关闭的 Recordset 对象。

返回的 Recordset 对象始终为只读、仅向前的游标。如需要具有更多功能的 Recordset 对象,应首先创建具有所需属性设置的 Recordset 对象,然后使用 Recordset 对象的 Open 方法执行查询并返回所需游标类型。

CommandText 参数的内容对提供者是特定的,并可以是标准的 SQL 语法或提供者支持的任何特殊命令格式。

该操作完成后将产生 ExecuteComplete 事件。

LockType 属性

指示编辑过程中对记录使用的锁定类型。

设置和返回值

设置或返回以下某个 LockTypeEnum 的值。

常量说明adLockReadOnly默认值,只读。无法更改数据。adLockPessimistic保守式记录锁定(逐条)。提供者执行必要的操作确保成功编辑记录,通常采用编辑时立即锁定数据源的记录的方式。adLockOptimistic开放式记录锁定(逐条)。提供者使用开放式锁定,只在调用 Update 方法时锁定记录。adLockBatchOptimistic开放式批更新。用于与立即更新模式相反的批更新模式。

说明

打开 Recordset 前设置 LockType 属性可指定打开时提供者应该使用的锁定类型。读取该属性可返回在打开的 Recordset 对象上正在使用的锁定类型。Recordset 关闭时 LockType 属性为读/写,打开时该属性为只读。

提供者可能不支持所有的锁定类型。如果某提供者不支持所需的 LockType 设置,则将替换为其他类型的锁定。要确定 Recordset 对象可用的实际锁定功能,请通过 adUpdateadUpdateBatch 使用 Supports 方法。

如果 CursorLocation 属性被设置为 adUseClient,将不支持 adLockPessimistic 设置。设置不支持的值不会产生错误,因为此时将使用支持的最接近的 LockType 的值。

远程数据服务用法 当在客户端 (ADOR) 的 Recordset 对象上使用时,LockType 属性只能设置为 adLockOptimisticBatch

[em06][em06][em06]

TA的精华主题

TA的得分主题

发表于 2005-7-19 16:56 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 13:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
非常非常感谢大头版主!我用rstAnswers.Open strSQL, cnnExcel, 1, 3 语句已搞定!这可是省了很多麻烦啊!其实之前我用[F8]调试的时候已发现'adOpenKeyset和adLockOptimistic在执行时系统会赋予其一个值,但没有想过直接在语句里写,高手就是高手啊! [em02][em02]

TA的精华主题

TA的得分主题

发表于 2005-7-20 13:17 | 显示全部楼层
以下是引用HLAI在2005-7-20 13:03:30的发言: 非常非常感谢大头版主!我用rstAnswers.Open strSQL, cnnExcel, 1, 3 语句已搞定!这可是省了很多麻烦啊!其实之前我用[F8]调试的时候已发现'adOpenKeyset和adLockOptimistic在执行时系统会赋予其一个值,但没有想过直接在语句里写,高手就是高手啊! [em02][em02]

rstAnswers.Open strSQL, cnnExcel, 1, 3

rstAnswers.Open strSQL, cnnExcel, 3, 3

有什么区别吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 13:28 | 显示全部楼层

应该是指CursorType 属性和LockType 属性

CursorType 属性

指示在 Recordset 对象中使用的游标类型。

设置和返回值

设置或返回以下某个 CursorTypeEnum 值。

常量说明

AdOpenForwardOnly仅向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同。当只需要在记录集中单向移动时,使用它可提高性能。

AdOpenKeyset键集游标。尽管从您的记录集不能访问其他用户删除的记录,但除无法查看其他用户添加的记录外,键集游标与动态游标相似。仍然可以看见其他用户更改的数据。AdOpenDynamic动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进行所有类型的移动,但不包括提供者不支持的书签操作。

AdOpenStatic静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所作的添加、更改或删除不可见。

LockType 属性

指示编辑过程中对记录使用的锁定类型。

设置和返回值

设置或返回以下某个 LockTypeEnum 的值。

常量说明

adLockReadOnly默认值,只读。无法更改数据。

adLockPessimistic保守式记录锁定(逐条)。提供者执行必要的操作确保成功编辑记录,通常采用编辑时立即锁定数据源的记录的方式。

adLockOptimistic开放式记录锁定(逐条)。提供者使用开放式锁定,只在调用 Update 方法时锁定记录。

adLockBatchOptimistic开放式批更新。用于与立即更新模式相反的批更新模式。

[此贴子已经被作者于2005-7-20 13:30:19编辑过]

TA的精华主题

TA的得分主题

发表于 2005-11-25 23:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

也请教figfig兄

编制一个小程序,出现"rstAnswers.Open strSQL, cnnExcel, adOpenKeyset, adLockOptimistic语句出错",只好用"Insert Into'的方法解决,看了大家的帖子后,改用rstAnswers.Open strSQL, cnnExcel, 1, 2的形式后工作正常.

但是我这边已经引用了ActiveX,如图:

这是为啥呢? 详情请见: [求助]EXCEL+ADO+ACCESS迷惑问题

http://club.excelhome.net/dispbbs.asp?boardid=2&star=1&replyid=214133&id=136258&skin=0&page=1

[此贴子已经被作者于2005-11-25 23:24:59编辑过]
dL4zGUsG.jpg
hQZtYEHM.jpg

TA的精华主题

TA的得分主题

发表于 2005-7-19 21:13 | 显示全部楼层
以下是引用HLAI在2005-7-19 10:29:23的发言:

用figfig兄的办法,在不引用ActiveX的情况下,rstAnswers.Open strSQL, cnnExcel, adOpenKeyset, adLockOptimistic语句出错,报参数类型不正确,我想应该是adLockOptimistic参数不对,但adLockOptimistic是什么意思呢?(我的语句是抄ExcelHome上的,自己都不太明白意思),还有其他参数吗?

在没有引用情况下,用createobject创建的对象,不能用命名常量。要用具体数据

如:rstAnswers.Open strSQL, cnnExcel,3,3

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-27 13:51 , Processed in 0.057688 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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