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.
Hinweis: 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