2009-10-20 27 views
6

Vì vậy, tôi muốn sao chép một bảng được nối kết sang một mã cục bộ trong mã, cấu trúc và dữ liệu trong MS Access 2003.Làm thế nào để sao chép bảng đã nối kết sang bảng cục bộ trong Ms Access theo cách lập trình?

Mã đang là: VBA hoặc C#. Hoặc bất cứ điều gì khác cho vấn đề đó ..

CẬP NHẬT: Tôi muốn cấu trúc sao chép và hành vi dữ liệu từ truy cập ms để giữ các khóa chính. Nếu bạn sao chép một bảng được liên kết, bạn có thể chọn để dán nó như là 'cấu trúc và dữ liệu (bảng địa phương)' Đó là tôi muốn đạt được trong mã.

Trả lời

6

Sự hiểu biết của tôi là DAO không hỗ trợ kiểu dữ liệu thập phân, nhưng ADOX thực hiện. Đây là một thủ tục được cập nhật sử dụng ADOX thay vì sao chép lược đồ vào một bảng mới.

Một mục thú vị cần lưu ý: Nhà cung cấp OLEDB cho Máy bay phản lực sắp xếp các cột theo thứ tự bảng chữ cái thay vì theo vị trí thứ tự như được giải thích in this KB article. Tôi không quan tâm đến việc bảo tồn vị trí thứ tự, nhưng bạn có thể, trong trường hợp đó bạn có thể cập nhật quy trình này để đáp ứng nhu cầu của bạn.

Để phiên bản ADOX của mã hoạt động, bạn cần đặt tham chiếu đến Microsoft ADO Ext. 2.x cho DDL và Bảo mật (trong đó x = số phiên bản; tôi đã sử dụng 2.8 để kiểm tra quy trình này). Bạn cũng sẽ cần một tham chiếu đến ADO.

Public Sub CopySchemaAndData_ADOX(ByVal sourceTableName As String, ByVal destinationTableName As String) 
On Error GoTo Err_Handler 

Dim cn As ADODB.Connection 
Dim cat As ADOX.Catalog 
Dim sourceTable As ADOX.Table 
Dim destinationTable As ADOX.Table 

Set cn = CurrentProject.Connection 
Set cat = New ADOX.Catalog 
Set cat.ActiveConnection = cn 

Set destinationTable = New ADOX.Table 
destinationTable.Name = destinationTableName 

Set sourceTable = cat.Tables(sourceTableName) 

Dim col As ADOX.Column 
For Each col In sourceTable.Columns 
    Dim newCol As ADOX.Column 
    Set newCol = New ADOX.Column 

    With newCol 
     .Name = col.Name 
     .Attributes = col.Attributes 
     .DefinedSize = col.DefinedSize 
     .NumericScale = col.NumericScale 
     .Precision = col.Precision 
     .Type = col.Type 
    End With 

    destinationTable.Columns.Append newCol 
Next col 

Dim key As ADOX.key 
Dim newKey As ADOX.key 

Dim KeyCol As ADOX.Column 
Dim newKeyCol As ADOX.Column 
For Each key In sourceTable.Keys 
    Set newKey = New ADOX.key 
    newKey.Name = key.Name 
    For Each KeyCol In key.Columns 
     Set newKeyCol = destinationTable.Columns(KeyCol.Name) 
     newKey.Columns.Append (newKeyCol) 
    Next KeyCol 

    destinationTable.Keys.Append newKey 
Next key 

cat.Tables.Append destinationTable 

'Finally, copy data from source to destination table 
Dim sql As String 
sql = "INSERT INTO " & destinationTableName & " SELECT * FROM " & sourceTableName 
CurrentDb.Execute sql 

Err_Handler: 
    Set cat = Nothing 
    Set key = Nothing 
    Set col = Nothing 
    Set sourceTable = Nothing 
    Set destinationTable = Nothing 
    Set cn = Nothing 

    If Err.Number <> 0 Then 
     MsgBox Err.Number & ": " & Err.Description, vbCritical, Err.Source 
    End If 
End Sub 

Dưới đây là các thủ tục DAO gốc

Public Sub CopySchemaAndData_DAO(SourceTable As String, DestinationTable As String) 
On Error GoTo Err_Handler 

Dim tblSource As DAO.TableDef 
Dim fld As DAO.Field 

Dim db As DAO.Database 
Set db = CurrentDb 

Set tblSource = db.TableDefs(SourceTable) 

Dim tblDest As DAO.TableDef 
Set tblDest = db.CreateTableDef(DestinationTable) 

'Iterate over source table fields and add to new table 
For Each fld In tblSource.Fields 
    Dim destField As DAO.Field 
    Set destField = tblDest.CreateField(fld.Name, fld.Type, fld.Size) 
    If fld.Type = 10 Then 
     'text, allow zero length 
     destField.AllowZeroLength = True 
    End If 
    tblDest.Fields.Append destField 
Next fld 

'Handle Indexes 
Dim idx As Index 
Dim iIndex As Integer 
For iIndex = 0 To tblSource.Indexes.Count - 1 
    Set idx = tblSource.Indexes(iIndex) 
    Dim newIndex As Index 
    Set newIndex = tblDest.CreateIndex(idx.Name) 
    With newIndex 
     .Unique = idx.Unique 
     .Primary = idx.Primary 
     'Some Indexes are made up of more than one field 
     Dim iIdxFldCount As Integer 
     For iIdxFldCount = 0 To idx.Fields.Count - 1 
     .Fields.Append .CreateField(idx.Fields(iIdxFldCount).Name) 
     Next iIdxFldCount 
    End With 

    tblDest.Indexes.Append newIndex 
Next iIndex 

db.TableDefs.Append tblDest 

'Finally, copy data from source to destination table 
Dim sql As String 
sql = "INSERT INTO " & DestinationTable & " SELECT * FROM " & SourceTable 
db.Execute sql 

Err_Handler: 
    Set fld = Nothing 
    Set destField = Nothing 
    Set tblDest = Nothing 
    Set tblSource = Nothing 
    Set db = Nothing 

    If Err.Number <> 0 Then 
     MsgBox Err.Number & ": " & Err.Description, vbCritical, Err.Source 
    End If 
End Sub 
+0

Tx man! Hãy cho tôi biết bạn có biết tại sao một điều hiển nhiên như thế này (giữ các khóa chính) không được hỗ trợ với dữ liệu nhập trong truy cập? – Peter

+0

Tôi không có ý tưởng, đặc biệt là trong bao lâu quyền truy cập đã được xung quanh. Bạn sẽ nghĩ rằng nó sẽ là một lựa chọn ít nhất ... –

+0

Không hoạt động cho số thập phân Im sợ ... – Peter

0

thử docmd.CopyObject hoặc docmd.TransferDatabase

+1

Sẽ không nó chỉ cần sao chép các bảng liên kết chứ không phải làm một bảng địa phương? – Peter

+0

có, theo kinh nghiệm của tôi, chạy Docmd.CopyObject "dest_table", acTable, "source_table" trong đó bảng nguồn là bảng được nối kết, chỉ tạo bản sao của liên kết tới cùng một bảng ... – avguchenko

-1

Tạo truy vấn này và thực hiện nó

SELECT * INTO MyNewTable FROM LinkedTableName

Trong VBA bạn có thể làm

docmd.runsql "SELECT * INTO MyNewTable FROM LinkedTableName"

Để giữ cấu trúc bạn sẽ phải làm DoCmd.TransferDatabase acImport

+1

Xem cập nhật, vui lòng truy vấn sẽ không giữ các khóa chính – Peter

+0

Không, việc nhập cũng mất các phím được cách ly – Peter

Các vấn đề liên quan