Background Image

FORUM

조회 수 13371 추천 수 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
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4257
916 Overflow occurred in addition context 오류 1 엑팩 2017.11.29 466
915 Oracle의 stored function/procedure에 대한 질문입니다. 2 배나온천사 2011.09.06 10031
914 Oracle에서 Cubrid 로 이관을 하려고 하는데 CMT말고 할수 있는 방법이 있을까요? 1 curo 2022.03.02 76
913 Oracle->Cubrid 시 인덱스가 중복되었습니다. 라는 오류가 납니다. 2 secret 바퀴벌레 2016.03.07 6
912 Oracle->Cubrid 시 cubrid Manager 툴에서 2 블랙이 2016.04.20 9510
911 Oracle 사용자 팁 문의 1 비형여자 2011.07.26 9689
910 Oracle to CUBRID Migration 방안 1 DBS 2022.12.01 85
909 Oracle dblink 관련 문의드립니다. 1 file 서비서비 2022.08.31 123
908 Oracle XMLAGG 함수의 유사 기능 질문드립니다. 1 jyheo 2019.01.14 698
907 Oracle SQL 을 Cubrid SQL 로 컨버젼 툴 문의 1 홍가 2014.06.26 22571
906 Oracle SQL to Cubrid SQL 1 적막한밤 2014.07.30 6158
905 Oracle REGEXT 함수 지원하나요? 2 cyber 2013.03.25 11269
904 Oracle ==> Cubrid 진행 중입니다. 1 Philip Park 2020.04.08 137
903 Oracle -> Cubrid Migration 시 문제 문의드립니다. 1 바보똥개 2017.05.25 3854
902 Oracle --> Cubrid 쿼리 변경 질문입니다! 3 잘하자! 2016.06.01 11051
901 Operation would have caused one or more unique constraint violations. 1 곰팅팅이 2016.03.30 9737
900 Openssl 취약점 패치 문의 2 아스페리타스 2020.12.11 149
899 On-line 상태에서 Volume 추가 안되는 문제 2 브이찾기 2016.05.17 7495
898 Oledb 문자열 값 가져오기 실패 문의입니다. 4 콩이아부지 2013.03.11 11087
897 OleDbCommand 를 사용하는데 다음 같은 에러가 발생합니다. 3번째 2 hades 2008.12.10 19124
Board Pagination Prev 1 ... 149 150 151 152 153 154 155 156 157 158 ... 199 Next
/ 199

Contact Cubrid

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