2008-10-06 156 views
12

是否有任何简单的方法从Microsoft Access(2007)检索表创建DDL,还是我必须自己使用VBA编码来读取表结构?从Microsoft Access表创建DDL

我有大约30个表,我们正在移植到Oracle,如果我们可以从Access定义中创建表,它会使生活更轻松。

回答

17

感谢您的其他建议。当我在等待时,我写了一些VBA代码来完成它。这并不完美,但为我做了这份工作。

Option Compare Database 
Public Function TableCreateDDL(TableDef As TableDef) As String 

     Dim fldDef As Field 
     Dim FieldIndex As Integer 
     Dim fldName As String, fldDataInfo As String 
     Dim DDL As String 
     Dim TableName As String 

     TableName = TableDef.Name 
     TableName = Replace(TableName, " ", "_") 
     DDL = "create table " & TableName & "(" & vbCrLf 
     With TableDef 
      For FieldIndex = 0 To .Fields.Count - 1 
       Set fldDef = .Fields(FieldIndex) 
       With fldDef 
        fldName = .Name 
        fldName = Replace(fldName, " ", "_") 
        Select Case .Type 
        Case dbBoolean 
         fldDataInfo = "nvarchar2" 
        Case dbByte 
         fldDataInfo = "number" 
        Case dbInteger 
         fldDataInfo = "number" 
        Case dbLong 
         fldDataInfo = "number" 
        Case dbCurrency 
         fldDataInfo = "number" 
        Case dbSingle 
         fldDataInfo = "number" 
        Case dbDouble 
         fldDataInfo = "number" 
        Case dbDate 
         fldDataInfo = "date" 
        Case dbText 
         fldDataInfo = "nvarchar2(" & Format$(.Size) & ")" 
        Case dbLongBinary 
         fldDataInfo = "****" 
        Case dbMemo 
         fldDataInfo = "****" 
        Case dbGUID 
         fldDataInfo = "nvarchar2(16)" 
        End Select 
       End With 
       If FieldIndex > 0 Then 
       DDL = DDL & ", " & vbCrLf 
       End If 
       DDL = DDL & " " & fldName & " " & fldDataInfo 
       Next FieldIndex 
     End With 
     DDL = DDL & ");" 
     TableCreateDDL = DDL 
End Function 


Sub ExportAllTableCreateDDL() 

    Dim lTbl As Long 
    Dim dBase As Database 
    Dim Handle As Integer 

    Set dBase = CurrentDb 

    Handle = FreeFile 

    Open "c:\export\TableCreateDDL.txt" For Output Access Write As #Handle 

    For lTbl = 0 To dBase.TableDefs.Count - 1 
     'If the table name is a temporary or system table then ignore it 
     If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _ 
     Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then 
      '~ indicates a temporary table 
      'MSYS indicates a system level table 
     Else 
      Print #Handle, TableCreateDDL(dBase.TableDefs(lTbl)) 
     End If 
    Next lTbl 
    Close Handle 
    Set dBase = Nothing 
End Sub 

我从来没有声称是VB程序员。

+0

不工作的十进制领域 – Peter 2009-10-28 12:10:32

2

我已经做到了这一点:

有从Access到SQL Server的 “升迁” 的工具。做到这一点,然后使用优秀的SQL Server工具来生成脚本。

http://support.microsoft.com/kb/237980

+0

这不相关! – 2009-09-09 11:44:03

+1

@iDevlop - 它*是*相关,但也许我没有解释正确。原始问题询问是否有创建脚本的方法,或者是否必须手动编写脚本。如果你按照我的指示,你让MS SQL Server为你生成脚本。您仍然需要手动调整Access,但SQL Server技巧会为您带来90%的优势。 – 2009-09-10 02:08:36

0

您可以使用导出功能在Access中的表导出到一个ODBC数据源。将ODBC数据源设置为Oracle数据库,然后右键单击Access“表”选项卡中的表并选择导出。 ODBC是“文件格式”之一 - 它将带来通常的ODBC对话框。

1

您可能想要查看ADOX以获取架构信息。使用ADOX,您可以获得诸如按键,视图,关系等的东西。

不幸的是,我不是一个VB程序员,但在Web上使用ADOX获取表格模式的例子很多。

2

使用Oracle的SQL Developer迁移工作台。

有关于将Access数据库转换为Oracle的完整教程here。如果只有它的结构,那么你可以专注于3.0节。

0

晚会有点晚,但我使用RazorSQL为Access数据库生成DDL。