在 VB6 中将 DAO DBEngine DataTable 的列从 DataType dbInteger 更改为 dbLong
Posted
技术标签:
【中文标题】在 VB6 中将 DAO DBEngine DataTable 的列从 DataType dbInteger 更改为 dbLong【英文标题】:Change DAO DBEngine DataTable's column from DataType dbInteger to dbLong in VB6 【发布时间】:2010-11-12 10:55:24 【问题描述】:我继承了一个遗留的 VB6 应用程序来维护,而我的 vb6 有点生锈...
我有一个 DAO 表,其中有一个类型为 DAO.DataTypeEnum.dbInteger 的字段,需要将其更改为类型 DAO.DataTypeEnum.dbLong。是否有设置这种新数据类型并保留现有值的快捷 vb6 方法,或者我是否需要创建一个临时列来存储数据,然后删除并重新创建具有新数据类型的列,然后手动迁移数据?
【问题讨论】:
这是一个自动“升级”工具,不是一次性任务 【参考方案1】:Shahkalpesh's answer 很好,如果您的数据库引擎支持 ALTER TABLE ALTER COLUMN。如果您使用的是 Access 数据库引擎(Jet .mdb、ACE .accdb 等),您可以在 ANSI-92 Query Mode(Jet 4.0 和 Access 2002 以上)中使用 ALTER COLUMN。
过去我完全是通过代码来完成的。下面的代码在不使用 ALTER COLUMN 的情况下将字符串字段转换为浮点双精度。它创建一个具有不同名称和正确数据类型的新字段,复制数据,删除原始字段,并将新字段重命名为原始名称。您可以轻松地将其调整为整数到长整数。
Dim fld As DAO.Field
' Cant just change the type of an existing field. '
' Instead have to create the new field with a temporary name, '
' fill it with the required data, delete the old MyField field '
' and then rename the new field. The renaming has to be done '
' with DAO - cant do it through SQL '
' Add TEMP_MyField field: required double field. Will be renamed later '
sSQL = "ALTER TABLE MyTable " & _
"ADD COLUMN TEMP_MyField DOUBLE NOT NULL "
dbDatabase.Execute sSQL, dbFailOnError
' Copy the MyField values to the TEMP_MyField field '
sSQL = "UPDATE MyTable SET TEMP_MyField = CDbl(MyField)"
dbDatabase.Execute sSQL, dbFailOnError
' Delete the original MyField field (the text field) '
sSQL = "ALTER TABLE MyTable DROP COLUMN MyField"
dbDatabase.Execute sSQL, dbFailOnError
' Need to refresh the TableDefs to make sure new field shows up '
dbDatabase.TableDefs.Refresh
' Get a reference to the temporary MyField field we just created '
Set fld = dbDatabase.TableDefs("MyTable").Fields("TEMP_MyField")
' Rename it to the final name we want it to have '
fld.Name = "MyField"
【讨论】:
【参考方案2】:如果这是一次性作业,您可以打开 Access 数据库并更改数据类型。 否则,请对此帖子添加评论。
编辑:您可以在数据库对象上发出 ALTER 语句
CurrentDb.Execute "ALTER TABLE myTable ALTER Column myIntegerColumn Long"
【讨论】:
这是一个自动“升级”工具,不是一次性任务 看看上面的答案是否有帮助。以上是关于在 VB6 中将 DAO DBEngine DataTable 的列从 DataType dbInteger 更改为 dbLong的主要内容,如果未能解决你的问题,请参考以下文章
何时是调用 DBEngine.Idle dbRefreshCache 的合适时间?
VB6、MS Access、DAO - 显示列名不为空的所有记录
为啥我不能使用 VBscript 在 DAO.DBEngine.36 中使用“CompactDatabase”?
DAO.DBEngine 类不再使用 Windows 10 在 MS Access 2016 中注册