Background Image

FORUM

조회 수 13377 추천 수 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
번호 제목 글쓴이 날짜 조회 수
공지 CUBRID 사용자를 위한 DBeaver 도구 출시 안내 admin 2024.04.23 50
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4458
934 전자정부 프레임워크와 큐브리드 연동하는 방법 알려주세요 1 mytoky 2013.08.29 19202
933 전자정부표준프레임워크 BLOB insert질문합니다 1 poooh 2013.10.24 47436
932 전자정부표준프레임워크 recordset 프로시져 호출 1 없음 2022.01.10 274
931 전체 데이터 용량과 데이터 건수 1 쫑쫑이 2020.09.08 577
930 전체 복구 이후 증분 복구가 오류 납니다. 3 coolkkm 2017.10.20 236
929 전체 자동시작이 되지 않습니다. 2 또랑 2010.12.03 8003
928 전체백업과 아키이브 파일 복원 문의 4 coolkkm 2018.01.26 389
927 전체테이블 1 삐삐 2019.01.28 115
926 접속 자동으로 끊김 6 secret moon 2014.12.24 20
925 접속이 많으면 브로커 에러가 납니다 ㅠㅠ... 1 secret 광황제 2013.11.04 11
924 접속자의 아이피나 맥어드레스를 알아낼수 있는지요 3 유니콘 2012.12.05 10956
923 접속제한 설정 질문드립니다 2 유니콘 2011.12.24 12721
922 정규식 사용법에 대해서 궁금합니다.. 1 큐브리드어려워요 2022.01.11 715
921 정기 교육 관련 문의 드립니다. 1 kings 2012.06.22 6205
920 정기교육 문의 1 마루 2013.01.30 5269
919 정수 변환 2 현수 2019.10.05 805
918 정수/정수 결과를 소수로 출력하게 하는법 1 file suyeon 2022.02.23 197
917 정수와 정수의 나누기.. 1 파란토끼 2013.10.08 10719
916 제로보드 4 이용중인데 최신게시물 불러오기에서 힘드네요 1 secret 헬리 2009.06.03 11
915 제약조건 비활성화 1 삽질중 2009.10.28 9612
Board Pagination Prev 1 ... 149 150 151 152 153 154 155 156 157 158 ... 200 Next
/ 200

Contact Cubrid

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