【问题标题】:VB6 execution with database is different when stepping through vs running单步执行与运行时,VB6 对数据库的执行是不同的
【发布时间】:2009-11-17 17:02:34
【问题描述】:

我在一个 vb6 应用程序中遇到了以下代码的奇怪场景:

Private database As dao.Database
Set database = openDaoDatabase([some valid database location], False)

createDBField database, "Table", "FirstRow", dao.dbInteger, 0, "0"

Public Sub createDBField(targetDB As dao.Database, strTable As String, strField As String, dbType As dao.DataTypeEnum, Size As Integer, strDefValue As String)
   Dim td  As dao.TableDef
   Dim fld As dao.field

   Set td = targetDB.TableDefs(strTable)
   Set fld = td.CreateField(strField, dbType, 0)
   If dbType = dao.DataTypeEnum.dbText Or dbType = dao.DataTypeEnum.dbMemo Then fld.AllowZeroLength = True
   If strDefValue <> "" Then fld.DefaultValue = strDefValue
   td.Fields.Append fld
   Set td = Nothing
   Set fld = Nothing
End Sub

当我逐步完成时,一切正常,新字段已添加到数据库中。但是,当我简单地运行应用程序时,数据库由于“不一致”而损坏。我添加了一些错误处理,现在得到错误:“无法识别的数据库格式:[路径]”。 搜索了微软的数据库,找到了解决办法:http://support.microsoft.com/kb/238401。我正在使用 Microsoft.Jet.OLEDB.4.0 提供程序,安装了 SP6 并引用了 Microsoft DAO 3.6 对象库,但它仍然无法正常工作!

有什么想法吗?

更新: td.Fields.Append fld 是罪魁祸首。删除所有静默错误处理后,我发现了一个错误:“运行时错误 3343 无法识别的数据库格式”。出于某种原因,我可以跳过它。

【问题讨论】:

  • “On Error Resume Next”是有毒的。把它拿出来,你会发现真正失败的地方。老实说,在 VBA 中使用它“没有充分的理由”。
  • 很少有充分的理由 - 并且需要立即禁用 - 但是在这种情况下,是的,绝对是!
  • @Binary Worrier - 我意识到 On Resume Next 很危险,并已将其删除。谢天谢地,我没有写这个函数。 On Error Resume Next 在这个程序中无处不在,它给我带来的不仅仅是我的头疼。
  • 什么值被传递到导致问题的子程序中?更具体地说是 strField、dbType、Size 和 strDefValue。我在 Access 中使用多年的逻辑有点类似,没有任何此类问题。
  • 您究竟是如何使用 Microsoft.Jet.OLEDB.4.0 提供程序的?

标签: debugging ms-access vb6


【解决方案1】:

我怀疑您的问题是由于 AllowZeroLength 属性而发生的。我怀疑应该将该字段添加到字段集合中并更新 AllowZeroLength 属性。

之后

td.Fields.Append fld

输入如下内容:

Set tdfField = tabledef.Fields(strField)
Set prp = tdfField.CreateProperty("AllowZeroLength", dbboolean, True)
tdfField.Properties.Append prp

注意以上是aircode,未经测试。

也就是说,将文本或 MEMO 字段的 AllowZeroLength 属性默认为 True 对我来说没有多大意义。毕竟,前端用户无法真正直观地区分NULL 值和零长度字符串值。

【讨论】:

  • 我必须说,我很震惊,但这确实有效!非常感谢,托尼!
  • 我应该在制作 cmets 之前阅读所有帖子(见上文)!我讨厌 A2003 默认的 AllowZLS=True 带有紫色的热情。
【解决方案2】:

我没有看到可能是对 database.close 的调用。如果您的 VB 应用程序突然终止,这可能会使数据库处于不一致的状态。

【讨论】:

    【解决方案3】:

    错误发生在哪一行?通常当我遇到这样的 VB 错误时,它们与时间有关。单步执行提供了足够的时间来完成处理。尝试在导致错误的语句之前添加一些 sleep 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      相关资源
      最近更新 更多