我做了类似的事情。将ConnectionString更改为您的环境。也许您必须扩展TranslateDatatype函数。
我在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
我做了类似的事情。将ConnectionString更改为您的环境。也许您必须扩展TranslateDatatype函数。