m_rs.AddNew();

m_rs.m_nLevel = 10;

m_rs.Update();

 

CRecordset 을 ODBC 사용해서 위와 같이 입력 할 경우

실제 데이터는 정상적으로 테이블에 들어가는데 경고창이 뜨면서

 

"업데이트 또는 삭제 작업에 실패하였습니다."

 

라는 메세지가 나오는 경우

 

==============================================================================================

 

dbcore.cpp 3318 라인 에서

 

 // This should only fail if SQLSetPos returned SQL_SUCCESS_WITH_INFO explaining why
 if (nRetCode == SQL_SUCCESS_WITH_INFO && GetRowStatus(1) != wExpectedRowStatus)
  ThrowDBException(AFX_SQL_ERROR_UPDATE_DELETE_FAILED);

 

에러로 예외 처리 될 때

 

GetRowStatus(1)

rgRowStatus[0] 값이 쓰레기 값이 들어있어서 에러가 난다.

 

해당 상황은 CRecordset::Open() 시 AllocRowset() 함수에서 m_rgRowStatus를 동적 할당 하고 m_rgRowStatus 에 값을 넣지 못하여 쓰레기값이 지속되서 발생하는 문제이다.

 

AllocRowset() 함수에서 동적 할당 후 쓰레기값이 들어가는 것은 맞는데

 

dbcore.cpp 3308 라인을 보면

 

 AFX_ODBC_CALL(::SQLSetPos(m_hstmt, 1, wPosOption, SQL_LOCK_NO_CHANGE));

 

이 함수로 m_rgRowStatus의 값을 넣게 되어 있는데 ODBC로 MS SQL 2005 연결 시 데이터 원본 드라이버를 SQL Server가 아닌

SQL Native Client 로 설정하면 AFX_ODBC_CALL() 에서 제대로 된 값을 가져오지 못한다.

 

결국 ODBC 버전 문제로 결론이 났다.(VS 2003, MS SQL 2005 ODBC 연결)

 

===================================================================================================================

 

네이X에서 해당 문제에 대한 내용을 찾지 못하였다.

 

역시 구글신님...

 

똑같은 상황의 케이스가 구글에는 있었다.

 

Possible ODBC Driver Bug (via VC++/MFC CRecordset)

http://www.mail-archive.com/pgsql-hackers@postgresql.org/msg21457.html

 

한시간 반의 삽질 끝에 ODBC 버전의 문제라는걸 찾았다.

 

해당 문제로 삽질하시는 분들 참고 하시기 바랍니다.

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,