Background Image

FORUM

조회 수 13257 추천 수 0 댓글 12
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

ADO.net 을 이용하여 C# 에서 select 를 하는데.


한글로 where 조건을 주면 select의 결과가 나오지 않습니다. 


매니져에서 문제가 없는 커리문이 c#코드에서는 결과가 나오지 않더군요..


SELECT * FROM member WHERE user_name='아무개';  이런 커리문이 매니져에서는 문제가 없으나 C#에서는 


결과가 나오지 않습니다. 



그래서 일단 ODBC를 설정해서 다시 해봣는데


ERROR [HY000] [CUBRID][ODBC CUBRID Driver][-1006]Server handle not found

ERROR [01000] [CUBRID][ODBC CUBRID Driver][0]Fetch error


이런 에러가 발생되네요... 이건 어떻게하나요..

  • ?
    샤롱스판 2012.03.20 02:34
    cubrid.conf에서 아래 파라미터를 yes로 설정하시고 재시작하신 후 쿼리를 실행해보시기 바랍니다. http://www.cubrid.org/manual/ko/8.4.4/admin/config.html#cubrid-conf 를 참고하세요~

    single_byte_compare은 문자열 비교(string compare)를 1바이트 단위로 수행하기 위한 파라미터이다. 기본값인 no로 설정하면 2바이트 단위로 문자열 비교를 수행한다. yes로 설정하면 1바이트 단위로 문자열 비교를 수행하므로 유니코드(UTF-8) 환경에서 저장된 데이터에 대해 정상적으로 문자열 비교/검색을 수행할 수 있다.

     

  • ?
    세스카 2012.03.20 04:05

    이미 설정해 있습니다.. 본문에서도 있듯이 매니져에서는 문제가 없는 커리문이 C#에서만 문제를 보인다는겁니다....


  • ?
    샤롱스판 2012.03.20 05:31

    큐브리드 DB에 데이터를 입력했을 때의 문자셋과, DB에서 데이터를 출력할 때의 문자셋이 같아야 합니다. CM에서 잘 보이신다면 CM -JDBC 드라이버에 설정된 문자셋과 DB에 저장된 데이터의 문자셋이 일치한다는 것을 의미하구요. C# 응용에서는 문자셋이 어떻게 설정되어 있는지 확인이 필요합니다.

  • ?
    세스카 2012.03.20 05:55

    왜인지 모르겟네요. DB에서 UTF-8 이라서 CM에서 UTF-8로 되어 있으니 당연히 안깨지네요.

    C#에서는 Encoding.Default 문자셋을 UTF-8로 변환하여 쿼리를 보내고 

    받을때도 UTF-8을 Encoding.Default로 변환하여 보는데도 한글이 깨지는 현상이 일어나네요..


    커리문이 깨져서 결과도 안나오고, 결과값도 깨지는 전형적인 문자셋 문제인데.. 변환을 해도 안되니.. 이상하네요;


    string sql = "SELECT * from member";
                
                //ADO.NET
                
                byte[] data_query = Encoding.Default.GetBytes(sql);
                using (CUBRIDCommand cmd = new CUBRIDCommand(Encoding.GetEncoding("UTF-8").GetString(data_query), DBConn))
                {
                    using (DbDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            byte[] bytes = Encoding.GetEncoding("UTF-8").GetBytes(reader.GetString(6));
                            string str = Encoding.Default.GetString(bytes);
                        }             
          
                    }
                }

  • ?
    남재우 2012.03.20 07:14

    안녕하세요.

    일단 조건없이 질의하면 결과는 제대로 나오는 것이죠? 그리고 조건을 한글 말고 영문으로, 즉 본문에 영문이 있는 것에 대하여 영문으로 검색하면 결과가 제대로 나오는지 궁금합니다.

    지금 문의하신 내용이 처음 질문의 ODBC 에러와 관련이 있다면 질의 자체에 에러가 있는 것으로 보이고요, 그렇지 않고 ODBC 에러는 없이 결과가 나오지 않는다면 다른 문제인 것 같습니다.

    질의를 수행하신후 바로 %CUBRID%logbrokersql_log 아래에 보시면 가장 최근에 쓰여진 화일이 있을 것이고, 그화일을 열어 끝 부분을 보시면 수행하신 질의문이 보일 것입니다. 그부분 부터 로그 화일의 끝 부분까지 올려주시면 확인해 보도록 하겠습니다.

  • ?
    세스카 2012.03.20 18:59
    로그를 확인했는데 확실히 이상하네요. 문자셋 변환을 안해주는것도 아니고

    //C# 에서 ADO.net을 이용하여 "SELECT * from xe_member"; 실행시
    //출력값이 깨짐.

    03/20 09:48:49.074 (0) CLIENT IP 1.1.1.1
    03/20 09:48:49.089 (0) connect db xe_sangdo user artvic url jdbc:cubrid:localhost:30000:demodb:public:: session id 16140
    03/20 09:48:49.089 (0) DEFAULT isolation_level 3, lock_timeout -1
    03/20 09:48:49.105 (0) get_version
    03/20 09:48:49.105 (0) auto_commit
    03/20 09:48:49.105 (0) auto_commit 0
    03/20 09:48:49.105 (0) *** elapsed time 0.016

    03/20 09:48:49.183 (0) set_db_parameter auto_commit 1
    03/20 09:48:49.214 (15927) prepare 0 SELECT * from xe_member
    03/20 09:48:49.230 (15927) prepare srv_h_id 1 (PC)
    03/20 09:48:49.230 (15927) set query timeout to 0 (no limit)
    03/20 09:48:49.230 (15927) execute srv_h_id 1 SELECT * from xe_member
    03/20 09:48:49.230 (15927) execute 0 tuple 6 time 0.000
    03/20 09:48:49.230 (0) auto_commit
    03/20 09:48:49.230 (0) auto_commit 0
    03/20 09:48:49.230 (0) *** elapsed time 0.016

    03/20 09:49:00.150 (15927) next_result 1 
    03/20 09:49:00.181 (15927) close_req_handle srv_h_id 1
    03/20 09:49:00.181 (0) con_close
    03/20 09:49:00.181 (0) disconnect

    03/20 09:49:00.181 (0) STATE idle

    03/20 09:52:05.791 (0) CLIENT IP 1.1.1.1
    03/20 09:52:05.807 (0) connect db xe_sangdo user artvic url jdbc:cubrid:112.220.109.250:30000:xe_sangdo:artvic:: session id 16183
    03/20 09:52:05.807 (0) DEFAULT isolation_level 3, lock_timeout -1
    03/20 09:52:05.838 (0) get_version
    03/20 09:52:05.838 (0) auto_commit
    03/20 09:52:05.838 (0) auto_commit 0
    03/20 09:52:05.838 (0) *** elapsed time 0.031



    //CM에서 "SELECT * FROM xe_member WHERE user_id = '강긔남'"; 실행시
    //정상적인 select 및 출력

    03/20 09:52:05.838 (0) check_cas 0
    03/20 09:52:05.853 (0) set_db_parameter lock_timeout 1000
    03/20 09:52:18.848 (0) check_cas 0
    03/20 09:52:18.864 (0) get_db_parameter isolation_level 3
    03/20 09:52:18.895 (10) prepare 2 SELECT * FROM xe_member WHERE user_id = '媛뺢툝??
    03/20 09:52:18.895 (10) prepare srv_h_id 1
    03/20 09:52:18.957 (10) set query timeout to 0 (no limit)
    03/20 09:52:18.957 (10) execute srv_h_id 1 SELECT * FROM xe_member WHERE user_id = '媛뺢툝??
    03/20 09:52:18.957 (10) execute 0 tuple 0 time 0.000
    03/20 09:52:19.020 (0) end_tran COMMIT
    03/20 09:52:19.020 (0) end_tran 0 time 0.000
    03/20 09:52:19.020 (0) *** elapsed time 0.125

    03/20 09:52:30.751 (0) check_cas 0
    03/20 09:52:30.767 (0) get_db_parameter isolation_level 3
    03/20 09:52:30.767 (0) close_req_handle srv_h_id 1
    03/20 09:52:30.767 (11) prepare 2 SELECT * FROM xe_member WHERE user_name = '媛뺢툝??
    03/20 09:52:30.767 (11) prepare srv_h_id 1 (PC)
    03/20 09:52:30.798 (11) set query timeout to 0 (no limit)
    03/20 09:52:30.798 (11) execute srv_h_id 1 SELECT * FROM xe_member WHERE user_name = '媛뺢툝??
    03/20 09:52:30.798 (11) execute 0 tuple 1 time 0.000
    03/20 09:52:30.814 (0) end_tran COMMIT
    03/20 09:52:30.814 (0) end_tran 0 time 0.000
    03/20 09:52:30.814 (0) *** elapsed time 0.047

    03/20 09:52:30.814 (0) END OF LOG



    //C# 에서 ADO.net을 이용하여 "SELECT * FROM xe_member WHERE user_id = '강긔남'"; 실행시
    // select 가 안됨.

    03/20 09:53:51.154 (0) CLIENT IP 1.1.1.1
    03/20 09:53:51.170 (0) connect db xe_sangdo user artvic url jdbc:cubrid:localhost:30000:demodb:public:: session id 16204
    03/20 09:53:51.170 (0) DEFAULT isolation_level 3, lock_timeout -1
    03/20 09:53:51.185 (0) get_version
    03/20 09:53:51.185 (0) auto_commit
    03/20 09:53:51.185 (0) auto_commit 0
    03/20 09:53:51.185 (0) *** elapsed time 0.015

    03/20 09:53:51.185 (0) set_db_parameter auto_commit 1
    03/20 09:53:51.201 (15928) prepare 0 SELECT * FROM xe_member WHERE user_id = '????'
    03/20 09:53:51.201 (15928) prepare srv_h_id 1
    03/20 09:53:51.232 (15928) set query timeout to 0 (no limit)
    03/20 09:53:51.232 (15928) execute srv_h_id 1 SELECT * FROM xe_member WHERE user_id = '????'
    03/20 09:53:51.232 (15928) execute 0 tuple 0 time 0.000
    03/20 09:53:51.232 (0) auto_commit
    03/20 09:53:51.232 (0) auto_commit 0
    03/20 09:53:51.232 (0) *** elapsed time 0.031

    03/20 09:53:51.232 (15928) next_result 1 
    03/20 09:53:51.248 (15928) close_req_handle srv_h_id 1
    03/20 09:53:51.248 (0) con_close
    03/20 09:53:51.248 (0) disconnect

    03/20 09:53:51.248 (0) STATE idle



  • ?
    남재우 2012.03.20 19:17

    조건없이 질의시 결과가 깨져나온다면 일단 그 문제부터 해결하는 것이 중요해보입니다.  입출력과정 중 어디선가 문자셑이 깨지고 있으니 그 문제가 해결된다면 조건 검색시 제대로 결과가 나올 것입니다.

    CUBRID에서는 문자셑에 대한 변환을 하지 않습니다. 따라서 일단 인코딩하지 않고 입출력을 해보면서 어느부분에서 문제가 있는지를 찾아보시는 것이 좋겠습니다.

  • ?
    cgkang 2012.03.20 19:19

    odbc에서 connection string에 charset을 지정했을 경우

    윈도우의 디폴트 코드셋으로 입력된 스트링을 지정된 charset으로 변환해 주거나, 반대로 변환해서 반환합니다.

     

    다음 예와 같이 charset이 추가되었는지 확인해보시기 바랍니다. 현재는 utf-8만 지원합니다.

    DRIVER=CUBRID Driver;UID=public;FETCH_SIZE=100;PORT=30000;SERVER=localhost;DB_NAME=demodb;charset=utf-8

  • ?
    세스카 2012.03.21 01:03

    답변주셔서 감사합니다.

    일단 ODBC로 변경하여 다시 만드는중입니다 드라이버 자체에 문자셋 설정이 없고

    C# 자체에 byte배열로는 UTF-8이 가능하지만 string로는 안되는것 같더군요...

    그래서 안되는것 같고 

    ODBC는 드라이버 자체에 문자셋이 있으니 가능할것같습니다.

  • ?
    샤롱스판 2012.03.21 20:34

    불편 드려서 죄송합니다. ado.net driver 자체에서 charset 설정에 문제 있다는 것을 파악했구요, 현재 개발자가 작업 중입니다. 드라이버 패치 나오면 알려드리도록 하겠습니다.

  • ?
    샤롱스판 2012.03.24 02:37

    ftp://ftp.cubrid.org/CUBRID_Drivers/ADO.NET_Driver/8.4.1/CUBRID%20ADO.NET%20Data%20Provider%208.4.1.1-Developing.zip 

    현재 ado.net 드라이버  charset 설정 관련 코드를 긴급 수정하였는데요(개발용), 혹시 이것으로 해당 문제가 해결되는지 테스트 가능하실까요? 저희가 개발자 단위 테스트는 했고 QA는 아직 못했습니다. QA마치고 패치를 릴리스하려고 합니다.

    connection string을 아래처럼 설정하시면 됩니다.

    server=localhost;database=demodb;port=33000;user=public;password=;charset=utf-8

     

     

  • ?
    문진영 2012.03.26 23:26

    해당 문제가 이상없이 한글로 출력 되었습니다.

    감사합니다 ^^

     


List of Articles
번호 제목 글쓴이 날짜 조회 수
120 BeginTrans 상태에서 검색 시 응답없음 발생 7 까망이 2011.04.22 14635
119 BLOB에 대한 자바 타입변환 문제.. 1 file ㅇㅇ 2013.01.28 9930
118 BLOB 타입 이미지를 JSP로 웹에 뿌려주려면 어떻게 해야하나요? 1 아워나 2014.07.07 14210
117 BLOB 데이터 select 질문 1 hyperhand 2009.12.23 12109
116 BIT형 데이터에 대한 where ... IN 쿼리 1 소라게 2010.03.10 10740
115 A트랜잭션에서 Update중인 row 를 B트랜잭션에서 Select 1 큐불리드 2015.12.25 5958
114 Auto Increment에 대한 질문입니다. 3 너랑이마녀 2016.02.18 7912
113 Audit 테이블 따로 존재하나요? 3 JIRAN 2019.07.01 63
112 Attempt to call a method related to scrollability of non-scrollable ResultSet. 오류 문의 1 cuins 2011.07.28 12461
111 Archive log 관리 질문 2 june2 2013.07.16 9012
110 Archive Log만으로 타임복구가 가능한가요? 4 핑핑크 2016.04.29 9743
109 Apm_setup7로 자동설치시 연동이 안되는데... 1 또랑 2010.11.08 8254
108 An IOException was caught during reading the inputstream. 오류 조치방법 좀 알려주세요. 1 ldev27 2019.10.29 45
107 An IOException was caught during reading the inputstream 1 익명2 2015.11.26 6813
106 An IOException was caught during reading the inputstream 1 익명2 2015.11.26 6619
105 Ado.net. ExecuteNonQuery의 반환값이 항상 0 입니다. 2 모비23 2019.01.08 320
104 Ado.NET : Cannot connect to CUBRID CAS 오류 2 websiter 2017.05.05 4747
103 AVG 함수관련 질문드려요 1 구름마음 2013.06.10 13467
102 AUTO_INCREMENT 컬럼 이용시 2 hyperhand 2009.12.22 16945
101 ARRAY 데이터 타입에 대한 SQL 질문 3 지용 2010.10.08 10060
Board Pagination Prev 1 ... 146 147 148 149 150 151 152 153 154 155 156 Next
/ 156

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2147 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales