2009-10-20 10 views
6

तो मैं एक लिंक की गई तालिका को एमएस एक्सेस 2003 में कोड, संरचना और डेटा में स्थानीय में कॉपी करना चाहता हूं।एमएस एक्सेस में स्थानीय तालिका में एक लिंक की गई तालिका को प्रोग्रामेटिक रूप से कैसे कॉपी करें?

कोड: वीबीए या सी #। या उस मामले के लिए और कुछ भी ..

अद्यतन: मैं प्राथमिक कुंजी रखने के लिए एमएस एक्सेस से कॉपी संरचना और डेटा व्यवहार चाहता हूं। यदि आप एक लिंक की गई तालिका की प्रतिलिपि बनाते हैं, तो आप इसे 'संरचना और डेटा (स्थानीय तालिका)' के रूप में पेस्ट करना चुन सकते हैं, यह है कि मैं कोड में प्राप्त करना चाहता हूं।

उत्तर

6

मेरी समझ यह है कि डीएओ दशमलव डेटा प्रकार का समर्थन नहीं करता है, लेकिन एडीओएक्स करता है। यहां एक अद्यतित प्रक्रिया है जो स्कीमा को एक नई तालिका में कॉपी करने के बजाय ADOX का उपयोग करती है।

नोट का एक दिलचस्प आइटम: जेट के लिए ओएलडीडीबी प्रदाता in this KB article समझाया गया अनुसार सामान्य स्थिति के अनुसार वर्णमाला क्रमशः कॉलम टाइप करता है। मैं सामान्य स्थिति को संरक्षित करने के बारे में चिंतित नहीं था, लेकिन आप हो सकते हैं, इस मामले में आप अपनी आवश्यकताओं को पूरा करने के लिए इस प्रक्रिया को अपडेट कर सकते हैं।

कोड के एडीओएक्स संस्करण के काम के लिए, आपको माइक्रोसॉफ्ट एडीओ एक्सटी के लिए एक संदर्भ सेट करने की आवश्यकता होगी। 2.x डीडीएल और सुरक्षा के लिए (जहां एक्स = संस्करण संख्या; मैंने इस प्रक्रिया का परीक्षण करने के लिए 2.8 का उपयोग किया)। आपको एडीओ के संदर्भ की भी आवश्यकता होगी।

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 

यहाँ मूल डीएओ प्रक्रिया

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

टीएक्स मैन को खो देता है! मुझे बताएं क्या आपको पता है कि इस तरह की एक स्पष्ट चीज़ क्यों है (प्राथमिक कुंजी रखना) आयात डेटा के उपयोग में समर्थित नहीं है? – Peter

+0

मुझे कोई जानकारी नहीं है, विशेष रूप से यह देखते हुए कि एक्सेस कितनी देर तक है। आपको लगता है कि यह कम से कम एक विकल्प होगा ... –

+0

decimals के लिए काम नहीं करता है डर ... – Peter

0

कोशिश docmd.CopyObject या docmd.TransferDatabase

+1

यह सिर्फ जुड़ा हुआ तालिका नकल नहीं करेंगे के बजाय एक स्थानीय तालिका बनाने के है? – Peter

+0

हाँ, मेरे अनुभव में, चला रहा है Docmd.CopyObject "dest_table", ACTable, "source_table" जहां स्रोत तालिका एक लिंक की गई तालिका है, केवल उसी तालिका में लिंक की एक प्रति बनाता है ... – avguchenko

-1

इस क्वेरी बनाएँ और यह

SELECT * INTO MyNewTable FROM LinkedTableName

VBA में आप

docmd.runsql "SELECT * INTO MyNewTable FROM LinkedTableName"

कर सकते हैं संरचना रखने के लिए निष्पादित आप DoCmd.TransferDatabase acImport

करना होगा
+1

कृपया अपडेट देखें, यह क्वेरी प्राथमिक कुंजी – Peter

+0

नहीं रखेगी, आयात भी कुंजी को – Peter

संबंधित मुद्दे