Потому что вы используя ADOQuery.Recordset
, который возвращает ссылку на базовый _Recordset
(который не связан с Delphi, но является ссылкой на объект ADO напрямую), ваши варианты ограничены теми, которые ADO поддерживает напрямую , В Delphi TADOQuery
есть методы-обертки, которые скрывают большую сложность работы с ADO на более низком уровне, а использование Recordset
вместо этого сильно ограничивает ваши параметры.
AFAICT, единственный способ сделать это в одной строке будет с помощью длинной линии, которая использует как VarIsNull
функцию и функцию Math.IfThen
(который по умолчанию 0
если опустить AFalse
paremeter):
OneSpell.PerCent := IfThen(not VarIsNull(FQuery.Recordset.Fields[ DB_FLD_PER_CENT].Value), FQuery.Recordset.Fields[DB_FLD_PER_CENT].Value);
Вы можете сделать это в две строки более читаемо с промежуточной OleVariant
переменной (по-прежнему требуя Math
блок):
var
Val: OleVariant;
...
Val := FQuery.Recordset.Fields[DB_FLD_PER_CENT].Value;
OneSpell.PerCent := IfThen(not VarIsNull(Val), Val);
Простейшая альтернатива (с точки зрения кода Delphi, во всяком случае) должна была бы справиться с этим в самом выражении SQL, используя IsNull
или Coalesce
или его эквивалент в MS Access, поэтому вам не нужно беспокоиться об этом в коде приложения ; вы можете просто получить доступ к Value
и знать, что он содержит целое число.
На самом деле, альтернативный простой не использовать RecordSet
вообще, если вы на самом деле не нужно делать (потому что есть несколько наборов записей в ваших TADOCommand
результатов).Если вы просто использовать в Delphi TADOQuery
напрямую, вы можете просто использовать собственные TField.AsXXX
свойства, которые будут обрабатывать преобразования для вас автоматически:
OneSpell.PerCent := FQuery.Fields[DB_FLD_PER_CENT].AsInteger; // Or AsFloat
Что такое 'OneSpell'? Какой тип 'PerCent',' Plus' и 'Quantity'? Является ли 'FQuery'' TADOQuery' или что-то еще? Можете ли вы быть более конкретными, поэтому мы можем попытаться помочь вам? (И да, если вы хотите 0 вместо NULL, самым простым решением для сокращения кода является выполнение этого в самом SQL с использованием 'IsNull()' или 'Coalesce()' или любого эквивалента в любой неуказанной системе базы данных , потому что тогда вашему приложению не нужно беспокоиться о том, что возвращается - он знает, что это будет действительное числовое значение.) –
@kenВысоко говоря, было трудно объяснить, что именно есть, но тип для проценты, плюс и количество должны быть целыми. db огромен, и он бросается, и все 0 займет некоторое время. и если его значение null, процент, плюс, количество не используется, поэтому я решил 0 сжать ошибку. Я надеялся на способ добавить, если оператор в одной строке будет похож на этот 'oneSpell.plus: = if (null), затем 0 else ....', но думал, что есть способ сделать это да его adoquery, используя доступ дб. но предпочел бы сделать это в этих строках кода, если возможно ... однажды agian огромный db .. –
Еще раз, что такое 'FQuery'?Это «TADOQuery»? (Это имеет значение, потому что то, что доступно для использования, зависит от класса. Кроме того, если это «TADOQuery», есть ли на самом деле несколько наборов записей? Если нет, нет необходимости использовать 'FQuery.RecordSet', что делает его проще.) –