Сравнение FieldValues и FieldByName
Label1.Caption := DataSet['Name']; // то же самое, что и DataSet.FieldValues['Name'] DataSet['Name'] := Label1.Caption;
Первая инструкция работает в большинстве случаев, но когда Name пусто, возникает исключение. Почему это происходит? Из Онлайн справки мы видим, что свойство FieldValues возвращает Variant, а когда поле Name пусто, будет возвращено NULL, тогда как Delphi требует, чтобы NULL было преобразовано в строку, иначе генерируется ошибка.
В этом случае большинство из нас захочет получить пустую строку, когда поле пусто. Чтобы сделать это, мы должны использовать безопасный код:
var a: Variant; { ... } a := DataSet['Name']; if VarIsNull(a) then Label1.Caption := EmptyStr else Label1.Caption := a;
Есть ли другой способ, чтобы сделать это? Используйте метод FieldByName. Метод FieldByName возвращает значение TField и Вы можете использовать AsString, AsInteger и так далее, чтобы преобразовать значение. Когда поле пусто, AsString возвратит пустую строку и никакого исключения, AsInteger возвратит 0. Сделать можно так:
Label1.Caption := DataSet.FieldByName('Name').AsString;
Итог: Из этой статьи мы узнали, что когда мы будет читать значение поля, лучше использовать FieldByName, хотя нужно будет написать немного лишнего кода. Но это сделает Ваш код безопасным. А когда Вы будете записывать данные в поле, лучше использовать свойство FieldValues, это работает очень хорошо и требуется меньше кода.
Комментарии