我需要将计算字段添加到现有表中。我知道有两种方法可以做到这一点,并且我想知道是否有人对最好的方法以及如何使它们起作用具有任何投入:
我尝试使用第一种方法,但是由于Access无法锁定表,因此我一直收到3211错误。我没有打开桌子。但是,我从已访问表中当前存在哪些字段的窗体调用CreateField。
这是调用CreateField的代码:
`
Public Sub AddFieldToTable(strTable As String, strField As String, nFieldType As Integer)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
On Error GoTo ErrorHandler
Set db = CurrentDb
Set tdf = db.TableDefs(strTable)
Set fld = tdf.CreateField(strField, nFieldType)
tdf.Fields.Append fld
MsgBox "The field named [" & strField & "] has been added to table [" & strTable & "]."
Set tdf = Nothing
Set db = Nothing
Exit Sub
ErrorHandler:
MsgBox "An error has occurred. Number: " & Err.Number & ", description: " & Err.Description
Exit Sub
End Sub
`
Run Code Online (Sandbox Code Playgroud)
我在tdf.fields.append行上收到错误。执行ALTER TABLE语句会更好吗?有哪些权衡?
您可以使用DDL创建字段:
长:
CurrentDb.Execute "ALTER TABLE t ADD COLUMN a Long not null", dbFailOnError
Run Code Online (Sandbox Code Playgroud)
(NOT NULL IDENTITY(1,1)争取自动编号)
CurrentDb.Execute "ALTER TABLE t ADD COLUMN b text(100)", dbFailOnError
Run Code Online (Sandbox Code Playgroud)
布尔值:
CurrentDb.Execute "ALTER TABLE t ADD COLUMN c Bit not null", dbFailOnError
Run Code Online (Sandbox Code Playgroud)
约会时间:
CurrentDb.Execute "ALTER TABLE t ADD COLUMN d datetime null", dbFailOnError
Run Code Online (Sandbox Code Playgroud)
备忘录:
CurrentDb.Execute "ALTER TABLE t ADD COLUMN e memo null", dbFailOnError
Run Code Online (Sandbox Code Playgroud)
显然,这很适合进行功能化,您可以传入自己的永恒枚举(与结合使用Select)来构造字符串并执行它:
Public Sub AddFieldToTable(TableName as string, FieldName as string, _
FieldType as Long, FieldLen as Long, FieldAllowsNull as Boolean)
Dim FieldText as String
Select Case(FieldType)
Case 0:
FieldText = "Long"
Case 1:
FieldText = "text(" & FieldLen & ")"
Case 2:
FieldText = "bit"
Case 3:
FieldText = "datetime"
Case 4:
FieldText = "memo"
End Select
Dim Sql as string
Sql = "ALTER TABLE " & TableName & " ADD COLUMN " & FieldName & " " & FieldText
If FieldAllowsNull then
Sql = Sql & " NULL"
Else
Sql = Sql & " NOT NULL"
End If
CurrentDb.Execute Sql, dbFailOnError
End Sub
Run Code Online (Sandbox Code Playgroud)