인터넷 찾아 봐도 버그가 있다는 것은 있지만 명확한 답변은 없네요
mfc로 작성된 실행파일이 윈98에 잘 돌아 가는데
XP에서는 특정부분에 에러가 발생합니다.
버그인것으로 추정되는데 좋은 방법 없을까요?
실행환경은 아래와 같습니다.
PC 는 윈도XP sp2
D:드라이브는 네트워크 드라이브이며 pc-NFS(허밍버드)로 유닉스에 있는
액세스 파일을 이용합니다
E:드라이브는 USB메모리가 있습니다.
E 드라이브의 파일을 D: 드라이브(네트워크)에 있는 mdb 파일에 필요 정보를 등록합니다.
파일은 여러개 또는 한개일 수 있고 랜덤합니다.
물론, 중간 중간 여러처리를 합니다. 레지스트에 하나 처리할때 마다 카운터 올리는등
ODBC로 MDB 파일을(D:드라이브 위치, 유닉스에 있는 물리적 HDD를 네트워크 드라이브로 이용)이용합니다.
윈 98에는 작동 잘 하는데 XP에서는 MDB파일 쓰는게 규칙 없이 에러가 발생합니다.
값을 mdb 파일에 등록하면 그 값이 프로그램 최초 실행후에는 잘 됩니다.
하지만 일정 시간(5분정도)이 지나면 데이터가 프로그램 로직을 벗어난 곳에도 등록됩니다
2개를 등록하라고 하면 4개가 등록될때도 있고 2개가 제대로 등록될때도 있습니다.
물론, 등록될때의 값을 txt파일로 저장되도록 만들면 정확히 txt파일에는 저장됩니다.
그런데 mdb 파일에는 정확한 값이 아닌 불일치 값이 저장됩니다.
2개를 써라고 하면 txt는 2개가 쓰이나 mdb 파일에는 2개 이상 3-5개가 쓰이고 그 값 또한 즉시 쓰일대도 있고
2-3초 정도 지나서 쓰일때도 있습니다
인터넷에는 xp에서 network 드라이브를 매핑해서 사용할 때 불일치 될 수 있다는
내용을 봤는데 해결책이라고 mdb파일 777로 권한을 변경하라는 것 정도인데
그렇게 해도 안되네요 또한, pagetimeout을 기본값 5에서 5000으로 변경하라는
내용을 보고 그렇게도 해 봤습니다.
윈도xp에서도 프로그램이 바로 실행된 다음에는 정상작동하나
5분 정도 지나서 부터 이상하게 데이터를 씁니다.
아래는 txt 파일의 내용입니다. 검증을 위한 txt는 정확한 값을 기록합니다.(시간까지 확인함)
mdb와 동일해야 하나 mdb는 값이 틀리게 들어 값니다.
카운터= 10, 번호 = 01392, 문서번호= 00206, 시간 = 07.03.15 11:35
카운터= 11, 번호 = 01393, 문서번호= 00313, 시간 = 07.03.15 11:35
카운터= 12, 번호 = 01394, 문서번호= 00191, 시간 = 07.03.15 11:37
카운터= 13, 번호 = 01395, 문서번호= 00314, 시간 = 07.03.15 11:37
카운터= 14, 번호 = 01396, 문서번호= 00311, 시간 = 07.03.15 11:39
카운터= 15, 번호 = 01397, 문서번호= 00312, 시간 = 07.03.15 11:39
아래 함수는 mdb에 쓰는 함수입니다.
int CSendDlg::odbc_input() // odbd input
{
if(m_key.IsOpen()) m_key.Close();
m_key.Open();
// 아래내용은 위 txt파일을 만들어서 mdb파일에 등록직전 상태를 확인하기 위한 것이며
// 모든 데이터는 정상적으로 txt파일에 시간까지 체크해 봤는데 저장됩니다. 하지만 MDB파일에는 이상한 영역에도 추가 저장됩니다.
// MDB파일 쿼리하기 전 TXT로 내용을 검증해 봅니다.
FILE *stext;
while ((stext=fopen("d:\\test.txt","a"))== NULL) {
fclose(stext);
AfxMessageBox("화일생성실패" );
return 0;
}
fprintf( stext, "\n카운터= %d, 번호 = %s, 문서번호= %s, 시간 = %s",nValue, i_rmsg1.file_name, i_rmsg1.msg_no,buf );
fclose(stext);
///////////////
m_key.Move(nValue);
m_key.Edit();
m_key.m_o_number = i_rmsg1.file_name;
m_key.m_o_code = i_rmsg1.msg_no;
m_key.m_o_date = buf;
m_key.m_o_con1 = "미처리";
if(!m_key.Update())
{
AfxMessageBox("Record not Added ");
return FALSE;
}
if(!m_key.Requery())
AfxMessageBox("requery 할수 없음");
if(m_key.IsOpen()) m_key.Close();
++nValue;
if(nValue >= 100) {nValue=0; /* AfxMessageBox("100 ->0 변경");*/}
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileInt("MySection", "MyInt", nValue);
nValue =pApp->GetProfileInt("MySection", "MyInt", 0);
return 0;
}
위 mdb 파일에 아래처럼 되고 또 다른 PC에서 MDB 파일을 처리 합니다.
카운터 번호 문서번호 일 시 처리
10, 01392, 00206, 07.03.15 11:35 미처리
11, 01393, 00313, 07.03.15 11:35 미처리
12, 01394, 00191, 07.03.15 11:37 미처리
13, 01395, 00314, 07.03.15 11:37 미처리
14, 01396, 00311, 07.03.15 11:39 미처리
15, 01397, 00312, 07.03.15 11:39 미처리
다른 PC에서 MDB파일을 처리한 후 데이터 값
카운터 번호 문서번호 일 시 처리
10, 01392, 00206, 07.03.15 11:35 완료
11, 01393, 00313, 07.03.15 11:35 완료
12, 01394, 00191, 07.03.15 11:37 완료
13, 01395, 00314, 07.03.15 11:37 완료
14, 01396, 00311, 07.03.15 11:39 완료
15, 01397, 00312, 07.03.15 11:39 완료
시간이 9분 정도 지난다음 등록PC에서 16번 데이터 1개를 등록하면
카운터 번호 문서번호 일 시 처리
10, 01392, 00206, 07.03.15 11:35 미처리
11, 01393, 00313, 07.03.15 11:35 완료
12, 01394, 00191, 07.03.15 11:37 완료
13, 01395, 00314, 07.03.15 11:37 완료
14, 01396, 00311, 07.03.15 11:39 완료
15, 01397, 00312, 07.03.15 11:39 완료
16, 01398, 00316, 07.03.15 11:48 미처리
이렇게 됩니다. 16번을 11:48분에 미처리로만 등록 되어야 정상이나
위 10번의 완료를 미처리로 강제로 변환해 버립니다. 이미 처리된 값이 코드상에도 완벽한데 강제변환됩니다
TXT 파일을 확인하면 16, 01398, 00316, 07.03.15 11:48 16번만 append 된 것을 확인가능합니다.
그런데 이상하게 10번 값이 완료에서 미처리로 데이터 값이 변합니다.
물론,
그런데 시간이 지나서 자료가 계속 등록되면 2건 등록하면 2건이 미처리 되어야
하나 실제로 기존에 완료 로 세팅된 부분까지 미처리로 다시 세팅합니다.
시간이나 번호 등 다른 부분은 엉뚱한 값을 쓰지 않는데 유독 처리부분만
값을 이상하게 쓰네요
검증을 위해서 만들어 놓은 txt파일은 정확한 값을 쓰고 있습니다.
도대체 뭐가 잘 못 된 것인지요?
꼭 도움이 될 만한 내용 어떤 것도 좋습니다.
ODBC 버그, 네트워크 문제, XP문제 등
윈98에서는 잘 작동합니다. XP 로 변경해야 합니다.
감사합니다.
|