Tabellen - Feldgröße/-typ ändern

Wie kann ich die Feldgröße/-typ ändern?

Es besteht unter DAO/ADOX keine Möglichkeit, den Datentyp und die Größe eines Feldes nachträglich zu verändern. Der einzige Ausweg ist, eine weitere Spalte mit den gewünschten Eigenschaften hinzuzufügen, eine Aktualisierungsabfrage durchzuführen, die die Datenwerte von der alten in die neue Spalte überträgt und dann die alte Spalte zu löschen. Hier ist es zu empfehlen, auf die SQL-DDL Anweisungen zurückzugreifen, da dies die Durchführung wesentlich beschleunigt. Bitte beachten Sie auch hier, dass, falls das zu verändernde Feld einen Index enthält, diesen Index vorab zu löschen.

HinweisHinweis: Ab Jet 4.0 (Access 2000 oder höher), benötigen Sie diesen umständlichen Weg nicht mehr. Hier können Sie es mit einer einfachen SQL-DDL-Anweisung realisieren.

DAO-Variante

Beispiel:

Public Function DAO_ChangeFieldType(pdbs As DAO.Database, _
                                    psTable As String, _
                                    psField As String, _
                                    psFieldType As String, _
                                    Optional plFieldSize As Long = 0) _
                                    As Boolean
 
  On Error GoTo HandleErr
 
  Dim sSQL As String
  Const csText As String = "TEXT"
 
  '// Erstellung eines Dummyfeldes mit dem
  '// neuen Feldtypen
  sSQL = "ALTER TABLE [" & psTable & _
         "] ADD COLUMN AlterTempField " & psFieldType
 
  If psFieldType = csText Then
    If plFieldSize > 0 Then
      sSQL = sSQL & "(" & plFieldSize & ")"
    End If
  End If
 
  pdbs.Execute sSQL, dbFailOnError
 
  '// Die bestehenden Daten in das Dummyfeld kopieren
  sSQL = "UPDATE DISTINCTROW [" & psTable & _
         "] SET AlterTempField = [" & psField & "]"
  pdbs.Execute sSQL, dbFailOnError
 
  '// das alte Feld löschen und die Auflistung aktualisieren
  sSQL = "ALTER TABLE [" & psTable & _
         "] DROP COLUMN [" & psField & "]"
  pdbs.Execute sSQL, dbFailOnError
 
  pdbs.TableDefs("[" & psTable & "]").Fields.Refresh
 
  ' Das Dummyfeld mit der alten Bezeichnung umbenennen
  pdbs.TableDefs("[" & psTable & _
                 "]").Fields("AlterTempField").Name = psField
 
  DAO_ChangeFieldType = True
 
HandleExit:
  Exit Function
 
HandleErr:
  Select Case Err.Number
    Case Else
      MsgBox "Fehler " & Err.Number & ": " & _
             Err.Description, vbCritical, _
             "modKap02.DAO_ChangeFieldType"
  End Select
  DAO_ChangeFieldType = True
  Resume HandleExit
End Function
ADOX-Variante

Beispiel:

Public Function ADO_ChangeFieldType(pcnn As ADODB.Connection, _
                                    psTable As String, _
                                    psField As String, _
                                    psFieldType As String, _
                                    Optional plFieldSize As Long = 0) _
                                    As Boolean
 
  On Error GoTo HandleErr
 
  Dim sSQL As String
  Dim cat  As New ADOX.Catalog
  Const csText As String = "TEXT"
 
  cat.ActiveConnection = pcnn
 
  '// Erstellung eines Dummyfeldes mit dem
  '// neuen Feldtypen
  sSQL = "ALTER TABLE [" & psTable & _
         "] ADD COLUMN AlterTempField " & psFieldType
 
  If psFieldType = csText Then
    If plFieldSize > 0 Then
      sSQL = sSQL & "(" & plFieldSize & ")"
    End If
  End If
 
  pcnn.Execute sSQL, dbFailOnError
 
  '// Die bestehenden Daten in das Dummyfeld kopieren
  sSQL = "UPDATE DISTINCTROW [" & psTable & _
         "] SET AlterTempField = [" & psField & "]"
  pcnn.Execute sSQL, dbFailOnError
 
  '// das alte Feld löschen und die Auflistung aktualisieren
  sSQL = "ALTER TABLE [" & psTable & _
         "] DROP COLUMN [" & psField & "]"
  pcnn.Execute sSQL, dbFailOnError
 
  ' Das Dummyfeld mit der alten Bezeichnung umbenennen
  cat.Tables(psTable).Columns("AlterTempField").Name = psField
 
  ADO_ChangeFieldType = True
 
HandleExit:
  If Not cat Is Nothing Then Set cat = Nothing
  Exit Function
 
HandleErr:
  Select Case Err.Number
    Case Else
      MsgBox "Fehler " & Err.Number & ": " & _
             Err.Description, vbCritical, _
             "modKap02.ADO_ChangeFieldType"
  End Select
  ADO_ChangeFieldType = False
  Resume HandleExit
End Function
SQL-DDL-Variante (ab Jet 4.0)

Beispiel:

' DAO-Variante
Public Function DDL_ChangeFieldDao(pdbs As DAO.Database, _
                                   psTable As String, _
                                   psFieldName As String, _
                                   psFieldType As String, _
                                   Optional plFieldSize As Long = 0) _
                                   As Boolean
 
  On Error GoTo HandleErr
  Dim sSQL As String
  Const csText As String = "TEXT"
 
  sSQL = "ALTER TABLE " & psTable & " ALTER COLUMN " & psFieldName & _
          " " & psFieldType
  If psFieldType = csText Then
    If plFieldSize > 0 Then
      sSQL = sSQL & "(" & plFieldSize & ")"
    End If
  End If
 
  pdbs.Execute sSQL, dbFailOnError
  DDL_ChangeFieldDao = True
 
HandleExit:
  Exit Function
 
HandleErr:
  Select Case Err.Number
    Case Else
      MsgBox "Fehler " & Err.Number & ": " & _
             Err.Description, vbCritical, _
             "modKap02.DDL_ChangeFieldDao"
  End Select
  DDL_ChangeFieldDao = False
  Resume HandleExit
End Function
 
' ADO-Variante
Public Function DDL_ChangeFieldAdo(pcnn As ADODB.Connection, _
                                   psTable As String, _
                                   psFieldName As String, _
                                   psFieldType As String, _
                                   Optional plFieldSize As Long = 0) _
                                   As Boolean
 
  On Error GoTo HandleErr
  Dim sSQL As String
  Const csText As String = "TEXT"
 
  sSQL = "ALTER TABLE " & psTable & " ALTER COLUMN " & psFieldName & _
          " " & psFieldType
  If psFieldType = csText Then
    If plFieldSize > 0 Then
      sSQL = sSQL & "(" & plFieldSize & ")"
    End If
  End If
 
  pcnn.Execute sSQL, dbFailOnError
  DDL_ChangeFieldAdo = True
 
HandleExit:
  Exit Function
 
HandleErr:
  Select Case Err.Number
    Case Else
      MsgBox "Fehler " & Err.Number & ": " & _
             Err.Description, vbCritical, _
             "modKap02.DDL_ChangeFieldAdo"
  End Select
  DDL_ChangeFieldAdo = False
  Resume HandleExit
End Function