我希望在将一些 Excel 数据导入数据库后自动更新 MS Access 中许多字段的数据类型。
几乎所有字段都设置为Text
字段,这显然会影响任何依赖date
数据才能准确运行的查询。
举个例子,几个“截止日期”字段的数据类型被设置为text
导入后,而我要求将它们设置为date
;我可以手动更新每种数据类型,但我想知道是否可以自动化这个过程以节省时间,因为我将定期将数据导入这个数据库。
非常感谢。
答案1
在设计视图中打开表并更改数据类型。这将更改表中的字段,从而更改存储在那里的所有记录。
请记住,您在字段属性中选择的格式可能会导致显示问题,具体取决于数据的当前格式。如果数据在导入时一致,并且格式符合您的要求,则应该没问题。
答案2
下面是我编写的一些代码,用于更改必须作为所有文本字段导入的 CSV 数据的字段大小。该代码从我创建的字段、大小和类型表中获取字段信息,并且可以通过更改该表轻松进行修改。
Sub AlterFieldStructure()
' this procedure changes the field size and field types (both text and number fields)
' in the "Rebuild Copy of Grade YYYY" tables
Dim db As Database
Dim cn As New ADODB.Connection
Dim rs_fields As New ADODB.Recordset
Dim rs_yrtable As New ADODB.Recordset
Dim SQL As String
Dim fieldlist As String
Dim yr As Variant
Dim yrArr As Variant
Dim fld As Variant
Dim fldArr()
Dim i As Long
Dim j As Long
Dim ErrMsg As String
On Error GoTo Err
Set db = CurrentDb
Set cn = CurrentProject.Connection
' get list of fields to query the "Copy from Grade YYYY" tables
SQL = "SELECT FieldName, DataType, FieldSize FROM GradeTableFields;"
rs_fields.Open SQL, cn
rs_fields.MoveFirst
i = 1
' Array for field name, datatype, and size
Do Until rs_fields.EOF = True
If rs_fields!FieldName <> "ID" Then
ReDim Preserve fldArr(1 To 3, 1 To i)
fldArr(1, i) = rs_fields!FieldName
fldArr(2, i) = rs_fields!DataType
fldArr(3, i) = rs_fields!FieldSize
fieldlist = fieldlist & rs_fields!FieldName & ", "
i = i + 1
End If
rs_fields.MoveNext
Loop
j = i - 1
rs_fields.Close
Set rs_fields = Nothing
fieldlist = Left(fieldlist, Len(fieldlist) - 2)
yrArr = Array(2008, 2009, 2010, 2011, 2012)
For Each yr In yrArr
' for each field in field array
For i = 1 To j
SQL = "ALTER TABLE [Rebuild Copy of Grade " & yr & "] ALTER COLUMN " & _
"[" & fldArr(1, i) & "] "
If fldArr(2, i) = "Text" Then
SQL = SQL & "Text(" & fldArr(3, i) & ");"
ElseIf fldArr(2, i) = "Number" Then
SQL = SQL & fldArr(3, i) & ";"
Else
MsgBox "DataType for " & fldArr(1, i) & " is not Text or Number", vbExclamation + vbOKOnly
Exit Sub
End If
Debug.Print SQL
db.Execute SQL, dbFailOnError
Next i
Next yr
cn.Close
Set cn = Nothing
Set db = Nothing
Exit Sub
Err:
ErrMsg = "Error: " & Err.Number & " " & " " & Err.Description
Debug.Print ErrMsg
cn.Close
Set cn = Nothing
Set db = Nothing
End Sub
答案3
我已经设法自己解决了这个问题,并将尽我所能提供最好的解释:
这是一个与我的电子表格中的数据相关的非常具体的问题;前段时间出现了一个问题,第一行/字段标题应用不正确,导致我的数据库中的字段名称以数字形式递增。经过一番研究,我找到了一种解决这个问题的方法,然后就出现了我向您提出的问题。现在,我放弃了之前的解决办法,对我的电子表格进行了许多小的调整,一切似乎又恢复正常了。
抱歉,我无法提供更具信息量的解释;我相信你们都能理解,这是我个人特有的问题,如果我要提供更详细的解释,那么在没有任何相关背景知识支撑的情况下,解释就没有意义。
非常感谢您的建议——所有有用的贡献都已得到适当投票。