2009-09-02 6 views
0

Использование VB 6 и Access 2003Как скопировать таблицу из одной базы данных в другую базу данных?

Я хочу скопировать таблицу из одной базы данных в другую базу данных.

Database1

Table1 
Table2 

database2

Table3 

Выше, я хочу, чтобы скопировать в Таблицу 3 Database1

Expected Output 

Table1 
Table2 
Table3 

Как написать код?

Нужна помощь по коду VB6.

+0

Вы не упомянули, если вам нужна только схема таблицы, которую нужно скопировать, или схему таблицы * и * ее данные. –

ответ

4

Использование ADOX для копирования структуры данных, вероятно, было бы самым простым способом.

Dim sourceCat As New ADOX.Catalog 
Dim targetCat As New ADOX.Catalog 

Set sourceCat.ActiveConnection = connSource 
targetCat.ActiveConnection = connTarget 

Dim sourceTable As ADOX.Table 
Set sourceTable = sourceCat.Tables("TableName") 

Dim newTable As New ADOX.Table 
Set newTable.ParentCatalog = targetCat 
newTable.Name = sourceTable.Name 

Dim sourceCol As ADOX.Column 
Dim newCol As ADOX.Column 

For Each sourceCol In sourceTable.Columns 
    Set newCol = New ADOX.Column 
    newCol.Name = sourceCol.Name 
    newCol.Type = sourceCol.Type 
    newCol.DefinedSize = sourceCol.DefinedSize 
    newCol.ParentCatalog = targetCat 

    newTable.Columns.Append newCol 
Next sourceCol 

targetCat.Tables.Append newTable 

Это довольно простой пример, она игнорирует все индексы и свойства столбцов (например, AUTOINCREMENT).

Более полный пример можно найти here.

+0

Обратите внимание, что вам нужно добавить ссылку на ADOX. –

0

Имейте в виду, что вы не можете быть уверены, что вы извлекли все схемы за столом, даже при использовании обоих ADO (что нужно для CHECK ограничений, WITH COMPRESSION и т.д.) и ACEDAO (которые вам нужно для сложных типов данных и т.д.).

Вот пример такой таблицы:

Sub CantGetCheck() 

    On Error Resume Next 
    Kill Environ$("temp") & "\DropMe.mdb" 
    On Error GoTo 0 

    Dim cat 
    Set cat = CreateObject("ADOX.Catalog") 

    With cat 

    .Create _ 
     "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=" & _ 
     Environ$("temp") & "\DropMe.mdb" 

    With .ActiveConnection 

     Dim Sql As String 
     Sql = _ 
     "CREATE TABLE Test " & _ 
     "(" & _ 
     " data_col INTEGER NOT NULL, " & _ 
     " CONSTRAINT data_col__be_positive " & _ 
     " CHECK (data_col >= 0), " & _ 
     " CONSTRAINT data_col__values " & _ 
     " CHECK (" & _ 
     "   data_col = 0 OR data_col = 1 OR data_col = 2 " & _ 
     "   OR data_col = 3 OR data_col = 4 OR data_col = 5 " & _ 
     "   OR data_col = 6 OR data_col = 7 OR data_col = 8 " & _ 
     "   OR data_col = 9 OR data_col = 10 OR data_col = 11 " & _ 
     "   OR data_col = 12 OR data_col = 13 OR data_col = 14 " & _ 
     "   OR data_col = 15 OR data_col = 16 OR data_col = 17 " & _ 
     "   OR data_col = 18 OR data_col = 19 OR data_col = 20 " & _ 
     "   ) " & _ 
     ");" 
     .Execute Sql 

     Dim rs 

     ' 5 = adSchemaCheckConstraints 
     Set rs = .OpenSchema(5) 

     MsgBox rs.GetString 

    End With 

    Set .ActiveConnection = Nothing 
    End With 

End Sub 

Выходные данные показывают, что в то время как определение для ограничения по имени data_col__be_positive действительно может быть извлечен, то data_col__values определение не может (потому что она превышает 255 символов).

Так что решение всегда состоит в том, чтобы всегда сохранять код, который вы использовали для создания и впоследствии изменяете таблицу. Для меня использование сценариев SQL DDL для этой цели имеет большой смысл (мне не нужны некоторые функции, которые не могут быть созданы с помощью DDL).

Смежные вопросы