收录日期:2020/12/05 23:09:10 时间:2016/07/06 09:02:51 标签:VB基础类
我用VB从一个ACCESS A数据库导一部分表的数据到另外一个ACCESS B,导完后对B进行压缩,再将B数据库上传到一个服务器.但是代码有时候会出现错误,有时候又正常.我把代码贴出来,请各位帮我看看,谢谢
出错的地方是:CompactJetDatabase过程 
出错信息是:CompactJetDatabase error detail: -2147467259 was generated by Microsoft JET Database Engine
不能打开数据库 ''。应用程序可能无法识别该数据库,或文件可能损坏。


代码是:

Sub Main()
 Dim SrcDBPath As String, TarDBPath As String, SZODBPathTemp As String, SZODBPathPerm As String, ServerIP As String, FTPUserName As String, FTPPassword As String
 Dim UploadSuc As Boolean
 SrcDBPath = "C:\Program Files\SYRIS Proximity System V832.11\SY200NTA.mdb"
 TarDBPath = "C:\Program Files\SYRIS Proximity System V832.11\Template.mdb"
 SZODBPathTemp = App.Path & "\SZOAMS_TO_SQL.mdb"
 SZODBPathPerm = App.Path & "\SZOAMS_TO_SQL_Perm.mdb"
 ServerIP = "******"
 FTPUserName = "*****"
 FTPPassword = "*****"
 '开始导数据
If ExportData(SrcDBPath, TarDBPath, SZODBPathPerm) Then
    WriteLog (Date & " " & Time & " Export SY200NTA.mdb and Template.mdb to SZOAMS_TO_SQL_Perm.mdb successfully")
Else
    WriteLog (Date & " " & Time & " Export SY200NTA.mdb and Template.mdb to SZOAMS_TO_SQL_Perm.mdb not successfully")
 End If
 '对新生成的数据库进行压缩
Call CompactJetDatabase(SZODBPathPerm, SZODBPathTemp)
 If Dir(SZODBPathTemp) = "" Then
    WriteLog (Date & " " & Time & " No mdb to be uploaded")
 Else
'上传数据库到服务    
UploadSuc = UpLoadFile(ServerIP, SZODBPathTemp, FTPUserName, FTPPassword)
     If UploadSuc Then
        WriteLog (Date & " " & Time & " Upload SZOAMS_TO_SQL.mdb to HK Server successfully")
     Else
        WriteLog (Date & " " & Time & " Upload SZOAMS_TO_SQL.mdb to HK Server not successfully")
     End If
    Kill SZODBPathTemp
End If
End Sub

'导数据的函数
Private Function ExportData(SrcDBPath As String, TarDBPath As String, SZODBPath As String) As Boolean
 Dim SrcDB As New ADODB.Connection
 Dim TarDB As New ADODB.Connection
 Dim SZOCON As New ADODB.Connection
 Dim RS As New ADODB.Recordset
 Dim Pwd As String, CNStr As String, SZOStr As String
 Dim sql As String, sSQL As String
 Pwd = "pwd"
 ExportData = False
 On Error GoTo errhandle
 CNStr = "Driver={Microsoft Access Driver (*.mdb)};" & "Uid=;Pwd=" & Pwd & ";Dbq=" & SrcDBPath
 SrcDB.Open CNStr

CNStr = "Driver={Microsoft Access Driver (*.mdb)};" & "Uid=;Pwd=" & Pwd & ";Dbq=" & TarDBPath
TarDB.Open CNStr

SZOStr = "Driver={Microsoft Access Driver (*.mdb)};" & "Uid=;Pwd=;Dbq=" & SZODBPath
SZOCON.Open SZOStr

sql = "select * from IOData where (iodate=#" & Date - 1 & "# and iotime>'20:00:00') or (iodate=#" & Date & "# and iotime<='20:00:00') order by iodate"
Set RS = SrcDB.Execute(sql)
SZOCON.Execute ("Delete from IOData")
If Not RS.EOF Then
    Do While Not RS.EOF
        sSQL = "insert into IOData(CardNo,HolderNo,HolderName,IODate,IOTime,IOGateNo,IOGateName,IOStatus,DepartmentNo)"
        sSQL = sSQL & " values ('" & RS("CardNo") & "','" & RS("HolderNo") & "','" & RS("HolderName") & "'"
        sSQL = sSQL & ",'" & RS("IODate") & "','" & RS("IOTime") & "','" & RS("IOGateNo") & "'"
        sSQL = sSQL & ",'" & RS("IOGateName") & "','" & RS("IOStatus") & "','" & RS("DepartmentNo") & "')"
        SZOCON.Execute (sSQL)
    RS.MoveNext
    Loop
End If
RS.Close
end function

'压缩数据库
Public Sub CompactJetDatabase(SourceFile As String, TempFile As String)
Dim FIXDB As New JRO.JetEngine
On Error GoTo errhandle
If Dir(TempFile) <> "" Then
    Kill TempFile
End If
If Dir(SourceFile) <> "" Then
    FIXDB.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & SourceFile, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TempFile
    'Kill SourceFile
    'Name TempFile As SourceFile
End If
WriteLog (Date & " " & Time & " CompactJetDatabase successfully")
errhandle:
   If Err.Number <> 0 Then
          msg = "CompactJetDatabase error detail: " & Str(Err.Number) & " was generated by " _
                  & Err.Source & Chr(13) & Err.Description
          WriteLog (msg)
          Exit Sub
    End If
End Sub

'上传文件模块
Public Function UpLoadFile(IP As String, FileName As String, UserName As String, Password As String) As Boolean
    Dim ShortName As String, RemotePath As String
    Dim ret As Boolean
 On Error GoTo errhandle
    ShortName = GetShortName(FileName)
    RemotePath = "SZOAMS/" & ShortName
    hOpen = TestServer
    If hOpen <> 0 Then
        hConnection = InterConnection(IP, UserName, Password)
        If hConnection <> 0 Then
            ret = FtpPutFile(hConnection, FileName, RemotePath, 0, 1)
            UpLoadFile = ret
        Else
            UpLoadFile = False
        End If
    Else
        UpLoadFile = False
    End If
    InternetCloseHandle hConnection
    InternetCloseHandle hOpen
errhandle:
   If Err.Number <> 0 Then
          msg = "UpLoadFile error detail: " & Str(Err.Number) & " was generated by " _
                  & Err.Source & Chr(13) & Err.Description
          WriteLog (msg)
          UpLoadFile = False
          Exit Function
    End If
End Function

建议你删除另外相同内容的一贴.....

你的压缩代码应该没问题,可能是之前access文件已经损坏,或者加连接没有断开,资源没有释放等等.....
ACCESS复制数据不用打开这么多连接,只要连接要导入数据的数据库就行了:

insert into tb(f1.f2.f3) select f1,f2,f3 from [d:\db2.mdb,pwd=123].tb
谢谢vbman2003的回答.

RS.Close
SrcDB.Close
TarDB.Close
SZOCON.Close
Set RS = Nothing
Set SrcDB = Nothing
Set TarDB = Nothing
Set SZOCON = Nothing
我这样关掉资源了.还是出错原来的问题(有时候会出错,有时候不会)

ExportData函数里还有导另外一个ACCESS的表.怕代码太长了,没有贴出来.
谢谢vbman2003的回答.

RS.Close
SrcDB.Close
TarDB.Close
SZOCON.Close
Set RS = Nothing
Set SrcDB = Nothing
Set TarDB = Nothing
Set SZOCON = Nothing
我这样关掉资源了.还是出错原来的问题(有时候会出错,有时候不会)

ExportData函数里还有导另外一个ACCESS的表.怕代码太长了,没有贴出来.
一步步测试吧
设置断点,在导入数据完成后,手工打开数据库,如果不报错,你就试试作个延时压缩处理....
还有建议你连接ACCESS用Microsoft.Jet.OLEDB.4.0,不要用ACCESS的ODBC驱动......
vbman2003你好,不知道应该怎么做延时压缩处理啊?我是VB新手.
我的意思就是如果能肯定添加数据后,ACCESS数据库是完好的,那么就试式不要立即启动压缩过程,而是稍稍等待一下,延时可以这样
'声明API:   
Public Declare Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)   
'调用:   延时1秒   
Sleep 1000 

   
谢谢vbman2003

小问题——火狐中国版的不支持QQ背景音乐播放? 怎么利用文档相看JAVA中的函数 用法 谁有pudn的帐号,能帮我下载给东西吗? C++终止成员对象被继承的方法? 我做的俄罗斯方块,带老板键和保存功能.. 如何用PHP抓取被人网站上的新商品 安装tomcat问题,弄得头都大了 哪位有pudn的帐号,帮我下载个东西。 【The_End_Of_The_World】第十二天 在Server 2003下安装SQL2005时Analysis services报错 通过tomcat配置c3p0连接池报错 MFC开发遇到的问题,请大家一起进来讨论 C++容器的调试问题 循环显示循环显示循环显示??????? 请帮忙看一下是什么问题? phpcms2007 给商城扩展自定义字段功能问题 关于BCG界面库的问题 2张表的查询 cxDBTreeList不用写代码,如何显示数据库中的相关内容。 菜鸟提问:怎么在VC6.0中打开整个工程 初次使用,有点问题请教 有道28日晚:与7无关的数 古怪的问题,求助! 测试人员发展通道 邀请码大放送了,需要的自己来拿了! Delphi 7.0 中如何获取dbgrid控件中的记录数 c#通过编程如何把swf文件的每一帧内容转成图片(bmp,jpg)? 网站所有栏目用一个无限级分类表可以吗? dedecms 栏目设置 请问写完的DNS域名服务器程序怎么和Mega128单片机连上