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 키르히아이스
,

 time_t tmNowtime;
 tm *pNowTime;

 

 tmNowtime = time(NULL);

 pNowTime = localtime(&tmNowtime);

 

 time_t tmLogOut;
 tm *pLogOutTime;

 

 tmLogOut = dwLogOutTime;

 pLogOutTime = localtime(&tmLogOut);

 


>> 위와 같이 localtime() 함수를 호출 시 pNowTime의 값이 pLogOutTime값으로 무조건 변경되는 문제가 발생

 

localtime()는 날짜와 시간을 저장하고 있는 tm 구조체를 반환하는데, 절대 반환받은 포인터를 해제해서는 안됩니다. 시간 라이브러리에서 공유하고 있는 메모리이기 때문에 해제할 때의 결과는 어떻게 될지 알 수 없습니다. 직접 할당한 메모리가 아니기 때문에 해제할 생각을 하지 말아야 합니다.

 

메모리를 공유하기 때문에 발생하는 문제가 있습니다. localtime() 호출은 같은 위치에 결과를 계속적으로 저장합니다. 사용자가 제공한 버퍼라면 매번 다른 위치에 기록할 수 있겠지만, 버퍼 하나만을 가지고 재활용하기 때문에 이전 결과는 사라집니다. 이것이 잘못된 동작은 아니지만 이전 시간을 저장해서 나중 시간과 비교하는 용도로 사용하려고 하면 문제가 됩니다. localtime()를 연속해서 호출하면 이전에 호출했던 모든 localtime() 호출의 결과는 사라집니다. 마지막에 호출했던 결과만 남습니다.


이런 그지같은 M$

 

포인터로 안받고 직접 tm변수로 선언해서 memcpy하면 해결되긴 한다.

 

하지만 많이 찝찝하다.

 

 time_t tmNowtime;
 tm pNowTime;

 

 tmNowtime = time(NULL);

 memcpy(pNowTime, localtime(&tmNowtime), sizeof(tm));

 

 time_t tmLogOut;
 tm *pLogOutTime;

 

 tmLogOut = dwLogOutTime;

 pLogOutTime = localtime(&tmLogOut);

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

SysLauncher error LNK2019: "public: bool __thiscall cFileUtility::FileCreate(char const *)" (?FileCreate@cFileUtility@@QAE_NPBD@Z) 외부 기호("public: int __thiscall SysLauncher::SequenceUser(void)" (?SequenceUser@SysLauncher@@QAEHXZ) 함수에서 참조)를 확인하지 못했습니다.

SysLauncher fatal error LNK1120: 3개의 확인할 수 없는 외부 참조입니다.

 

 

LNK2019, LNK1120 Error 발생이유...

 

1. 헤더를 인클루드만 하고 프로젝트에 헤더 및 .cpp를 포함하지 않을 경우...

 

2. .h 및 .cpp에 함수원형 및 함수호출을 해놓고 정작 함수 구현을 안했을 경우...

 

3. .c 와 .cpp를 프로젝트에서 같이 사용할 때 .h 만 인클루드하고 .cpp 는 인클루드 하지 않을 경우...

 

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

aaa.h

void CheckLNK2019(int ntest);

 

aaa.cpp

void LNK2019Test()

{

    CheckLNK2019(nTemp);

}

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

- CheckLNK2019 함수를 호출만 하고 실제 함수는 구현되어 있지 않을 경우...

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

릴리즈 모드 정적 라이브러리 옵션으로 컴파일 시 아래와 같은 LNK2019 발생

 

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

LINK : warning LNK4199: /DELAYLOAD leAcc.dll을(를) 무시합니다. OleAcc.dll에서 가져오기를 찾을 수 없습니다.
Starter.obj : error LNK2019: __imp__RegisterClassExA@4 외부 기호("unsigned short __cdecl MyRegisterClass(struct HINSTANCE__ *)" (?MyRegisterClass@@YAGPAUHINSTANCE__@@@Z) 함수에서 참조)를 확인하지 못했습니다.
Starter.obj : error LNK2019: __imp__LoadCursorA@8 외부 기호("unsigned short __cdecl MyRegisterClass(struct HINSTANCE__ *)" (?MyRegisterClass@@YAGPAUHINSTANCE__@@@Z) 함수에서 참조)를 확인하지 못했습니다.
Starter.obj : error LNK2019: __imp__LoadIconA@8 외부 기호("unsigned short __cdecl MyRegisterClass(struct HINSTANCE__ *)" (?MyRegisterClass@@YAGPAUHINSTANCE__@@@Z) 함수에서 참조)를 확인하지 못했습니다.

...............................

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

 

You are not linking the platform SDK libraries (kernel32.lib, user32.lib etc).  Review step #4 in the PDSK installation instructions.  Also make sure you selected the Win32 template to start your project.

 

결론은 platform SDK libraries 가 빠져서 나는 링크 에러다.

 

프로젝트 속성에서 컴파일 옵션에 kernel32.lib와 user32.lib등 라이브러리 파일들을 추가한 후 컴파일 하면 컴파일 잘된다.

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