MS SQL 2005 ODBC 연결로 CRecordset 사용 시 AddNew() 에서 업데이트나 삭제 에러 날 경우
Development/삽질의 추억 2011. 8. 13. 16:54m_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 버전의 문제라는걸 찾았다.
해당 문제로 삽질하시는 분들 참고 하시기 바랍니다.
'Development > 삽질의 추억' 카테고리의 다른 글
nafxcw.lib(afxmem.obj) : error LNK2005 (0) | 2011.08.13 |
---|---|
MS-SQL 서비스 시작 시 1069 로그온에러 (0) | 2011.08.13 |
localtime() 함수 연속 호출 시 모든 결과값이 마지막 포인터로 변경되는 문제 (0) | 2011.08.13 |
LNK2019, LNK1120 Error (0) | 2011.08.13 |
LNK2019 에러 (0) | 2011.08.13 |