안녕하세요.
VC++ 에서 ADO 의 RecordSet 을 이용하여 MSSQL DB 에서 select 를 하는데,
'db_e_object open object was open' 가 리턴되고 있는데,
문제될 수 있는 부분, 또는 문제를 추가로 분석하기 위해, 필요한 것이 있다면 어떤 부분이 있을지 궁금하여 문의 드립니다.
- 기존 사용중이던 테이블인데, 키도 없고, 인덱스도 없는 상태 입니다.
1. 컬럼 중 시간 컬럼이 있어서, 정렬하여 가져오는 부분이 있는데, 이 부분으로 인해 비용이 많이 발생되는 듯 하여,
제외하고 수행해봤으나, 결과는 같았습니다.
2. 총 4개의 컬럼이 있는데, 컬럼 전체 조회가 아닌, 1개 혹은 2개 컬럼의 데이터만 가져오게끔 하면 성공하기도 하는 것은
확인 했으나, 이것으로 원인 유추가 가능할 부분이 있을지 모르겠습니다.
- 추가로 테스트 중인 DB 정보는 아래와 같습니다.
DB : MSSQL 2008 R2 Express버전 (해당 버전의 DB별 최대용량은 10기가로 알고 있습니다)
- 문제 분석중인 DB 상태
MDF 파일 용량은 10기가로 확인되고 있으며, 데이터 ROW갯수는 1600만 남짓 입니다.
그럼 모쪼록 도움 부탁드리겠습니다.
감사합니다!
Comment 3
-
코난(김대우)
2021.09.02 15:59
-
Cover Fly
2021.09.02 21:31
관련 부분도 살펴보지 않은 것은 아니지만, 놓친 부분은 없을지 다시 한번 체크해봐야겠네욥~
코난님~ 자세한 답변 감사드립니다! 경과에 따라 추가 덧글 작성토록 하겠습니다^^
-
Cover Fly
2023.02.24 11:28
어쨌든, 예전에 해결은 시켰는데, 이제야 경과를 남깁니다. 코난님 조건에 따라, 체크해보다가, 옵션 관련 부분에 대해 나온 부분이 있어, 해당 부분을 변경해봤는데, 다행히 해결이 되었습니다.
Recordset 객체의 Open 메서드를 통해 실행하고 있었는데, 인자값중, CursorType 값을 adOpenStatic 으로 변경한 뒤 해결되었습니다.
아래는 델파이의 오류지만, 컨셉은 같을 듯 합니다.
"Object Was Open" error using Delphi, SQL Server and ADO - Stack Overflow
즉, 데이터가 클 경우에 timeout 등의 이유로 발생하는 것으로 보입니다.
위의 stackoverflow처럼, timeout property 부터 체크해 보세요.
예를 들어 timeout이면,
Stored Procedure Properties Example (VC++) - ActiveX Data Objects (ADO) | Microsoft Docs
이렇게, 이런 command 부분 등에서 바꾸면서 해 보시길 권장해 드립니다.
_bstr_t strCnn("Provider='sqloledb'; Data Source='My_Data_Source'; Initial Catalog='pubs'; Integrated Security='SSPI';");
try {
// Define a command object for a stored procedure.
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
hr = pConnection->Open(strCnn, "", "", adConnectUnspecified);
TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));
pCmdByRoyalty->ActiveConnection = pConnection;
pCmdByRoyalty->CommandText = "byRoyalty";
pCmdByRoyalty->CommandType = adCmdStoredProc;
pCmdByRoyalty->CommandTimeout = 15;