Google 드라이브 폴더의 경로는 ...\AppData\Local\Google\Drive\sync_config.db
파일 (SQLite3 데이터베이스)에서 찾을 수 있습니다. 내 Windows C++ 프로그램은이 데이터를 성공적으로 가져 오는 데 사용되었지만 최근에는 내 PC와 내가들은 고객 모두에게 작동이 중지되었습니다. sqlite3
명령 줄 유틸리티를 사용하여 데이터베이스를 열고 프로그래밍 방식으로 사용하려고하는 정확한 쿼리로 성공적으로 쿼리 할 수 있기 때문에 데이터베이스가 여전히 유효해야합니다. 아래 그림과 같이 코드에서 어떻게됩니까Sqlite가 Google 드라이브 데이터베이스를 더 이상 열지 않습니다.
는 오류 코드 26
을 반환, 과거 **sqlite3_prepare_v2**
를 얻을 수 없다는 것이다. 이 코드는 일반적으로 파일이 유효한 데이터베이스가 아님을 나타냅니다. 그렇다면 커맨드 라인 유틸리티는 왜 작동합니까?
어떤 아이디어가 갑자기이 코드를 어기 는가?
extern CString GoogleDrivePath()
{
CString sPath = "";
CString sDbPath;
char acValue[1024];
DWORD lSize = sizeof(acValue);
struct _stat fstat;
sqlite3 *pDb;
sqlite3_stmt *pStmt;
int iSts;
char acSelect[] = "SELECT data_value FROM data WHERE entry_key = 'local_sync_root_path';";
const unsigned char *pPath;
DWORD lLen = GetEnvironmentVariable("LOCALAPPDATA", acValue, lSize);
if (lSize <= 0) return(sPath);
sDbPath = acValue;
sDbPath += "\\Google\\Drive\\sync_config.db";
if (_stat(sDbPath, &fstat) < 0) return(sPath);
iSts = sqlite3_open_v2(sDbPath, &pDb, SQLITE_OPEN_READONLY, NULL);
if (iSts) return(sPath);
iSts = sqlite3_prepare_v2(pDb, acSelect, -1, &pStmt, NULL);
if (!iSts) {
iSts = sqlite3_step(pStmt);
if (iSts == SQLITE_ROW) {
pPath = sqlite3_column_text(pStmt, 0);
if (pPath != NULL) {
sPath = pPath;
}
}
sqlite3_finalize(pStmt);
}
sqlite3_close(pDb);
return(sPath);
}
추측 : 그것은 쿼리 구문이 잘못되었을 때와 같이 관련이없는 상황에서도 SQLite가'SQLite_NOTADB'를 반환하는 것을 좋아합니다. 너의 것으로 보이는 유일한 것은 SQL 문자열에서 후행하는';'이다. 이것은 아마도 불필요 할 것이다. 그것없이 프로그램을 사용해 볼 수 있습니까? – millimoose
아니, 그게 아니야. 수수께끼는 이것이 그대로 작동하는 데 사용되었지만 이제는 실패합니다. 이것은 내 구성이나 SQLite 빌드에 동의하지 않는 데이터베이스 내에서 Google이 변경 한 것을 의미합니다. 그것은 명령 행 유틸리티가 V3.6.23이기 때문에 엄격하게 버전 작업이 아니며 작동합니다. – gordonwd