DevArt 및 Delphi 2010에서 Firebird 2.1, DBExpress 드라이버를 사용하고 있습니다. Delphi 2006에서 사용하던 보고서 중 일부가 작동을 멈추고 "연산 예외, 숫자 오버플로"라는 오류 메시지가 나타났습니다 , 또는 문자열 잘림 "이 발생했습니다. 이 오류는 내 코드에서이 시점에서 발생Transfer to ClientDataset
iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType
T.sCode는 VARCHAR (10) 필드 :
cds.Data := dsProvider.Data;
나는 오류를 발생 내 SQL 문에서 장소를 발견. 필자의 결론은 쿼리가 dsProvider에 데이터를 반환하고 dsProvider.Data가 cds.Data에 전달되면 cds 구성 요소는받은 첫 번째 값을 기반으로 필드 너비를 설정한다는 것입니다. "iif"를 CASE 문으로 변경하면 동일한 오류 메시지가 나타납니다. 나는이 작업을 수행하여이 문제를 해결하려면 관리 :
CAST(iif(ytd.hPayType <> -1,t.sCode, 'NET') AS varchar(10)) sPayType
이는 CAST없이 델파이 2006에서 작동하는 데 사용하기 때문에, 나는 새 동작이있는 TClientDataset의 업데이트로 인해 가정합니다. 오래되고 더 용서하는 행동을하는 것이 좋을 것입니다. ClientDataset을 불만없이 받아들이도록 설정하는 방법이 있습니까, 아니면 iif 및 CASE 문을 기반으로하는 문자열 결과에 대해 사용자에게 CAST로만 알려줄 필요가 있습니까?
실제로 Firebird가이 작업을 올바르게 수행하고있는 것 같습니다. 데이터는 Firebird 데이터베이스의 varchar (10) 필드에서 TSQLQuery로 전달됩니다. 이 데이터가 데이터 셋 제공자를 통해 클라이언트 데이터 셋으로 전송되는 단계에서 문제가 발생합니다. 나는 클라이언트 데이터 셋이 함수 또는 CASE 문을 기반으로 필드를 얻었을 때 필드가 얼마나 오래 지속되었지만 불행히도 데이터의 첫 번째 인스턴스가 어떤 길이인지에 따라 수신 필드의 길이를 설정한다고 추측하고 있습니다. 그 주위의 유일한 길은 내가 한 성 (CAST) 일 수 있습니다. – jrodenhi