최종 결론.. 델파이 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로 형변환을 하던지..
: 아예 테이블을 변환시켜야 하는것도 문제네요..
:
: ---------------------------------------------------------------------
:
: 델파이 팁게시판이 너무 휑~~~~~~~~~~~ 한거 같아서 이곳에 올립니다.