EVariantTypeCastError при преобразовании Variant
Неинициализированные переменные типа Variant имеют значение Unassigned.
Поля классов типа Variant остаются неинициализированными, в отличии от полей других типов:
type TSomeClass = class i : integer; v : variant; end; ... var Obj : TSomeClass; begin Obj := TSomeClass.Create; // Obj.i = 0 // Obj.v = Unassigned ...
Значение Unassigned легко конвертируется в числа (результат - ноль), а значит и в boolean (false), и в дату (30/12/1899). Конвертация unassigned в строки тоже не вызывает у Delphi сложностей, результатом будет пустая строка.
Проблема может возникнуть только при передаче через Variant значений полей датасета. Когда значением поля оказывается null, его преобразование в Variant других типов зависит от значения переменной System.Variants.NullStrictConvert
System.Variants.NullStrictConvert := True; // Значение по умолчанию. Попытка преобразования null в // Variant численных или строковых типов // будет вызывать EVariantTypeCastError. System.Variants.NullStrictConvert := False; // null будет конвертироваться почти как Unassigned.
Почти, потому что можно отдельно настроить, в какое строковое значение будет конвертироваться null. Это задаётся переменной System.Variants.NullAsStringValue:
NullAsStringValue: string = '';