편법으로 TABLE에 한글을 넣는 문제는 해결했습니다.
서버 데이터필드가 varchar(4000) 으로 되있어서 그런가 해서.
다른 테이블을 하나 만들어서 nvharchar(4000)으로 한다음에 insert into table select * from server 해서 통채로 복사를 했더랬죠.
그리고 그걸 SUBSTRING으로 한글 위치를 잘라서 Update 시켰더니 영문 윈도우 MS-SQL에 한글이 보이더군요.
그래서 이제 끝났다 했더니
장비 쪽에서 가져간 데이터가 역시나 "??????" 로 나오더군요. 장비는 독일 업체인데. 그래서 전화로 "니네 프로그램이 MS-SQL에 한글 데이터를 넣어 놨는데 못가져간다 이문제 해결 해줘라" 했더니 답변은 " MS-SQL에 한글이 들어갈수 없다 불가능하다네요"
그래서 적어 주신대로 FieldByname('Data').value 로 해서 WIDESTRING으로 제가 select해서 받았더니 저도 "????"로 나오더군요.
지금 생각은 저걸 받아와서 차라리 헥사 코드나 암호화를 하거나 해서 보내기라도 하려고 합니다.
헥사는 뭐 다시 조합하면 되고 암호화는 복호화 해버리면 되는데 우선 데이터를 장비가 가져가야 하거든요.
분명 제가 MS-SQL을 접속해서 볼때는 한글이 있습니다. 그런데 이걸 영문 윈도우에서 가져오면 역시 "????" 라서..
서버에서 한글로 가져오는 문제가 장비PC에서 한글로 가져오는 문제가 되었군요.. 제자리 걸음이네요.
이것도 편법으로 알아 내면 다시 적겠습니다.. 그런데 편법도 생각나질 않는군요 ㅎ
항상 도움에 너무 감사드립니다.
오랑캐꽃 님이 쓰신 글 :
: 원래 이 바닥이... 처한 상황에 딱 맞는 답변이 나오기는 쉽지 않습니다.
: 감안하시구요...
:
: 델파이 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하면 한글이 나오는데 프로그램에 적용시키면 한글이 ????? 나오는군요..
: : : : :
: : : : :
: : : : : 검수 완료일이 이번주라.. 현재 마음은.. 마치 꼬인 실타래 처럼..복잡하군요.. 이럴거라곤 생각도 못했거든요..
: : : : :