我在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
当我单步执行时,一切正常,新字段将添加到数据库中。但是,当我只运行应用程序时,由于“不一致”,数据库会损坏。我添加了一些错误处理,现在得到错误:“无法识别的数据库格式:[路径]”。 搜索Microsoft数据库后,我找到了一个解决方案:http://support.microsoft.com/kb/238401。我正在使用Microsoft.Jet.OLEDB.4.0提供程序,安装了SP6并引用了Microsoft DAO 3.6对象库,但它仍然无效!
有什么想法吗?
更新: td.Fields.Append fld是罪魁祸首。删除所有无提示错误处理后,我能够捕获错误:“运行时错误3343无法识别的数据库格式”。出于某种原因,我可以跳过它。
答案 0 :(得分:2)
由于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
值和零长度字符串值。
答案 1 :(得分:1)
我没有看到对database.close的调用可能是原因。如果您的VB应用程序突然终止,可能会使DB处于不一致状态。
答案 2 :(得分:0)
发生错误的是哪一行?通常当我遇到这样的VB错误时,它们与时序有关。单步执行可以为完成处理提供足够的时间。尝试在导致错误的语句之前添加一些睡眠命令。