1

我有一个古老的系统,它使用 Access 97 数据库来存储信息。我想每天将 90 多个表中的数据复制到 SQL Server 2008 数据库中。我已经有了 SS2008 中定义的表。

有一个同样古老的 DTS 作业,每个表都有一个单独的 box-line-box。我宁愿使用用代码编写的更易于维护的方法,而不是行和框。(是的,我知道 SSIS 行和框被翻译成 XML,但这对我来说读和写有点困难。)

我无法使用 Linked Server 或 OPENROWSET,因为我的 SS2008 服务器作为 64 位进程运行,因此 OLEDB Jet 驱动程序不可用。OLEDB MSOffice ACE 12.0 驱动程序是 64 位的,但它不应该与数据库服务器一起使用,因为它不是线程安全的(根据 Microsoft)。此外,尽管进行了广泛的研究,但我无法让它在 SS2008 中工作(“找不到可安装的 ISAM”)。我可以在 SSIS 等 32 位程序中使用 OLEDB Jet 读取 Access 表。

因此,我正在寻找一种现代的、非盒装式的、优雅的 32 位解决方案来将表从 Access mdb/mdw 文件复制到 SS2008。

我可以这样做:

  • 单个 T-SQL 脚本
  • 一些 C# 的东西,它进行自省以确定表结构,然后为每个表执行 SQL
  • 一些神奇的“将每个表从这个 OLEDB 复制到那个 SQL Server”包

这个问题有几个关闭的副本(定期将访问数据库复制到 SQL 服务器将访问表迁移到 SQL Server - 初学者),但没有一个处理使 OPENROWSET/Linked Server 成为非选项的 32 位限制。

4

2 回答 2

2

您可以使用 VBA 从 Access 本身内部执行此操作,如下所示:

Public Function CopyTableDataToSqlServer()
Dim tbd As DAO.TableDef, qdf As DAO.QueryDef, connStr As String
connStr = _
        "ODBC;" & _
        "Driver={SQL Server};" & _
        "Server=.\SQLEXPRESS;" & _
        "Database=cloneDB;" & _
        "Trusted_Connection=yes;"
For Each tbd In CurrentDb.TableDefs
    If Not ((tbd.Name Like "MSys*") Or (tbd.Name Like "~*")) Then
        Debug.Print tbd.Name
        Set qdf = CurrentDb.CreateQueryDef("")
        qdf.Connect = connStr
        qdf.SQL = "DELETE FROM [" & tbd.Name & "]"
        qdf.ReturnsRecords = False
        qdf.Execute
        Set qdf = Nothing
        CurrentDb.Execute _
                "INSERT INTO [" & connStr & "].[" & tbd.Name & "] " & _
                "SELECT * " & _
                "FROM [" & tbd.Name & "] ", _
                dbFailOnError
    End If
Next
Set tbd = Nothing
Debug.Print "Done."
End Function
于 2013-06-22T16:51:45.857 回答
1

我对一些 C# 的东西投了票。如果您有大型表,您可能需要注意内存使用情况。

基本思想是这样的:

foreach(tableName in access)
    get the table from access
    optionally clear the target table
    sqlbulkcopy it to target database

更复杂的解决方案是获取两个表并仅更新更改的行。

于 2013-06-22T08:28:47.917 回答