将数据从访问.mdb文件复制到SQL数据库

时间:2011-03-10 20:55:06

标签: sql ms-access jet

我们有一个运行专有应用程序的客户,他们想从中提取一些数据,以便他们可以在网站上显示它。该应用程序具有导出功能,可将所需数据写入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文件中提取数据? (注意 - 这是受密码保护的文件,因此我们需要一个可以处理该文件的工具。)

3 个答案:

答案 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