在 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 中注册

Excel VBA DBEngine.CreateWorkspace 失败说无法加载 DLL

VB6 - DAO - 存储过程