C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[8274] Re: ADO test 내용 추가 및 해결방법..
박진수 [jeensoo] 1390 읽음    2003-12-23 20:14
ADO test 내용 추가 및 해결방법..
--------------------------------
델파이의 TADO쿼리로 NUMERIC TYPE의 필드를 억세스시
다음과 같은 경우에는 제대로 음수를 읽어오더군요..

1. NUMERIC 필드가  실수가 처리되도록 처리된경우는 100% 제대로 음수를 읽어옵니다.
2. NUMERIC 필드가  실수가 처리되도록 처리된경우라 하더라도 이것을 정수만 처리되는
   NUMERIC으로 CAST나 CONVERT에 의해 형이 변형됐을경우 음수를 못읽어 옵니다.
3. 따라서 부득히 현재상태의 델파이로 ADO쿼리를 사용할경우..
   NUMERIC 필드 선언시 정수만 필요한 필드도 실수도 처리할수 있도록 최소한
   소숫점 1자리 까지는 처리되도록 필드를 정의 하던지 아니면..,
   INT나 BICINT, MONEY 같은 필드를 사용해야 합니다.

   필드타입을 NUMERIC(7,0) 와 같이 선언해도 TADO로 이 필드를 읽어올시 음수는 제대로
   읽어오지 못하니 주의 하시길..,

가정 정확한 해결은 볼랜드에서.. 하루빨리 해당 패치가 나와야 할듯 하군요..




박진수 님이 쓰신 글 :
: 최종 결론..  델파이 ADO관련 버그 인것으로 여겨집니다..
:
: 다음과 같은 TEST를 했습니다..
:
: 테이블에는 NUMERIC(7) TYPE으로 정의된 필드가 존재합니다.
:
: 첫번째 실험자의
: 클라이언트환경은  WINDOWS XP 에서..
: MDAC 2.8... 로
: ASP에  MS-SQL OLEDB Provider로   Windows NT서버+MS-SQL7과 Windows 2003서버+MS-SQL2000을 접근한 결과
: 음수 수치를 제대로 처리해 보여줬으며..,
:
: 두번째 실험자의
: 클라이언트환경은  WINDOWS 2000 에서..
: MDAC 2.7... 로
: ASP에  MS-SQL OLEDB Provider로   MS-2000서버의 MS-SQL2000을 접근한 결과
: 음수 수치를 제대로 처리해 보여줬습니다..
:
: 그러나
: 본인이..,
: Win98SE+MDAC2.8과  Windwos2000+MDAC2.8 설치 된곳에서 각각
: 델파이7 버전에 TADO쿼리로  Windows NT 4.0+MSSQL7에 접근하여 테스트한 결과는
: 음수 처리 오류가 발생했습니다..
:
: 폼소스와 BDE 시와 ADO시 화면을 같이 첨부했습니다.
:
: ----------------------------------------------------------------
: 폼의 소스 입니다.
: object Form1: TForm1
:   Left = 192
:   Top = 107
:   Width = 696
:   Height = 536
:   Caption = 'Form1'
:   Color = clBtnFace
:   Font.Charset = HANGEUL_CHARSET
:   Font.Color = clWindowText
:   Font.Height = -12
:   Font.Name = #44404#47548
:   Font.Style = []
:   OldCreateOrder = False
:   PixelsPerInch = 96
:   TextHeight = 12
:   object DBGrid1: TDBGrid
:     Left = 40
:     Top = 88
:     Width = 553
:     Height = 233
:     DataSource = DataSource1
:     ImeName = #54620#44397#50612'('#54620#44544')'
:     Options = [dgEditing, dgAlwaysShowEditor, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit]
:     TabOrder = 0
:     TitleFont.Charset = HANGEUL_CHARSET
:     TitleFont.Color = clWindowText
:     TitleFont.Height = -12
:     TitleFont.Name = #44404#47548
:     TitleFont.Style = []
:     Columns = <
:       item
:         Expanded = False
:         FieldName = 'aa1'
:         Title.Caption = #54805#48320#54872#54620' '#54596#46300
:         Visible = True
:       end
:       item
:         Expanded = False
:         FieldName = 'aa2'
:         Title.Caption = #44592#48376'TYPE'#51032' '#54596#46300
:         Visible = True
:       end>
:   end
:   object RadioButton1: TRadioButton
:     Left = 408
:     Top = 64
:     Width = 52
:     Height = 17
:     Caption = 'BDE'
:     TabOrder = 1
:     OnClick = RadioButton1Click
:   end
:   object RadioButton2: TRadioButton
:     Left = 472
:     Top = 64
:     Width = 52
:     Height = 17
:     Caption = 'ADO'
:     Checked = True
:     TabOrder = 2
:     TabStop = True
:     OnClick = RadioButton2Click
:   end
:   object Memo1: TMemo
:     Left = 40
:     Top = 344
:     Width = 569
:     Height = 129
:     Font.Charset = HANGEUL_CHARSET
:     Font.Color = clWindowText
:     Font.Height = -12
:     Font.Name = #44404#47548#52404
:     Font.Style = []
:     ImeName = #54620#44397#50612'('#54620#44544')'
:     Lines.Strings = (
:       'SELECT cast((ITEM_HCOUNT * -1) as int) aa1,'
:       '       (ITEM_HCOUNT * -1)  aa2'
:       '  FROM BLRM_ITEM  ')
:     ParentFont = False
:     ReadOnly = True
:     TabOrder = 3
:   end
:   object DataSource1: TDataSource
:     DataSet = ADOQuery1
:     Left = 208
:     Top = 40
:   end
:   object Query1: TQuery
:     Active = True
:     DatabaseName = 'BLRM_DB'
:     SQL.Strings = (
:       'SELECT cast((ITEM_HCOUNT * -1) as int) aa1,'
:       '       (ITEM_HCOUNT * -1)  aa2'
:       '  FROM BLRM_ITEM  ')
:     Left = 104
:     Top = 24
:   end
:   object ADOQuery1: TADOQuery
:     Active = True
:     ConnectionString =
:       'Provider=SQLOLEDB.1;Password=BEST;Persist Security Info=True;Use' +
:       'r ID=BEST;Initial Catalog=BESTLRM;Data Source=xxx.XXXX.XXX.XXX
:     CursorType = ctStatic
:     Parameters = <>
:     SQL.Strings = (
:       'SELECT cast((ITEM_HCOUNT * -1) as int) aa1,'
:       '       (ITEM_HCOUNT * -1)  aa2'
:       '  FROM BLRM_ITEM  ')
:     Left = 336
:     Top = 32
:   end
: end
: ---------------------------------------------------------------------------
:
:
: http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?db=dmdlec&mode=read&num=2392&page=1&backdepth=1
: 에 결과 화면 있습니다..
:
:
:
: 박진수 님이 쓰신 글 :
: : 델파이의 ADO버그인가 MS의 MDAC의 버그인가 아니면 나의 실수인가!!!
: :
: : [TEST환경]
: : MDAC 버전 2.8
: : 델파이버전 7.0
: : DATABASE  MS-SQL7  SP4
: : 클라이언트  WIN98SE, WIN2000
: : 서버  WIN2000 SP4, WIN NT SP6a
: :
: : [증상]
: : 저는 보통 숫자를 처리하는 필드를 NUMERIC TYPE으로 정의해서
: : DB 테이블들을 생성해서 쓰고 있습니다.
: :
: : 그런데  TADO쿼리를 MS-SQL OLE DB 에 연결하고
: : SELECT를 해올시에..
: : NUMERIC으로 선언된 필드에 분명 -(마이너스, 음수) 값이 들어가 있는데..
: : TADO쿼리로 해서 읽어와 이것을 DB그리드와 연결시키면..
: : - 가 없는 값으로 나오더군요..
: :
: : 그래서 BDE와 TQuery로 테스트 해보니 이상없이 나왔구..
: : 볼랜드의 SQL EXPLORER로 가서 해당 테이블을 접근해도 이상이 없었구
: : MS SQL의 Query Analyzer로 해도 이상없이 읽어오구..
: : MS SQL의 EM(Enterprise Manager)로도 이상없이 읽어오는데..
: :
: : ADO 쿼리를 MS-SQL OLEDB 프로바이더와 연결해서 읽어오면
: : 여지 없이 NUMERIC TYPE으로 정의된 필드에 있는 - 값은 읽어오지
: : 못합니다..
: : 즉 원래 테이블에는 -1이 들어있을경우 DB그리드에 표시되는 값은 1만 표시되는 거죠...
: :
: : 그러나 이것을 SQL문의 CAST나 CONVERT 를 써서..  NUMERIC TYPE을 INT나 FLOAT으로 바꾸면  DB그리드에서 제대로 표시됩니다.
: :
: : 해당필드를 다음과 같이 해서 읽어볼 경우도 여지없이 음수는 표현을 못하더군요..
: :
: : ShowMessage(IntToStr(TADOQuery1.FieldByName('FLD1').AsInteger));
: : ShowMessage(FloatToStr(TADOQuery1.FieldByName('FLD1').AsFloat));
: :
: : 물론 ADO쿼리 콤포넌트에 필드에디터를 사용하여 AddAll Field로 해서 필드처리를 하건 않하건 상관없이
: : 또 해당 필드의 DisplayFormat을 지정하건 않하건 상관없이 음수는 무조건 양수로 읽어오더군요..
: :
: : 델파이의 ado 쿼리의 버그인지
: : mdac의 버그인지..,
: : mdac 2.8 버전과 sql서버 7.0 과의 인터페이스 버그인지..
: :
: : 도대체 원인이 어디에있는지 모르겠습니다..
: :
: : 혹시 mdac 다른 버전이나..,    sql서버 2000에서는 어떤지
: : 여러분들도 한번 확인 해 보시길 바랍니다..
: :
: : 만약 VB에 ADO로  SQL서버 7.0이나 2000에서도
: : NUMERIC TYPE으로 정의된 필드에서  음수값을 제대로 읽어오지 못한다면..
: : 이건 MS의 버그로 확대 될것 같군요..
: :
: : 그러나 꼭 NUMERIC(1) 만으로 필요한 해서 사용하는 경우도 있고 한데..
: : ADO에서 NUMERIC 필드에대한 음수 표현이 안되어..
: : INT(기본 4바이트) 나 SMALLINT TINYINT, FLOAT, MONEY를써야 한다면..., 이또한 문제
: : 이고..,  ADO라는게 같은 회사의 제품인 MS-SQL서버 마저도 제대로 지원하지 못한다면..,
: : 이또한도 문제..,
: : 또 기존에 NUMERIC으로 생성시킨 테이블들은..  만약 ADO를 사용할경우...
: : 이 테이블들을 ADO로 억세스 할시 cast나 convert로 형변환을 하던지..
: : 아예 테이블을 변환시켜야 하는것도 문제네요..
: :
: : ---------------------------------------------------------------------
: :
: : 델파이 팁게시판이 너무 휑~~~~~~~~~~~ 한거 같아서 이곳에 올립니다.

+ -

관련 글 리스트
8272 델파이의 ADO버그인가 MS의 MDAC의 버그인가 아니면 나의 실수인가!!! 박진수 1252 2003/12/23
8273     Re:최종 결론.. 델파이 ADO관련 버그 인것으로 여겨집니다.. 박진수 1340 2003/12/23
8274         Re: ADO test 내용 추가 및 해결방법.. 박진수 1390 2003/12/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.