我们有一个运行专有应用程序的客户,他们想从中提取一些数据,以便他们可以在网站上显示它。该应用程序具有导出功能,可将所需数据写入MS Access .MDB文件。
我们使用MS的JET驱动程序编写了一个简单的程序,它只是将相关表复制到SqlServer数据库,其中另一个程序将对它们运行查询以收集所需的内容。这项工作好几年了。
然后供应商更新了他们的专有应用程序,虽然.MDB文件看起来相同,并且在MS Access中查看时显示正确的数据,但当我们使用JET驱动程序提取记录时,我们在程序中获得的内容是否已损坏。有时看起来字段对齐是错误的 - 应该包含23.40的数字字段将包含.23,我将在2150年中获取日期等等。
我的程序在我的机器上运行,处理相同的文件正常工作。在需要运行的服务器上运行的同一程序会读取损坏的数据。
我注意到JET驱动程序的版本 - msjetoledb40.dll - 在我的Windows 7机器上比在我们尝试过的任何服务器上更高,日期更新。所以我认为这可能是一个过时的驱动程序的问题。不幸的是,最新版本的JET驱动程序是SP 8.0,这是我们安装的版本,但是没有用。更高版本仅适用于操作系统安装。
所以:
有没有办法获取和安装更多当前的JET驱动程序?
我们是否因JET驱动程序的版本差异而误导?是否有其他可能导致问题的事情,我们应该关注哪些?
是否有其他方法或工具从MS Access .MDB文件中提取数据? (注意 - 这是受密码保护的文件,因此我们需要一个可以处理该文件的工具。)
答案 0 :(得分:1)
SQL Server提供了不同的导入数据的方法。您可以随时查看构建数据的SSIS作业。您没有提到它的SQL Server版本,但您不必使用客户应用程序来导入数据。
答案 1 :(得分:0)
如果您有Access的副本,则可以为SQL Server设置DSN,然后将表从SQL Server链接到Access。 (文件|获取外部数据|链接或类似的东西。)完成后,您可以使用Access查询将数据推送到SQL Server。
答案 2 :(得分:0)
我实际上有一个VB ASP.NET网站,它使用Access 2000数据库作为后端。当然,我只将其用作只读文件,但我确信写入它也可以。使用此方法不需要对SQLServer执行任何操作。然后,您可以编写自己的方法来访问数据库中的表和查询。
Public Class AccessDatabase
Friend db As New OleDbConnection
Private sPath As String
Public Sub New(ByRef sPath As String)
GetDatabase(sPath)
End Sub
'Use Server.MapPath("App_Data\WebContent.mdb") to load the database.
Private Function GetDatabase(ByRef sPath As String) As OleDbConnection
Try
If db.State <> System.Data.ConnectionState.Open Then
db = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath)
db.Open()
End If
Catch e As Exception
Throw New Exception("Error happened when opening " & sPath, e)
End Try
Return db
End Function
Public Sub Close()
If db.State <> Data.ConnectionState.Closed Then
db.Close()
End If
End Sub
Protected Overrides Sub Finalize()
Try
If Not db Is Nothing Then
If db.State <> Data.ConnectionState.Closed Then
db.Close()
End If
End If
Catch ex As Exception
End Try
End Sub
End Class