Выполнение VB6 с базой данных отличается при переходе от запуска - PullRequest
0 голосов
/ 17 ноября 2009

Я столкнулся со странным сценарием со следующим кодом в приложении 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 Неопознанный формат базы данных». По какой-то причине я могу просто перешагнуть через это.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2009

Я подозреваю, что ваша проблема возникает из-за свойства AllowZeroLength. Я подозреваю, что поле должно быть добавлено в коллекцию полей, а свойство AllowZeroLength обновлено.

* После 1005 *

td.Fields.Append fld

поставить что-то вроде следующего:

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

Обратите внимание, что приведенный выше код является воздушным и не проверен.

Тем не менее, для меня не имеет особого смысла текст или свойство MEMO поля AllowZeroLength по умолчанию True. В конце концов, пользователь переднего плана не может визуально различить значение NULL и строковое значение нулевой длины.

1 голос
/ 17 ноября 2009

Я не вижу обращения к database.close, это может быть причиной. Если ваше приложение VB внезапно завершает работу, это может привести к тому, что БД окажется в несогласованном состоянии.

0 голосов
/ 17 ноября 2009

На какой строке происходит ошибка? Обычно, когда я сталкиваюсь с такими ошибками VB, они связаны со временем. Пошаговое выполнение дает достаточно времени для завершения обработки. Попробуйте добавить некоторые спящие команды перед оператором, который вызывает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...