将ODBC链接的SQL表复制到具有VBA的Access表中

问题描述 投票:1回答:1

我在Access DB中有一些与ODBC链接的SQL-Server表,它们是生产环境。为了进行测试,我想将所有来自SQL Server的数据复制到结构相同的Access表中,以便在开发或测试环境中拥有一组相同的表。使其变得困难:所有这些表都具有自动增量ID,我希望副本具有相同的值,当然,复制的ID字段也应为自动增量long。

因此,这些表的集合:-dbo_tbl_Abcd-dbo_tbl_Efgh等。>

应复制到:-开发_Abcd-Dev_Efgh等。>

或:-Test_Abcd-Test_Efgh等。>

当我为每个表格进行手动复制和粘贴时,它将正常工作。出现对话框“将表粘贴为”,您可以在其中选择以下选项:

链接表仅结构结构与数据将数据追加到现有表中

正确设置名称并选择“结构和数据”后,您将获得一个正确的副本作为Access表,在“自动ID”字段中具有相同的值。我只想通过代码并一次(对于循环)对所有ODBC表执行此操作。当Access提供此手动复制时,必须有一种通过代码进行复制的方法。

我已经尝试过:

DoCmd.CopyObject , "Dev_Abcd", acTable, "dbo_tbl_Abcd"

但是这只会创建更多到同一SQL-Server表的ODBC链接。我也尝试过:

DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentDb.Name, acTable, "dbo_tbl_Abcd", "Dev_Abcd"

这导致以下错误:Microsoft Access数据库引擎找不到该对象。确保对象存在,并且正确拼写了它的名称和路径名。 (错误3011)

我对DoCmd.TransferDatabase进行了很多实验,但是找不到有效的设置。

由于自动递增字段,我没有测试任何“ SELECT INTO”语句。

我在Access DB中有一些与ODBC链接的SQL-Server表,它们是生产环境。为了进行测试,我想将所有来自SQL Server的数据复制到结构相同的Access表中,因此...

我做了类似的事情。将ConnectionString更改为您的环境。也许您必须扩展TranslateDatatype函数。

Function TranslateDatatype(value As Long) As String
  Select Case value
    Case 2: TranslateDatatype = "INT" ' adSmallInt
    Case 3: TranslateDatatype = "LONG" ' adInteger
    Case 200: TranslateDatatype = "STRING" ' adVarChar
    Case 202: TranslateDatatype = "STRING" ' adVarWChar
    Case 17: TranslateDatatype = "BYTE" ' adUnsignedTinyInt
    Case 11: TranslateDatatype = "BIT" ' adBoolean
    Case 129: TranslateDatatype = "STRING" ' adChar
    Case 135: TranslateDatatype = "DATE" ' adDBTimeStamp
  End Select
End Function

Sub CopyFromSQLServer()
  Dim SQLDB As Object, rs As Object, sql As String, i As Integer, tdf As TableDef
  Dim ConnectionString As String
  Set SQLDB = CreateObject("ADODB.Connection")
  ConnectionString = "Driver={SQL Server Native Client 11.0};Server=YourSQLServer;Database=YourDatabase;trustedConnection=yes"
  SQLDB.Open ConnectionString
  SQLDB.CursorLocation = adUseClient
  Set rs = CreateObject("ADODB.Recordset")
  Set rs.ActiveConnection = SQLDB
  For Each tdf In CurrentDb.TableDefs
    rs.Source = "[" & tdf.Name & "]"
    rs.Open
    sql = "("
    i = 0
    Do
      sql = sql & "[" & rs(i).Name & "] " & TranslateDatatype(rs(i).Type) & ", "
      i = i + 1
    Loop Until i = rs.Fields.Count
    rs.Close
    sql = "CREATE TABLE [Dev_" & tdf.Name & "] " & Left(sql, Len(sql) - 2) & ")"
    CurrentDb.Execute sql
    sql = "INSERT INTO [Dev_" & tdf.Name & "] SELECT * FROM [" & tdf.Name & "]"
    CurrentDb.Execute sql
  Next
End Sub
sql-server ms-access access-vba odbc
1个回答
0
投票

我做了类似的事情。将ConnectionString更改为您的环境。也许您必须扩展TranslateDatatype函数。

© www.soinside.com 2019 - 2024. All rights reserved.