views:

92

answers:

3

I've come across a weird scenario with the following code in a vb6 app:

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

When I step through, everything works and the new field is added to the database. However, when I simply run the application, the database becomes corrupted due to 'inconsistency'. I added some error handling and now get the error: "Unrecognized database format: [path]". After searching the Microsoft database, I found a solution: http://support.microsoft.com/kb/238401. I'm using the Microsoft.Jet.OLEDB.4.0 provider, have SP6 installed and have a reference to the Microsoft DAO 3.6 Object Library, but it's still not working!

Any thoughts?

Update: td.Fields.Append fld is the culprit. After removing all silent error handling, I was able to catch an error: "Run-time error 3343 Unrecognized Database Format". For some reason, I can just step over it though.

A: 

Which line is the error occurring on? Usually when I run into VB errors like this they are timing related. Stepping through gives enough time for something to finish processing. Try adding some sleep commands before the statement that is causing the error.

Kevin
The error occurs on the 'td.Fields.Append fld' line.
Everett
+1  A: 

I don't see a call to database.close that might be the cause. If your VB app terminates abruptly that might leave the DB in an inconsistent state.

AnthonyWJones
+2  A: 

I suspect your problem is happening because of the AllowZeroLength property. I suspect the field should be added to the fields collection and the AllowZeroLength property updated.

After

td.Fields.Append fld

put something like the following:

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

Note the above is aircode and not tested.

That said, it doesn't make a lot of sense to me for a text or MEMO field's AllowZeroLength property to default to True. After all, the front end user can't really visually distinguish between the NULL value and a zero length string value.

Tony Toews
I must say, I'm shocked, but that worked! Thanks so much, Tony!
Everett
You're quite welcome. Glad I could be of assistance.
Tony Toews
I should read all the posts before making comments (see above)! I hate the A2003 default to AllowZLS=True with a purple passion.
David-W-Fenton