Я использую Firebird 2.1, драйвер DBExpress от DevArt и Delphi 2010. Некоторые из моих отчетов, которые использовались для работы с Delphi 2006, перестали работать и выпустили сообщение об ошибке, указывающее, что «арифметическое исключение, числовое переполнение , или усечение строк ". Ошибка произошла в этот момент в моем коде:Усечение строк при передаче на ClientDataset
cds.Data := dsProvider.Data;
Я нашел место в моем SQL заявление, которое вызвало ошибку:
iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType
T.sCode является (10) поле Varchar. Мое заключение заключается в том, что запрос возвращает данные в dsProvider и что когда dsProvider.Data передается в cds.Data, компонент cds устанавливает ширину поля на основе первого полученного им значения. Я получаю то же сообщение об ошибке, если я изменил «iif» на оператор CASE. Мне удалось обойти эту проблему, делая это:
CAST(iif(ytd.hPayType <> -1,t.sCode, 'NET') AS varchar(10)) sPayType
Поскольку это используется для работы в Delphi 2006 без CAST, я полагаю, что новое поведение обусловлено обновлением к TClientDataset. Было бы неплохо иметь старое, более прощающее поведение. Есть ли способ настроить ClientDataset для принятия этого без жалобы или мне нужно просто сообщить моим пользователям CAST о строковых результатах на основе iif и CASE-операторов?
На самом деле кажется, что Firebird корректно выполняет свою работу. Данные выводятся из поля varchar (10) в базе данных Firebird в TSQLQuery. На этапе, когда эти данные передаются через поставщика набора данных в набор данных клиента, возникает проблема. Я предполагаю, что когда набор данных клиента получает поле на основе функции или оператора CASE, он не знает, сколько времени может получить поле, но, к сожалению, задает длину поля приема на любой длине первого экземпляра данных. Может быть, единственный способ обойти это CAST, который я сделал. – jrodenhi