求助:VB中批量修改ACCESS数据库表中(20万条记录)某个字段,老报错,请帮忙解决!!!! (在线等)
刚学习VB,自己编写的,想把数据表中18位的身份证全部转换为15为,大家帮忙分析下问题所在!数据表记录大概在20万条左右,运行后老报错:键列信息不足或不正确,更新影响到多行。(附件有截图)
Dim Cnn As ADODB.Recordset
Dim Cn As String
Private Sub Form_Load()
Set Cnn = New Recordset
Cn = "select sfz from Admission"
Cnn.Open Cn, Str, adOpenKeyset, adLockOptimistic, adCmdText
update
End Sub
Private Sub update()
Dim aaa As String
Do While Not Cnn.EOF
If Len(Cnn("sfz")) = 18 Then
aaa = Left(Cnn("sfz"), 6) & Mid(Cnn("sfz"), 9, 9)
Cnn("sfz") = aaa
Cnn.update
End If
Cnn.MoveNext
Loop
End Sub
--------------------编程问答-------------------- 补充: 每次只能执行修改几十条记录就报错:实时错误:2147467259(80004005),键列信息不足或不正确。更新影响到多行 --------------------编程问答-------------------- '我想你最大的问题在于ADODB 的使用语法
'引用 Microsoft ADO Ext 2.5 for ddl and security
'添加Command1
'c:\bwscale.mdb是我的数据库名 bwmain是表名, netwt是一个字段(Val属性)
'我的If rs("netwt") < 0 Then
'你改为If Len(rs("sfz")) = 18 Then
Option Explicit
Dim i%, strSQL$
Dim Conn As Connection
Dim rs As New ADODB.Recordset
Private Sub Form_Load()
Set Conn = New Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & "c:\bwscale.mdb;Persist Security Info=False"
'******************** Combo1 添加此库的所有表名
strSQL = "select * from bwmain"
rs.Open strSQL, Conn, adOpenStatic, adLockOptimistic
If rs.RecordCount > 0 Then rs.MoveFirst
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
Conn.Close
Set rs = Nothing
Set Conn = Nothing
End
End Sub
Private Sub Command1_Click()
For i = 0 To rs.RecordCount - 1
If rs("netwt") < 0 Then
rs("netwt") = rs("netwt") + 100
rs.Update
End If
rs.MoveNext
Next i
MsgBox "更新完成"
End Sub
--------------------编程问答-------------------- 更正:
工程引用Microsoft ActiveX Data Objects 2.5 Library
--------------------编程问答-------------------- aaa = Left(Cnn("sfz"), 6) & Mid(Cnn("sfz"), 9, 9)
Cnn("sfz") = aaa
这两句语法有问题否?? --------------------编程问答--------------------
--------------------编程问答-------------------- 你这样写会得到
Public Sub OpenX()
On Error GoTo ErrorHandler
Dim Cnxn As ADODB.Connection
Dim rstEmployees As ADODB.Recordset
Dim strCnxn As String
Dim strSQLEmployees As String
Dim varDate As Variant
' Open connection
strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
"Initial Catalog='Pubs';Integrated Security='SSPI';"
Set Cnxn = New ADODB.Connection
Cnxn.Open strCnxn
' Open employee table
Set rstEmployees = New ADODB.Recordset
strSQLEmployees = "employee"
rstEmployees.Open strSQLEmployees, Cnxn, adOpenKeyset, adLockOptimistic, adCmdTable
最左边的 6位 跳过第7第8位后, 再加上第9位起算9位 9-17, 第18位你并没得到.
Cnn("sfz") = aaa 我的代码是 rs("sfz") = aaa
建议你库名与表名使用的变量分开使用.
还有一个最要命的地方就是你的这行
Private Sub update()
别用VB保留字update当事件名称,用upd 或 updatea 就是别用 update
--------------------编程问答-------------------- 语法
recordset.Open Source, ActiveConnection, CursorType, LockType, Options --------------------编程问答--------------------
1. 缺少connection
2. rs.open 语法错误 --------------------编程问答-------------------- 由于您是新用户,所以特此介绍一下结贴的方法
如果您问题已经得解决,请您及时结帖给分,以感谢帮助您的朋友。
结帖方法:点击版面右上方或右下方 <管理> ,进入页面后就可以输入密码,分别给分,结帖。
或参考:
http://www.csdn.net/help/over.asp
http://topic.csdn.net/u/20080110/19/7cb462f1-cac6-4c28-848e-0a879f4fd642.html
=============================================================================
问题解决,请及时结贴。
正确结贴方法:
管理帖子--> 给分--> 输入密码--> 结贴
--------------------编程问答-------------------- 谢谢!明天到单位试试看 --------------------编程问答-------------------- 直接用一条update语句试度?我看行! --------------------编程问答--------------------
怎么用? --------------------编程问答--------------------
update Admission set Sfz= Left(sfz, 6) + right(sfz,9) where len(Sfz)=18
大概是这样子吧,不知ACC支不支持Left()和right()函数 --------------------编程问答-------------------- 两者相比那个执行速度比较快点?? --------------------编程问答-------------------- 接分先! --------------------编程问答-------------------- 以后需再关注,现在先帮你顶一下
补充:VB , 数据库(包含打印,安装,报表)