C# 编码的MDB表和内容
我有一个非常旧的VB 16位应用程序,它可以使用.MDB文件,因为还有一个.MDA文件——因此我猜它是使用access 2.0制作的。需要把我们的表格、关系和内容拿出来。表数据采用“丹麦”语言 我的老板有版权,但没有管理员用户名和密码。应用程序运行良好,这意味着应用程序能够连接到MDB文件并使用它。我在Windows7 32位机器上运行它 数据库似乎是经过编码的。知道他们使用RC4编码,并且.MDB头包含它的密钥 是否有一种方法可以从encoded.MDB中获取表和数据。我试过我的mdb解锁工具,大多数工具都不知道它是.mdb,但应用程序可以工作 我急切地想找到一个解决办法。非常感谢您的帮助 知道他们使用RC4编码,并且.MDB头包含 信息技术有没有办法从encoded.MDB中获取平板电脑和数据 必须使用对象模型代码从Access数据库文件中删除所有内容。以下是从损坏的Access数据库提取数据的脚本:C# 编码的MDB表和内容,c#,ms-access,vb6,encryption,C#,Ms Access,Vb6,Encryption,我有一个非常旧的VB 16位应用程序,它可以使用.MDB文件,因为还有一个.MDA文件——因此我猜它是使用access 2.0制作的。需要把我们的表格、关系和内容拿出来。表数据采用“丹麦”语言 我的老板有版权,但没有管理员用户名和密码。应用程序运行良好,这意味着应用程序能够连接到MDB文件并使用它。我在Windows7 32位机器上运行它 数据库似乎是经过编码的。知道他们使用RC4编码,并且.MDB头包含它的密钥 是否有一种方法可以从encoded.MDB中获取表和数据。我试过我的mdb解锁工具
Function FilterDB(strFilePath As String)
Dim objAccess As Object
Dim strFolder As String
Dim strCurrentFile As String
Dim strCurrentObject As String
Dim strFilteredDB As String
Dim fs
Dim Ref
Dim f As Object
Dim objtype As AcObjectType
Dim objAllObjects As New Collection
Dim objObjectGroup As Object
Dim intObjType As Integer
Dim i As Integer
Dim j As Integer
Dim intRefNum As Integer
Dim RefItem As Reference
Dim arrayRefs() As String
Dim strErrMsg As String
'Open the source database
Set objAccess = CreateObject("Access.Application.10")
On Error GoTo ErrorHandler
objAccess.OpenCurrentDatabase strFilePath, False
strFolder = Left(strFilePath, InStrRev(strFilePath, "\", Len(strFilePath)))
strFilteredDB = Left(strFilePath, Len(strFilePath) - 4) & "filtered.mdb"
With objAllObjects
.Add objAccess.CurrentData.AllQueries
.Add objAccess.CurrentProject.AllForms
.Add objAccess.CurrentProject.AllReports
.Add objAccess.CurrentProject.AllMacros
.Add objAccess.CurrentProject.AllModules
.Add objAccess.CurrentProject.AllDataAccessPages
End With
Set fs = CreateObject("Scripting.FileSystemObject")
If Not fs.folderexists(strFolder & "\texttmp") Then
fs.CreateFolder (strFolder & "\texttmp")
End If
For i = 1 To objAllObjects.Count
If objAllObjects(i).Count > 0 Then
For j = 0 To objAllObjects(i).Count - 1
Set objObjectGroup = objAllObjects(i)
strCurrentObject = objObjectGroup(j).Name
intObjType = objObjectGroup(j).Type
objAccess.SaveAsText intObjType, strCurrentObject, _
strFolder & "texttmp\" & strCurrentObject & intObjType & ".txt"
Next j
End If
Next i
'Bring in All the references
On Error Resume Next
ReDim arrayRefs(objAccess.References.Count - 1, 2) As String
For Each RefItem In objAccess.References()
If Not IsError(RefItem.Name) Then
arrayRefs(intRefNum, 0) = RefItem.Name
arrayRefs(intRefNum, 1) = RefItem.FullPath
intRefNum = intRefNum + 1
End If
Next RefItem
On Error GoTo ErrorHandler
Debug.Print ""
objAccess.Quit
Set objAccess = Nothing
Set objAccess = CreateObject("Access.Application")
objAccess.NewCurrentDatabase strFilteredDB
'Finds the first occurrence of a text file in the
'texttmp folder.
strCurrentFile = Dir(strFolder & "\texttmp" & "\*.txt")
'Count the files in the folder.
Set f = fs.GetFolder(strFolder)
'Check to see if the folder is empty.
'If not, load in all the files from there
If f.Files.Count <> 0 Then
Do Until strCurrentFile = ""
intObjType = Mid(strCurrentFile, Len(strCurrentFile) - 4, 1)
objAccess.LoadFromText intObjType, _
Left(strCurrentFile, Len(strCurrentFile) - 5), _
strFolder & "\texttmp\" & strCurrentFile
strCurrentFile = Dir
Loop
End If
On Error Resume Next
For i = 0 To UBound(arrayRefs())
Set Ref = objAccess.References.AddFromFile(arrayRefs(i, 1))
Next i
MsgBox "Finished creating filtered file:" & Chr(10) _
& objAccess.CurrentProject.FullName & "."
FunctionEnd:
On Error Resume Next
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.folderexists(strFolder & "\texttmp") Then
fs.deletefolder (strFolder & "\texttmp")
End If
objAccess.Quit
Set objAccess = Nothing
Set f = Nothing
Exit Function
ErrorHandler:
Select Case Err.Number
Case 58, 7866
strErrMsg = "The path\file name " & strFilePath _
& " may be incorrect or the " _
& Chr(10) & " database is opened exclusively by someone else." _
& Chr(10) & Chr(10) & _
"Please insure your path and file name are correct " _
& Chr(10) & "and the database is not open."
Case 7865
strErrMsg = "The follwing database:" & Chr(10) & Chr(10) _
& strFilteredDB & Chr(10) & Chr(10) _
& "already exists." _
& Chr(10) & Chr(10) & _
" Please rename, move, or delete it before running" _
& "the FilterDB function."
Case Else
strErrMsg = "Access Error #" & Err.Number & Chr(10) & Chr(10) & _
Err.Description
End Select
MsgBox strErrMsg
GoTo FunctionEnd
End Function
函数FilterDB(strFilePath作为字符串)
作为对象的暗淡对象
作为字符串的Dim strFolder
将strCurrentFile设置为字符串
作为字符串的Dim strCurrentObject
作为字符串的Dim strFilteredDB
暗fs
暗参考
将f作为对象
作为对象类型的Dim objtype
将对象对象变暗为新集合
Dim objObjectGroup作为对象
Dim InObjType为整数
作为整数的Dim i
作为整数的Dim j
Dim intRefNum作为整数
以它们作为参考
Dim arrayRefs()作为字符串
Dim strErrMsg作为字符串
'打开源数据库
Set objAccess=CreateObject(“Access.Application.10”)
关于错误转到错误处理程序
objAccess.OpenCurrentDatabase strFilePath,False
strFolder=Left(strFilePath,InStrRev(strFilePath,“\”,Len(strFilePath)))
strFilteredDB=Left(strFilePath,Len(strFilePath)-4)和“filtered.mdb”
带对象
.Add objAccess.CurrentData.AllQueries
.添加objAccess.CurrentProject.AllForms
.添加objAccess.CurrentProject.AllReports
.添加objAccess.CurrentProject.AllMacros
.添加objAccess.CurrentProject.AllModules
.添加objAccess.CurrentProject.AllDataAccessPages
以
设置fs=CreateObject(“Scripting.FileSystemObject”)
如果不是fs.folderexists(strFolder&“\texttmp”),则
fs.CreateFolder(strFolder&“\texttmp”)
如果结束
对于i=1到objAllObjects.Count
如果objAllObjects(i).Count>0,则
对于对象(i),j=0。计数-1
设置objObjectGroup=objAllObjects(i)
strCurrentObject=objObjectGroup(j).Name
intObjType=ObjJobjectGroup(j)。类型
OBJACESS.SaveAsText INTOBJECTYPE、STRURRENTOBJECT、_
strFolder&“texttmp\”&strCurrentObject&intObjType&“.txt”
下一个j
如果结束
接下来我
“把所有的参考资料都带进来
出错时继续下一步
将arrayRefs(objAccess.References.Count-1,2)重拨为字符串
对于objAccess.References()中的每个RefItem
如果不是IsError(RefItem.Name),则
arrayRefs(intRefNum,0)=refeem.Name
arrayRefs(intRefNum,1)=refeem.FullPath
intRefNum=intRefNum+1
如果结束
下一步
关于错误转到错误处理程序
调试。打印“”
objAccess.退出
设置对象访问=无
Set objAccess=CreateObject(“Access.Application”)
objAccess.NewCurrentDatabase strFilteredDB
'在中查找文本文件的第一个匹配项
'文本TMP文件夹。
strCurrentFile=Dir(strFolder&“\texttmp”&“\*.txt”)
'对文件夹中的文件进行计数。
Set f=fs.GetFolder(strFolder)
'检查文件夹是否为空。
'如果不是,则从那里加载所有文件
如果f.Files.Count为0,则
直到strCurrentFile=“”
intObjType=Mid(strCurrentFile,Len(strCurrentFile)-4,1)
objAccess.LoadFromText到bjType_
左(strCurrentFile),长(strCurrentFile)-5_
strFolder&“\texttmp\”&strCurrentFile
strCurrentFile=Dir
环
如果结束
出错时继续下一步
对于i=0到UBound(arrayRefs())
Set Ref=objAccess.References.AddFromFile(arrayRefs(i,1))
接下来我
MsgBox“已完成创建筛选文件:”&Chr(10)_
&objAccess.CurrentProject.FullName&“
功能结束:
出错时继续下一步
设置fs=CreateObject(“Scripting.FileSystemObject”)
如果fs.folder存在(strFolder&“\texttmp”),则
fs.deletefolder(strFolder&“\texttmp”)
如果结束
objAccess.退出
设置对象访问=无
设置f=无
退出功能
错误处理程序:
选择案例错误编号
案例58,7866
strErrMsg=“路径\文件名”&strFilePath_
&“可能不正确或错误”_
&Chr(10)&“数据库是由其他人专门打开的。”_
&Chr(10)及Chr(10)及_
“请确保您的路径和文件名正确”_
&Chr(10)&“且数据库未打开。”
案例7865
strErrMsg=“以下数据库:”&Chr(10)&Chr(10)_
&strFilteredDB和Chr(10)和Chr(10)_
&“已经存在。”_
&Chr(10)及Chr(10)及_
请在运行之前重命名、移动或删除它_
&“FilterDB函数。”
其他情况
strErrMsg=“访问错误”&Err.Number&Chr(10)&Chr(10)&_
错误描述
结束选择
MsgBox strErrMsg
转到功能结束
端函数
我今天不得不使用这个代码。您必须复制数据库,然后将上述代码粘贴到模块中,并从即时窗口运行mod.FilterDB(“E:\PathToTheCopy.mdb”)
谢谢你,杰里米,我会试试的。嗨,杰里米,我试过上面的代码,它有一个错误-任何一条路径都不正确