Проблема при работе с файлами dBase

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
NLugovoy
Сообщения: 1
Зарегистрирован: 11 янв 2005, 08:36

Уважаемые коллеги, помогите, пожалуйста !
Сочинил программу на Delphi 5, работающую с файлами dBase. Записи в базе редактируются не непосредственно в базе, а сначала поля из записи считываются в переменные, редактируются, потом новые значения переменных присваиваются полям в базе с помощью методов ...ADOTable.FieldByName('...').AsString := ... и пересылаются в файл методом ADOTable.UpdateBatch (программа предназначена для работы с базой в сети)
Проблема в следующем. Если есть пустые переменные, соответствующие текстовым полям, то при первом сохранении метод срабатывает нормально. Если сразу же вызвать эту запись на редактирование еще раз и даже, ничего не изменяя, сохранить, то генерируется исключение: "Row cannot be located for updating. Some values may have been changed since it was last read". ("Не могу найти строку для обновления. Некоторые значения были изменены с момента последнего чтения"). Если все текстовые переменные содержат какие-либо значения, то запись подряд можно редактировать и сохранять сколько угодно.
Также не работает метод поиска по пустому значению текстового поля ...ADOTable.Locate('...', ' ', []) (хоть задавай пустое значение для поиска - '', хоть напиши туда количество пробелов, соответствующее длине поля в базе).
Может быть что-то я делаю не так, или нужны какие-либо специальные настройки, о которых я не знаю ? Дело в том, что это мой первый опыт работы с Delphi и нужно мне именно Delphi 5 ???
Дополнительно - информация об исползьзуемом соединении и провайдере:
ADOConnection.ConnectionString:
Provider=MSDASQL.1;Persist Security Info=False;Data Source=Файлы dBASE;Mode=ReadWrite
куда я затем программно подставляю путь к файлам с данными.
Заранее спасибо всем, кто примет участие в решении моих проблем.
[/u]
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Для работы с DBF поищите вместо ADO какие-нибуть нативные простенькие компоненты. И приложение станет тоньше и проблем будет меньше.
"Row cannot be located for updating. Some values may have been changed since it was last read".
Эта ошибка означает, что движок ADO не может найти ту запись, которую надо проапдейтить. У Вас в таблице первичный ключ определен? Определите первичный ключ. При добавлении формируйте его значение а при редактировании не трогайте. Движок найдет в таблице запись по первичному ключу.
Также не работает метод поиска по пустому значению текстового поля ...ADOTable.Locate('...', ' ', [])
Второй аргумент у Locate это значение типа вариант. Попробуйте использовать значение Null вместо пустой строки.
Запомните. В базах данных есть разница между строковым значеним нулевой длины, и пустым значением.
Когда вы в таблицу записываете в текстовое поле строку нулевой длины значение поля становистся пустым.
А Null<>'' так как они имеют разные подтипы в типе Variant.
Ответить