Background Image

FORUM

2022.09.22 20:03

ODBC Error 관련

조회 수 164 추천 수 0 댓글 15
?

단축키

Prev이전 문서

Next다음 문서

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


* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.

OS
windows 10 
CUBRID Ver.
cubrid 11.2
CUBRID TOOL Ver.
[도움말]-[버전정보] 확인
응용 환경(AP)
delphi XE


* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.

 

에러 내용 및 재현 방법 재현 가능한 Source와 SQL
관련 테이블(인덱스, 키정보 포함) 정보 CUBRID 홈 디렉토리 아래 log 디렉토리 압축


-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
cubrid 11.2 for windows x64 version을 사용하고 있으며, 

delphi 를 이용해서 application을 개발하고 있습니다.

 

application은 32 bit app으로 cubrid odbc 11.2 latest unicode win32_64를 사용하면,

 

개발 app에서 예외처리 error 가 발생합니다.

 

그러나 , 같은 logic으로 cubrid odbc 10.2 latest unicode win32_64를 사용하면,

 

 

아무 문제없이 통신이 되고, app에서 예외처리도 발생하지 않습니다. 

 

어느 부분에서의 문제 인지 파악이 잘 안되는 데, db가 11.2면 11.2 odbc를 써야하는 것인지, 아니면 하위 버전의 odbc를 써도 상관이 없는지 질문을 드립니다.

 

 

  • ?
    kisoo 2022.09.22 21:10

    10.2 ODBC win32_64를 사용하든 11.2 ODBC win_32_64를 사용하든 문제가 없어야 합니다.

    어떤 version을 사용해도 되지만, 가급적 최신 version의 사용을 권고하고 있습니다.


    10.2 ODBC release 이후, bug fix나 기능 개선등의 개발이 있었습니다 (14건 이상)
    이 수정 중의 하나가 영향을 미쳤을 수 있습니다.
    11.2 ODBC를 사용한 경우 api에서 발생하는 예외 상황을 좀 더 자세히 기술하여 주시면
    무엇이 원인인지 검토해 보겠습니다.

  • ?
    땜쟁이 2022.09.24 12:18
    자세하게 설명을 드리기가 애매한 상황인데, 일단 설명을 드리자면,
    odbc driver를 다운로드 (10.2)하여, 설치 후
    delphi의 adoconnection component를 이용하여,
    ADOConnection1.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;User ID=dba;Data Source=CUBRID;';ADOConnection1.Connected := True;
    이러한 형식으로 connection string을 설정했습니다.

    지금 개발하고 있는 Application은 32Bit이기 때문에, 32bit odbc를 설정했고, 여기서 database query를 하면 아무 문제 없이 잘 됩니다.

    그리고, 이 odbc를 11.2로 변경하고 테스트를 해 보면 특이사항이 있습니다.

    일반적인 select 구문등은 아무 문제 없이 잘 됩니다. 하지만 관리자 명령 예를 들면,

    tdevice라는 테이블이 있다고 가정하면,

    select * from tdevice; 이렇게 하면 10.2 / 11.2 둘 다 아무 문제가 없습니다.

    하지만,

    show tables; 이 명령은 10.2에서는 동작되지만 11.2는 예외처리 에러가 발생하면서 동작이 안됩니다. 그 다음 부터는 application을 닫았다가 다시 실행해야만 db 연결이 정상적으로 됩니다.

    그래서, 10.2 odbc를 사용하려고 하고 있으나, 아주 간헐적으로 10.2에서도 예외처리 문제가 동일하게 발생합니다.

    11.2 odbc는 desc, explain , show 등 데이터베이스 관리 측 명령은 아예 동작이 안되고 예외처리 문제가 발생합니다.
    (database는 windows cubrid 11.2 x64를 사용하고 있습니다.)

    정보가 부족하지만, 검토 부탁드리겠습니다.

    감사합니다.
  • ?
    kisoo 2022.09.24 12:26
    말씀하신대로 정보가 부족하긴 하지만, 검토해보겠습니다.
  • ?

    좀 더 자세한 정보를 위해서, 저희가 테스트 하고 있는 exe 파일을 업로드 합니다.

     

    1. 델파이 프로그램의 버전은 XE(32bit)  입니다.

    2. Cubrid DB 의 접속은 11.2 의 ODBC 를 사용하였습니다.

    3. 프로그램 실행전에 dbconn.ini 파일에서 설정을 맞추셔야 합니다

    4. 프로그램을 실행하면 database 에 연결이 되고 상단의 memo 박스에서

    5. Query 문을 작성하여 실행 버튼을 누르면 정상적이면 하단의 그리드에
       결과 나타납니다

    6. 제가 테스트한 결과로는 일반적인 select, update, insert 등 은 잘 처리가 되는것
       같으나 show tables 등 관리적인 함수가 '지정되지 않은 오류입니다' 라는 
       오류 메시지가 발생합니다.

     

    dbconn.ini에서 해당 database 및 account / password등을 지금 사용하고 계시는 database로 연결하시고, 

     

    그 다음에 이 프로그램으로 테스트를 해 보시면 될 것 같습니다.

     

    select * from 같은 구문은 문제가 없으나, show tables를 하면 바로 error가 발생합니다.

     

    물론, 10.2 odbc에서는 잘 됩니다.

     

    11.2 에서 이런 문제가 발생하며, 10.2에서는 아주 간헐적으로 문제가 발생하기 때문에 디버깅하기가 매우 어렵습니다.

     

    저희 application에서 무조건 cubrid를 사용해서 10월 중순까지 프로젝트를 진행해야 하는 상황이기 때문에 좀 급합니다.

     

    빠른 답변 부탁드리겠습니다.

     

    감사합니다.

  • ?
    땜쟁이 2022.10.04 15:46
    혹시 검토하신 결과가 아직 안나오고 있는지요? 답변이 없으셔서 다시한번 댓글 남깁니다.
  • ?
    kisoo 2022.10.04 16:56
    저희가 문제를 재현했구요,
    해결 방안의 수정을 고려해서 가능하면 이번주까지 테스트 빌드를 전달해보도록 하겠습니다.
  • ?

    테스트 빌드를 올립니다. version은 11.2 입니다.

    이 version은 정식 release가 아니고 테스트 용도이니 참고하시기 바랍니다.

  • ?
    땜쟁이 2022.10.05 19:32
    이 버전으로 테스트를 해 보니, 아주 잘됩니다. 그런데, 이 버전으로 사용해도 되는 건지?
    궁금한 점이 있습니다.

    1. 정식 release가 아니고, 테스트용도라고 하셨는데, 저희는 정식적으로 사용을 해야 합니다. (정식버전은 언제쯤 release 하실 건지?)
    2. 어느 부분에 문제였는지 궁금합니다. (엔지니어로서 어느 부분인 지 알고 싶습니다.)

    이 두가지에 대한 답변을 듣고 싶습니다.
  • ?
    kisoo 2022.10.05 20:48

    답변을 드리겠습니다.
    1. 정식 release는 큐브리드의 QA 팀의 테스트를 거쳐서 release 됩니다. Release를 언제 배포할지는 아직 정해진 것은 없습니다.
    2. 문제가 되는 부분은 (이 부분은 엔지니어 언어로 기술하겠습니다, 참고로 이 부분이 CUBRID ODBC의 bug라고 볼 수는 없다고 생각됩니다.)
    - ODBC trace한 결과 사용하시는 platform (delphi)에서 일반적인 SQL 질의와 다른 큐브리드만의 session command (예: 'show tables')를 사용하는 경우
    * ODBC의 일반적인 query 실행 API (SQLExec, SQLExecDirect )가 아닌 SQLNativeSqlW () API를 호출하고 있습니다 (2번 호출)

                  SQLRETURN SQLNativeSqlW(
                                                     SQLHDBC ConnectionHandle,
                                                     SQLCHAR * InStatementText,
                                                     SQLINTEGER TextLength1,
                                                     SQLCHAR *OutStatementText,
                                                     SQLINTEGER BufferLength,
                                                     SQLINTEGER *TextLength2Ptr);

    * SQLNativeSql ()의 마지막 파라미터는 (SQLINTEGER *TextLength2Ptr) 인데 이것의 의미는 질의의 결과로 리턴되는 문자열의 문자수'를 의미합니다 (null 제외)
    * 문제는 TextLength2Ptr 포인터를 호출하는 부분에서 (delphi) 변수를 선언하고 주소를 넘겨줘여 할 것 같은데 2번째 호출에서 이 값이 NULL로 호출된다는 것입니다.
    * ODBC API에 이 포인터를 ODBC에서 할당해서 caller에 넘겨주는 것인지, 아니면 caller가 변수를 선언하고 주소를 넘겨주는 것인지는 명확하지 않습니다.
    * 테스트 빌드는 2 번째 SQLNativeSqlW에서 TextLength2Ptr 가 NULL로 호출되는 경우, ODBC에서 SQLINTEGER type의 변수를 선언하고 그 주소를 할당해주는
    방식으로 수정한 version 입니다.

    결론적으로 문제가 되는 부분은 SQLNativeSqlW (..., ) 함수의 마지막 파라미터, TextLength2Ptr, 변수를 어디에서 할당해야 하느냐 (application? ODBC Driver)
    하는 문제인 것 같습니다. 이 값이 NULL로 오는 경우 CUBRID ODBC가

     

        *TextLength2Ptr = xyz;

     

    형태의 문장을 실행하는 경우 ODBC DLL이 비 정상 종료되는 것입니다.

    결론적으로, 개인적인 생각으로는 제공한 테스트 빌드를 사용해도 될 듯합니다.
    큐브리드 고객이시라면 기술지원팀을 통해서 정식 release를 요청하실수 있습니다.

  • ?
    땜쟁이 2022.10.06 11:33
    상세한 설명 감사드립니다.

    다시 질문사항이 있습니다.

    결론적으로 문제가 되는 부분은 SQLNativeSqlW (..., ) 함수의 마지막 파라미터, TextLength2Ptr, 변수를 어디에서 할당해야 하느냐 (application? ODBC Driver)
    하는 문제인 것 같습니다. ----> 이 부분에서 저희 Delphi 쪽에서 해줘야 하는 사항이 있는 것인지요? (이 부분에 대한 의문점이 있습니다.)

    또한, ODBC API에 이 포인터를 ODBC에서 할당해서 caller에 넘겨주는 것인지, 아니면 caller가 변수를 선언하고 주소를 넘겨주는 것인지는 명확하지 않습니다.
    ---------> 이 부분에 대한 것도 정확하게 이해가 되질 않습ㄴ디ㅏ. Caller라 하면 delphi 측 인데, 여기서 변수를 선언하고 주소를 넘기는 것에 대한 부분이 저희 쪽에
    서는 특별하게 없습니다. 이 부분에 대한 명확한 해석이 필요할 것 같습니다.
    만약 delphi 가 범용적으로 현재 많이 사용되고 있는 언어는 아니기 때문에, 가능하시다면 다른 언어라도 application에서의 이 사항에 대한 사용법 예제가 있으시다면
    제공이 가능하신지? 질문 드립니다.

    그리고 두번째로 null 로 호출되는 경우, 만약 문제가 있다면 odbc driver 측에서 본다면, Exception Error의 상황인데, 그렇다면 예외처리 부분이 안되었던 것인지가
    궁금합니다.

    두서없이 제가 질문을 드려서 죄송하네요.

    바쁘시겠지만 검토 부탁드리겠습니다.

    감사합니다.
  • ?
    kisoo 2022.10.06 12:27

    1. Caller에서의 변수/주소 할당 문제..
       - 제 생각에는 SQLNativeSqlW늘 호출할 때 포인터 TextLength2Ptr를 넘기는데,

       - 이 포인터는 delphi에서 선언된 SQLINTEGER 변수의 주소이어야 한다고 생각합니다.

     

    2. TextLength2Ptr가 NULL로 호출되는 경우, CUBRID ODBC가 예외처리를 못한 부분은 맞습니다.

         CUBRID ODBC bug라고 생각합니다.

     

    지금 작업하시는 부분은 ODBC API를 직접 호출하는 것이 아니고, delphi가 ODBC를 호출하는 형태이기 때문에

    응용에서 별도로 작업을 할 수는 없는 상황인것 같습니다. Delphi나 ODBC를 수정하는 방법 뿐이 없을 듯 합니다.

     

    테스트 빌드로 보내드린 수정 사항을 반영해서 CUBRID ODBC를 release할 예정입니다. QA를 거쳐야 하는 사항이기

    때문에 정확한 release 날짜를 예측하긴 어렵지만, 다음주 말까지는 가능하지 않을까 생각됩니다.

    Release가 되면 이 thread에 공유하도록 하겠습니다.

     

  • ?

    위의 2번째 질의에 대해서:

      - SQLNativeSqlW () 함수에서 TextLength2Ptr이 NULL로 오는 경우, CUBRID ODBC에서 ERROR return을 하는 version으로 수정해봤습니다. (첨부)

      - 첨부해주신 'odbcTest'를 실행했을 때 정상 동작하는 것을 보니, delphi에서 의도적으로 TextLength2Ptr을 NULL로 호출한 듯 보입니다.

      - 이 version으로 테스트 해주세요.

     

    결론적으로 CUBRID ODBC 예외 처리를 잘 못해서 수고를 끼쳐드렸네요, 별 코멘트가 없으면 이 version으로 수정/Release 하겠습니다.

     

  • ?
    땜쟁이 2022.10.06 14:19
    테스트 해본 결과, 다른 부분은 이상이 없습니다. 다만, 한가지 안되는 쿼리가 있습니다.

    저희가 지금 현재 시간을 불러오는 쿼리를 사용하는데,

    select date_format(now(),'%T');

    이 쿼리를 전송하면, odbc 10..2에서는 아무 이상이 없이 현재 시간이 잘 return 되는데,

    11.2 새로 주신 odbc에서는 현재 시간이 전혀 조회가 되질 않습니다.

    이 부분에 대한 답변 부탁드립니다.
  • ?
    kisoo 2022.10.06 14:44
    CUBRID ODBC에서 10.2 이후에 query의 처리 부분은 특별히 변경된 부분은 없는데 한번 검토해보겠습니다.
    참고로 첨부하신 odbcTest에서 실행하니 결과가 'WIDEMEMO'라고만 나오네요.
  • ?
    kisoo 2022.10.07 10:42
    제가 작성하신 application을 모르는 상태에서 말씀드리기는 어렵지만, 첨부하신 테스트 프로그램을 실행할 때
    WIDEDEMO, MEMO type으로 표시되는 것이 ResetSet의 precision과 관계가 있는 것 같습니다.
    응용을 보지 않은 상태에서 이 부분이 ODBC가 오류라고 보기는 어렵습니다. 현재 사용하고 있는 ODBC는
    Database IDE인 SQLGate와도 연동해서 사용하고 있는 제품입니다. 제가 알기로 SQLGate도 Delphi platform을
    사용하고 있는 것으로 알고 있습니다.

    위의 Query의 결과를 VARCHAR(8)로 한정해서 아래와 같이 실행하시면 원하는 결과를 얻을수 있을 것 같습니다.

    select cast (date_format(now(),'%T') as varchar(8))

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 2500
3759 큐브리드 DB링크 문의드립니다. 2 file 초코초코초 2022.12.01 45
3758 Oracle to CUBRID Migration 방안 1 DBS 2022.12.01 34
3757 cubrid 엔진 설치 오류 1 file minsung 2022.12.01 24
3756 kill 명령어로 프로세스가 죽지 않을때 3 나라디 2022.12.01 34
3755 특정 컬럼 order by 시 한글 > 숫자 > 영문 순으로 정렬 방법? 2 Qubrid 2022.12.01 31
3754 클라우드 환경에서 데이터베이스 추가 관련 1 디콘플러스 2022.11.29 29
3753 csql로 sql파일 실행 시 변수 전달 3 공도비 2022.11.29 34
3752 Cubrid 이용 관련 문의 - 데이터 손실 1 flash 2022.11.24 52
3751 select 문의 응답속도가 느립니다. 2 steve 2022.11.22 57
3750 큐브리드 검색 초건 총 개수 구하는 함수나 방법알고 싶어요. 1 우유악마 2022.11.22 48
3749 create table 시 응답이 없습니다. 6 steve 2022.11.22 63
3748 볼륨 확장 문의드립니다. 3 Ches 2022.11.22 33
3747 오라클 패키지 마이그레이션 1 은정 2022.11.21 30
3746 오프라인 상태에서 큐브리드(11.2) 설치 시 필요 라이브러리 파일 관련 문의 드립니다 1 gidoree 2022.11.21 31
3745 clob 마이그레이션 문의 사항 3 sTricky 2022.11.21 46
3744 cubrid migration toolkit / CLOB 인코딩 이슈 해결방안 문의 (해결) 2 키롱 2022.11.18 40
3743 cubrid migration toolkit / Java heap space. Migration is interrupted (해결) 1 키롱 2022.11.18 22
3742 CUBRID DB Link insert, update, delete 1 리들러 2022.11.17 29
3741 cubrid migration toolkit / oracle → cubrid / CLOB 의 한글 깨짐 (해결) 3 키롱 2022.11.16 44
3740 추가문의가 있는 경우, 새 글을 적는게 좋을까요, 기존 글에 댓글 다는게 좋을까요? 2 키롱 2022.11.16 27
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 188 Next
/ 188

Contact Cubrid

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