ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助]ADO写入数据到ACCESS(圆满解决)-已添加VB版的Listview隔行显示不同颜色功能

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-8-17 18:03 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
<p>为什么我单击“写入数据”,第一次可以成功的写入数据到ACCESS中,为什么再次单击就出错呢?</p><p>注:上述例子最初出自<strong><font face="宋体">寅鹞的</font></strong><a href="http://club.excelhome.net/viewthread.php?tid=345846">http://club.excelhome.net/viewthread.php?tid=345846</a></p><p>因是初次研究ADO就借用了哈。</p><p> 8dqCqjMi.rar (29.92 KB, 下载次数: 511) <br/></p><p>利用ADO修改数据问题请见12楼。</p><p></p><p></p><p><strong><font color="#0000ff">ADO+SQL导入数据:</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://club.excelhome.net/viewthread.php?tid=346089">http://club.excelhome.net/viewthread.php?tid=346089</a></p>
[此贴子已经被作者于2008-8-31 13:27:24编辑过]


---------VB版的Listview隔行显示不同颜色功能的核心代码见41楼

[ 本帖最后由 fecmen 于 2010-9-23 10:26 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-17 18:04 | 显示全部楼层

里面的原代码如下:

Sub Add_Rcs()
'On Error Resume Next
Dim New_Rsc(1 To 16) As Variant
Dim i As Integer, j As Integer, k As Integer, iRows As Integer, n As Integer
Dim mydata As String, SQL As String, mytable As String, myFieldList() As Variant
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset

mydata = ThisWorkbook.Path & "\单据库2.mdb"
mytable = "入库记录2"
If Dir(mydata) = "" Then
    MsgBox "入库数据库不存在!请联系程序维护人!", vbExclamation, "无法连接数据库"
    Exit Sub
End If

'连接数据库
With cnn
  .Provider = "microsoft.jet.oledb.4.0"
  .Open mydata
End With

'打开“入库表”
rs.Open mytable, cnn, adOpenKeyset, adLockOptimistic     'adLockBatchOptimistic or adLockOptimistic

'取数据行
iRows = Sheets(1).[a65536].End(xlUp).Row

For i = 1 To iRows - 1
  '写数值到数据库
  rs.AddNew
  For j = 1 To 16
    rs.Fields(j - 1) = Sheet1.Cells(i + 1, j)
    'rs.Update
  Next j
Next i
rs.UpdateBatch

rs.Close
cnn.Close
Set cnn = Nothing: Set rs = Nothing
MsgBox "数据写入数据库完毕!", vbOKOnly + vbInformation
End Sub

TA的精华主题

TA的得分主题

发表于 2008-8-17 22:18 | 显示全部楼层

你打开你的数据库 入库记录2 看看,你把入库单编号定义为主键,而你更新的时候又要把该字段列数据添加进去,在一个数据库表里主键是不能重复的,你第一次没有数据时可以但第二次添加肯定要碰到重复的,所以肯定不行的。

1,要么不要定义主键。

2,要么再添一列自动编号列为主键,这样你就能理解为什么要定义主键的意思了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-18 00:48 | 显示全部楼层

太感谢热心的Office2008了!受益了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-18 01:06 | 显示全部楼层

试了下,我去掉了主键后,的确效果不一样了!呵呵,同时也了解了主键了!

但如果定义了主键,怎样避免出现冲突提示呢?难道非得通过循环一遍或利用find方法?

[此贴子已经被作者于2008-8-18 1:09:13编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-19 21:30 | 显示全部楼层
QUOTE:
以下是引用office2008在2008-8-17 22:18:10的发言:

你打开你的数据库 入库记录2 看看,你把入库单编号定义为主键,而你更新的时候又要把该字段列数据添加进去,在一个数据库表里主键是不能重复的,你第一次没有数据时可以但第二次添加肯定要碰到重复的,所以肯定不行的。

1,要么不要定义主键。

2,要么再添一列自动编号列为主键,这样你就能理解为什么要定义主键的意思了。

我取消了所有的主键,游标初始状态是在第一条记录的,为什么向ACCESS数据库写入数据不是替换原有数据,而是在原来的数据的基础上追加呢?

TA的精华主题

TA的得分主题

发表于 2008-8-20 09:07 | 显示全部楼层
 rs.AddNew的意思是增加一条新的记录,so

TA的精华主题

TA的得分主题

发表于 2008-8-20 09:15 | 显示全部楼层

我刚试了下。把

 rs.AddNew
  For j = 1 To 16
    rs.Fields(j - 1) = Sheet1.Cells(i + 1, j)
    'rs.Update  把这个前面的逗号去了不就好了
  Next j
Next i
rs.UpdateBatch

TA的精华主题

TA的得分主题

发表于 2008-8-20 09:19 | 显示全部楼层

我的Access表里曾经定义了一个主键,定义为主键的Fields,是不能允许有重复记录的。我每次写入的记录中,入库单号是重负的,所以第一次可以写入成功,第二次则不行。而如果用数组写的方法(rs.addnew Fieldslist(),Valuelist()),则会出现没有错误的提示而记录却不能写入的结果。后来我把入库单号的主键去除(当然也可以把入库记录号作为唯一值并定义为主键)就正常了。

至于楼主要替换原记录,需要用SQL语句,Replace或Edit方法了。

[此贴子已经被作者于2008-8-20 9:26:20编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-20 22:24 | 显示全部楼层
QUOTE:
以下是引用寅鹞在2008-8-20 9:19:32的发言:

我的Access表里曾经定义了一个主键,定义为主键的Fields,是不能允许有重复记录的。我每次写入的记录中,入库单号是重负的,所以第一次可以写入成功,第二次则不行。而如果用数组写的方法(rs.addnew Fieldslist(),Valuelist()),则会出现没有错误的提示而记录却不能写入的结果。后来我把入库单号的主键去除(当然也可以把入库记录号作为唯一值并定义为主键)就正常了。

至于楼主要替换原记录,需要用SQL语句,Replace或Edit方法了。


应该是这样的!直接用addnew是不行的!像楼上所说的一样的确只是追加一条新纪录,不会覆盖原先记录的其与游标所在的位置无关!

但是也没见recordset有什么replace或edit方法啊?怎么用呢?。。。。能否提供一下应用的示例呢?

好像只有field的Update 方法可用吧。。。  如果还不行可先用delete再addnew,o(∩_∩)o...这是笨着!

Update 方法

保存对 Recordset 对象的当前行或者 Record 对象的 Fields 集合所做的更改。

语法

recordset.Update
  Fields,
  Values
  record.Fields.Update

参数

Fields
  
可选。VariantVariant 数组,Variant 表示单个名称,Variant 数组则表示要修改的字段的名称或序号位置。
Values
  
可选。Variant Variant 数组,Variant 表示单个值,Variant 数组表示新记录中字段的值。

说明

Recordset

Update 方法保存对 Recordset 对象的当前记录所做的全部更改,这些更改是在调用 AddNew 方法或在更改现有记录中的任一字段值之后进行的。Recordset 对象必须支持更新。

若要设置字段值,请执行下列操作之一:

  • Field 对象的 Value 属性指定值并调用 Update 方法。
  • 通过调用 Update 将字段名和值作为参数传递。
  • 通过调用 Update 传递字段名称数组和值数组。

如果使用字段和值的数组,那么两个数组中必须有相同数量的元素。此外,字段名称的顺序必须与字段值的顺序匹配。如果字段数目和顺序与值不匹配,将产生错误。

如果 Recordset 对象支持批更新,在调用 UpdateBatch 方法之前,可以把对一个或多个记录所做的多个更改在本地缓存。如果调用 UpdateBatch 方法时正在编辑当前记录或添加新记录,那么在将批更改传送到提供者之前,ADO 将自动调用 Update 方法保存对当前记录所做的所有挂起的更改。

如果调用 Update 方法前在正在添加或编辑的记录中移动,ADO 将自动调用 Update 保存更改。如果要取消对当前记录所做的任何更改或放弃新添加的记录,必须调用 CancelUpdate 方法。

调用 Update 方法后,当前记录仍然保持当前。

Record

Update 方法最终完成对 Record 对象 Fields 集合中字段的添加、删除和更新。

例如,用 Delete 方法删除的字段将立即被标记为删除,但仍保留在集合中。必须调用 Update 方法将这些字段从提供者的集合中真正删除。

[此贴子已经被作者于2008-8-20 22:54:31编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-13 14:33 , Processed in 0.056099 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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