Уважаемые коллеги, помогите, пожалуйста !
Сочинил программу на 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]
Проблема при работе с файлами dBase
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Для работы с DBF поищите вместо ADO какие-нибуть нативные простенькие компоненты. И приложение станет тоньше и проблем будет меньше.
Запомните. В базах данных есть разница между строковым значеним нулевой длины, и пустым значением.
Когда вы в таблицу записываете в текстовое поле строку нулевой длины значение поля становистся пустым.
А Null<>'' так как они имеют разные подтипы в типе Variant.
Эта ошибка означает, что движок ADO не может найти ту запись, которую надо проапдейтить. У Вас в таблице первичный ключ определен? Определите первичный ключ. При добавлении формируйте его значение а при редактировании не трогайте. Движок найдет в таблице запись по первичному ключу."Row cannot be located for updating. Some values may have been changed since it was last read".
Второй аргумент у Locate это значение типа вариант. Попробуйте использовать значение Null вместо пустой строки.Также не работает метод поиска по пустому значению текстового поля ...ADOTable.Locate('...', ' ', [])
Запомните. В базах данных есть разница между строковым значеним нулевой длины, и пустым значением.
Когда вы в таблицу записываете в текстовое поле строку нулевой длины значение поля становистся пустым.
А Null<>'' так как они имеют разные подтипы в типе Variant.