2010-07-28 3 views
2

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로만 알려줄 필요가 있습니까?

답변

0

글쎄, 좀 더 많은 경험으로,이 절단 오류가 ClientDatasets의 Delphi 2010 버전과 일관되게 나타나고있는 것 같습니다. 쿼리에서 CAST를 사용하지 않아도되는 해결 방법을 찾으면 여기에 게시합니다. 그러나 지금은이 게시를 닫을 예정입니다.

0

나는 지난번 작업에서 파이어 버드와 함께 많은 일을 했었는데, 이미 db에 저장된 큰 (길이) varchar 필드 값을 가지고 델파이에서 문자열을 "얻으려고"시도 할 때이 오류가 발생합니다. db의 값을 더 작은 (길이) varchar로 업데이트합니다. 나는 당신을 위해 일할 것이지 그러나 시도를 주는지 확실하지 않다.

+0

실제로 Firebird가이 작업을 올바르게 수행하고있는 것 같습니다. 데이터는 Firebird 데이터베이스의 varchar (10) 필드에서 TSQLQuery로 전달됩니다. 이 데이터가 데이터 셋 제공자를 통해 클라이언트 데이터 셋으로 전송되는 단계에서 문제가 발생합니다. 나는 클라이언트 데이터 셋이 함수 또는 CASE 문을 기반으로 필드를 얻었을 때 필드가 얼마나 오래 지속되었지만 불행히도 데이터의 첫 번째 인스턴스가 어떤 길이인지에 따라 수신 필드의 길이를 설정한다고 추측하고 있습니다. 그 주위의 유일한 길은 내가 한 성 (CAST) 일 수 있습니다. – jrodenhi