White Whale Studio

C# & Oracle US7ASCII CharacterSet ISSUE 본문

IT Engineering/C#.net

C# & Oracle US7ASCII CharacterSet ISSUE

glorymind 2020. 8. 14. 09:09
반응형

연동 작업을 하다보니 고객사 오라클 캐릭터셋이 US7ASCII 로 되어 있는데 연결이 문제가 아니라

한글이 깨져서 나오는 심각한 문제가 발생했다.

구글링을 통해서 레지스트리 변경, 환경변수 설정, 코드에서 환경 설정 등 별에 별짓을 다해봤는데

결국 한글은 나오지 않았다.

그 이유인 즉슨

-----------------------------------------------------

언뜻 보기에는 US7ASCII도 한글을 지원하는 것처럼 보이지만, 사실은 한글이 저장되는 것이 아니고,

한글을이진코드 형태로 변환하여 저장 및 출력하는 형태다.

 

US7ASCII 는 영문글자만을 위한 코드인데 8bit중 7bit만 사용하고 

나머지 1비트는 패리티 비트로 사용됩니다. 

------------------------------------------------------

위와 같은 이유였고 또한 연동 방식은 OleDB 혹은 ODBC를 활용한 연동방식만이 가능하다고 하여

이에 맞춰서 OleDB로 개발을 진행했다.

 

OleDB Driver가 설치되어 있어야 또한 연동 가능하니 ODAC 를 설치한다거나(오라클 홈페이지에서 검색하면 나온다.)

확인이 필요하다.

 

또 문제가 됬던것이 OleDB로 연동해서 한글이 정상적으로 출력되는 것은 확인했는데

프로시저로 호출하는 SMS 전송이 정상적으로 되지 않는 현상이 발생했다.

즉, OleDB를 통해 DB에 Insert할때 한글이 깨져서 들어가는 현상이었던 것

 

우회법으로 스크립트를 생성해서 실행한다는 듯 이것저것 해보았으나 잘되지 않아

마지막으로 도전해 본 방법은 sqlplus를 커맨드방식으로 불러서 한 라인씩 쓰는 방법이었는데

다행히도 이 방법은 먹혀서 해당 방법으로 작업을 진행했다.

유효한 소스코드를 공유한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName = "sqlplus.exe";
myProcess.StartInfo.WorkingDirectory = "";
myProcess.StartInfo.Arguments = String.Format("{0}/{1}@{2}", UserId, UserPwd, Catalog);
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.StartInfo.RedirectStandardOutput = true;
myProcess.StartInfo.RedirectStandardError = true;
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.CreateNoWindow = true;
myProcess.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(myProcess_OutputDataReceived);
myProcess.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(myProcess_ErrorDataReceived);
myProcess.Exited += new EventHandler(myProcess_Exited);
myProcess.Start();
 
myProcess.BeginErrorReadLine();
myProcess.BeginOutputReadLine();
 
myProcess.StandardInput.WriteLine("VARIABLE RET VARCHAR2(500);");
myProcess.StandardInput.WriteLine(string.Format("EXECUTE {0} ({1}, '{2}', '{3}', :RET);", procName.Trim(), GetSMSMsg(msg), callback, phoneNumber));
myProcess.StandardInput.WriteLine("PRINT RET;");
myProcess.StandardInput.WriteLine("Commit;");
 
myProcess.Close();
cs

 

소스를 보면 대충은 짐작이 가겠지만 프로세스를 실행시켜서 커맨드창에서 Back 프로세스로 실행하는데

오라클의 로그인을 위한 Arguments를 볼수있고

중간중간에 OutputDataReceived 와같은 이벤트들은 Sqlplus를 실행해서 보는것처럼 커맨드창에 유사하게 진행상황 및 결과를 볼수있도록 콘솔창에 찍어주는 이벤트들이다.

그리고 끝부분에 보면 WriteLine쪽에는 오라클 쿼리를 직접 실행하는 것처럼 한줄한줄 타이핑하는 방식이다.

가장 좋은 방법은 캐릭터셋을 맞춰서 하는 방법이겠지만 안된다면 요런 방법도 있다는 것을 참고하면 될듯하다.

 

반응형

'IT Engineering > C#.net' 카테고리의 다른 글

C# 바로가기 아이콘 만들기 Shortcut  (0) 2021.01.28
C# Oracle OleDB 연동  (0) 2020.08.14
DbDataReader 다루기  (0) 2020.03.30
C# Firefox Runtime Package - XulRunner - Gecko  (0) 2017.02.15
[Nunit] 테스트 해보기  (0) 2016.08.12
Comments