Усечение строки при передаче в ClientDataset - PullRequest
2 голосов
/ 28 июля 2010

Я использую Firebird 2.1, DBExpress Driver от DevArt и Delphi 2010. Некоторые из моих отчетов, которые использовались для работы с Delphi 2006, перестали работать и выдало сообщение об ошибке, указывающее, что «арифметическое исключение, переполнение числа или усечение строки» имели произошло. В этот момент в моем коде произошла ошибка:

cds.Data := dsProvider.Data;

Я нашел место в своем операторе SQL, которое вызвало ошибку:

iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType

T.sCode - это поле Varchar (10). Мой вывод заключается в том, что запрос возвращает данные в 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?

Ответы [ 2 ]

0 голосов
/ 21 августа 2010

Ну, немного больше опыта, похоже, что я вижу, что эта ошибка усечения обнаруживается в соответствии с версией Delphi 2010 ClientDatasets.Если я найду решение, которое не требует использования CAST в запросе, я опубликую его здесь.Но сейчас я собираюсь закрыть эту публикацию.

0 голосов
/ 29 июля 2010

В своей последней работе я много работал с firebird, эта ошибка возникает, когда у вас уже есть большое (длинное) значение поля varchar, сохраненное в БД, и вы пытаетесь «получить» строку в delphi, попробуйте обновить значение в дБ для меньшего (длина) varchar. Я не уверен, что сработает для вас, но попробуйте.

...