Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[14907] Re:Re:Re:Re:MS-SQL 2005에서 한글이 ?????로 깨집니다.
오랑캐꽃 [oranke] 2970 읽음    2013-12-17 11:06
원래 이 바닥이... 처한 상황에 딱 맞는 답변이 나오기는 쉽지 않습니다.
감안하시구요...

델파이 7의 DB.pas 를 열어보면 TWideStringField 가 정의되어있습니다.
데이터베이스를 연결하면 필드타입에 따라 적절한 필드가 달라붙게 되어있는데
MSSQL의 필드가 n어쩌구로 설정되었을 때만 저 필드가 할당되더군요.
그 외 경우는 TStringField가 붙고요.
때문에 독일어 코드페이지를 기준으로 한 안시<->와이드 변환과정에서
독일어가 표현하지 못하는 문자는 모두 ?로 치환되버린 겁니다. (지난번 블로그 글 참고...)

일단 mssql 에 nvarchar 필드를 테스트용으로 만들어 놓고요 (또는 기존의 필드 사용)
독일어 윈도에서 실행한 델파이 어플에서 필드.AsValue 로 원하는 한글을 얻어오는지부터 살펴보세요.

이게 잘 된다면, 말씀하신 char 필드에 TWideStringField 가 달라붙도록 VCL의 코드를 고치면 간단할텐데...
지금까지 해 볼 일이 없었기 때문에 제시는 못해드리겠네요.

해법을 정리하면...

1. 위에서 말한대로 TWideStringField가 기본이 되도록 VCL소스를 고쳐준다.
2. TDataSet 의 구조를 무시하고 OleDB 를 직접 사용한다.
3. 델파이 2009 이상을 쓴다.
4. 기타 써드파티 컴포넌트를 찾아본다.

같은 상황에서 저라면 2->1->4->3 의 순서로 해법을 찾습니다만...
잉여력이 부족하시다면 3->4->1->2 순으로 검토를 추천합니다.



김용무 님이 쓰신 글 :
: 델파이 7을 사용중입니다.
: 댓글하나에 너무 행복합니다..감사합니다.
: varchar는 서버를 제가 관리하는게 아니고 업체에서 사용하는거라서 힘들것 같구요..
: 월요일 까지 또 다른 TEST버젼들 만들어서 또 한번 들어가서 TEST해볼 예정입니다.
: 너무 간단하게 생각한 일인데 너무 일이 크게 꼬이는군요. 저 물음표 때문에..ㅠ
: 도움에 너무 감사드립니다.
:
: 혹시 제가 TADOCommand 를 한번도 써본적이 없어서요..
: 이부분을 찾아보니 자료가 그렇게 많지 않더라구요.
: 어떻게 쓰는지 힌트좀 부탁드립니다...
:
: 오랑캐꽃 님이 쓰신 글 :
: : 델파이 버전이 뭔지는 안가르쳐주시네요~~ 뭐 2009 미만으로 생각하겠습니다.
: : 필드타입을 varchar 대신 nvarchar 로, AsString 대신 Value 로 바꿔보세요.
: :
: :
: : 이 글도 도움이 되실지 모르겠네요.
: : http://delphi.borlandforum.com/impboard/impboard.dll?action=read&db=del_qna&no=14193
: :
: :
: : 김용무 님이 쓰신 글 :
: : : Widestring 으로 쓰면 될것 같아서 이래 저래 많은 버튼을 만들어서 테스트를 해봤는데.. 역시나 ????로 나오는군요.
: : : 맨탈이 붕괴되어 지고 있네요..ㅠ
: : : 혹시 서버 뷰테이블의 한글이 들어있는 필드가 Varchar(4000)으로 되어있어서일까요? 한글만 들어있지 않고 영문이랑 숫자랑 막 특수문자 같은것도 많이 들어있거든요..
: : : 1주일이 넘게 막막함과 싸우고 있습니다..ㅠ
: : : 아래는 오늘 테스트 해봤던 소스를 적어보았습니다.
: : : 도움 부탁드립니다...
: : : 메모 컨포도 IME 전부 IME_HANGUL로 바껏어요.
: : :
: : : procedure TForm1.Button1Click(Sender: TObject);
: : : begin
: : :         with ADOQuery2 do
: : :         begin
: : :           close;
: : :           SQL.clear;
: : :           SQL.Text:= 'select * from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           Application.ProcessMessages;
: : :           memo1.Lines.Text :=     FieldByName('HOST_DATA').AsString;
: : :           TNTmemo1.Lines.Text :=  FieldByName('HOST_DATA').AsString;
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : procedure TForm1.Button2Click(Sender: TObject);
: : : begin
: : :         with ADOQuery2 do
: : :         begin
: : :           close;
: : :           SQL.clear;
: : :           SQL.Text:= 'select HOST_DATA collate KOREAN_WANSUNG_CI_AS HOST_DATA from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           Application.ProcessMessages;
: : :           memo1.Lines.Text :=     FieldByName('HOST_DATA').AsString;
: : :           TNTmemo1.Lines.Text :=  FieldByName('HOST_DATA').AsString;
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : procedure TForm1.Button3Click(Sender: TObject);
: : : begin
: : :         with ADOQuery2 do
: : :         begin
: : :           close;
: : :           SQL.clear;
: : :           SQL.Text:= 'select * from View_Tablewhere card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           Application.ProcessMessages;
: : :           if CheckBox1.Checked = True then
: : :           begin
: : :             memo1.Lines.Text :=     UTF8Decode(FieldByName('HOST_DATA').AsString);
: : :             TNTmemo1.Lines.Text :=  UTF8Decode(FieldByName('HOST_DATA').AsString);
: : :           end
: : :           else
: : :           begin
: : :             memo1.Lines.Text :=     UTF8Encode(FieldByName('HOST_DATA').AsString);
: : :             TNTmemo1.Lines.Text :=  UTF8Encode(FieldByName('HOST_DATA').AsString);
: : :           end;
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : procedure TForm1.Button4Click(Sender: TObject);
: : : begin
: : :         with ADOQuery2 do
: : :         begin
: : :           close;
: : :           SQL.clear;
: : :           SQL.Text:= 'select HOST_DATA collate KOREAN_WANSUNG_CI_AS HOST_DATA from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           Application.ProcessMessages;
: : :           if CheckBox1.Checked = True then
: : :           begin
: : :             memo1.Lines.Text :=     UTF8Decode(FieldByName('HOST_DATA').AsString);
: : :             TNTmemo1.Lines.Text :=  UTF8Decode(FieldByName('HOST_DATA').AsString);
: : :           end
: : :           else
: : :           begin
: : :             memo1.Lines.Text :=     UTF8Encode(FieldByName('HOST_DATA').AsString);
: : :             TNTmemo1.Lines.Text :=  UTF8Encode(FieldByName('HOST_DATA').AsString);
: : :           end;
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : procedure TForm1.Button5Click(Sender: TObject);
: : : begin
: : :         with ADOQuery2 do
: : :         begin
: : :           close;
: : :           SQL.clear;
: : :           SQL.Text:= 'select * from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           Application.ProcessMessages;
: : :           memo1.Lines.Text :=     AnsiToUtf8(FieldByName('HOST_DATA').AsString);
: : :           TNTmemo1.Lines.Text :=  AnsiToUtf8(FieldByName('HOST_DATA').AsString);
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : procedure TForm1.Button6Click(Sender: TObject);
: : : begin
: : :         with ADOQuery2 do
: : :         begin
: : :           close;
: : :           SQL.clear;
: : :           SQL.Text:= 'select HOST_DATA collate KOREAN_WANSUNG_CI_AS HOST_DATA from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           Application.ProcessMessages;
: : :           memo1.Lines.Text :=     AnsiToUtf8(FieldByName('HOST_DATA').AsString);
: : :           TNTmemo1.Lines.Text :=  AnsiToUtf8(FieldByName('HOST_DATA').AsString);
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : :
: : : procedure TForm1.Button9Click(Sender: TObject);
: : : begin
: : :         with ADODataSet1 do
: : :         begin
: : :           CommandType := cmdText;
: : :           CommandText := 'select HOST_DATA from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           Memo1.Lines.Text :=  WideStringToUTF8(ADODataSet1.Fields[0].AsVariant);
: : :           TNTMemo1.Lines.Text :=  WideStringToUTF8(ADODataSet1.Fields[0].AsVariant);
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : procedure TForm1.Button10Click(Sender: TObject);
: : : begin
: : :         with ADODataSet1 do
: : :         begin
: : :           CommandType := cmdText;
: : :           CommandText := 'select HOST_DATA from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           Memo1.Lines.Text :=  WideStringToStringEx(ADODataSet1.Fields[0].AsVariant,949);
: : :           TNTMemo1.Lines.Text :=  WideStringToStringEx(ADODataSet1.Fields[0].AsVariant,949);
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : procedure TForm1.Button11Click(Sender: TObject);
: : : var
: : :   a,b : WideString;
: : : begin
: : :         with ADODataSet1 do
: : :         begin
: : :           CommandType := cmdText;
: : :           CommandText := 'select HOST_DATA from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           a :=  ADODataSet1.Fields[0].AsVariant;
: : :           memo1.Lines.Text := AnsiToWide(@a,100,949);
: : :           b := ADODataSet1.Fields[0].AsVariant;
: : :           TntMemo1.Lines.Text := AnsiToWide(@b,100,949);
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : procedure TForm1.Button12Click(Sender: TObject);
: : : var
: : :   a,b : WideString;
: : : begin
: : :         with ADODataSet1 do
: : :         begin
: : :           CommandType := cmdText;
: : :           CommandText := 'select HOST_DATA from View_Table where card_no =N'''+trim(Card_no.text)+'''';
: : :           open;
: : :           a :=  ADODataSet1.Fields[0].AsVariant;
: : :           memo1.Lines.Text := WideToAnsi(@a,100,949);
: : :           b := ADODataSet1.Fields[0].AsVariant;
: : :           TntMemo1.Lines.Text := WideToAnsi(@b,100,949);
: : :         end;
: : :         showmessage('Commad Succes');
: : : end;
: : :
: : : 김용무 님이 쓰신 글 :
: : : : 현재
: : : : 서버PC의 View Table을 사용하는데요. 이쪽은 한글 윈도우에 한글 MS-SQL 2008을 사용중입니다.
: : : :
: : : : 그런데 저는
: : : : 운영PC 영문윈도우에 독일 MS-SQL 2005를 사용중입니다.
: : : : 물론 한글 언어 추가 했습니다.
: : : :
: : : :
: : : : 문제는
: : : : MS-2005 studio에서 그짝 서버로 접속해 쿼리를 적어서 select * from View_Table 을 검색하게 되면 한글이 잘나오더라구요.
: : : :
: : : :
: : : : 그런데 이걸 이제 프로그램에 적용해서  ADOQuery 로 ODBC로 연결해서 language Setting도 Korean으로 하고
: : : :
: : : :
: : : : SQLTxt := 'select * from View_Table'을 적용한뒤 데이터를 Fieldbyname('Data').asString형으로 받아서
: : : : MS-2005에 사용하는 Table 에 넣기만 하면 한글이 ???로 에러가 나는군요.
: : : :
: : : :
: : : :
: : : : 그래서 보니 View_table은 한글이라 Varchar(4000) 으로 되어있고 제가 사용하는 테이블은 ntext 를 사용하고 있습니다.
: : : : 유니코드형을 사용하고 있는데..
: : : : 그래서 가져올때 SQLTxt := 'select Data collate korean_wansung_ci_as Data from View_Table' 이렇게 하여 한글로 바꾼다음에 테이블에 넣어 줘도 ???? 로 나오는군요...
: : : :
: : : : 개별 검색 할때도 SQLTxt := 'select Data collate korean_wansung_ci_as Data from View_Table Data_n = N'123123''
: : : : 이렇게 N을 넣어서도 불러 와도 안되네요..
: : : :
: : : : 혹시 버젼 문제 일수 있을까요?
: : : : MS-2005에서 2008이 다른 PC도 SQL Studio에서  잘안된다고 서버PC담당자가 말씀하시더라구요.
: : : :
: : : :
: : : : 그런데 서버PC View Table을 동일 사향의 2005 버젼에서 사용해도 Studio에서는 select하면 한글이 나오는데 프로그램에 적용시키면 한글이 ????? 나오는군요..
: : : :
: : : :
: : : : 검수 완료일이 이번주라.. 현재 마음은.. 마치 꼬인 실타래 처럼..복잡하군요.. 이럴거라곤 생각도 못했거든요..
: : : :

+ -

관련 글 리스트
14893 MS-SQL 2005에서 한글이 ?????로 깨집니다. 김용무 2415 2013/12/10
14898     Re:MS-SQL 2005에서 한글이 ?????로 깨집니다. 김용무 2638 2013/12/12
14900         Re:Re:MS-SQL 2005에서 한글이 ?????로 깨집니다. 오랑캐꽃 2211 2013/12/13
14902             Re:Re:Re:MS-SQL 2005에서 한글이 ?????로 깨집니다. 김용무 2308 2013/12/13
14907                 Re:Re:Re:Re:MS-SQL 2005에서 한글이 ?????로 깨집니다. 오랑캐꽃 2970 2013/12/17
14912                     Re:Re:Re:Re:Re:MS-SQL 2005에서 한글이 ?????로 깨집니다. 김용무 3462 2013/12/19
14894     Re:MS-SQL 2005에서 한글이 ?????로 깨집니다. 오랑캐꽃 2621 2013/12/10
14895         Re:Re:MS-SQL 2005에서 한글이 ?????로 깨집니다. 김용무 2892 2013/12/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.