2010-07-28 6 views
2

Я использую 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-операторов?

ответ

0

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

0

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

+0

На самом деле кажется, что Firebird корректно выполняет свою работу. Данные выводятся из поля varchar (10) в базе данных Firebird в TSQLQuery. На этапе, когда эти данные передаются через поставщика набора данных в набор данных клиента, возникает проблема. Я предполагаю, что когда набор данных клиента получает поле на основе функции или оператора CASE, он не знает, сколько времени может получить поле, но, к сожалению, задает длину поля приема на любой длине первого экземпляра данных. Может быть, единственный способ обойти это CAST, который я сделал. – jrodenhi