2

...\AppData\Local\Google\Drive\sync_config.dbGoogle ドライブ フォルダへのパスは、SQLITE3 データベースであるファイルにあります。私の Windows C++ プログラムは、以前はこのデータを正常に取得していましたが、最近、私の PC と私が聞いた顧客の両方で動作しなくなりました。sqlite3コマンド ライン ユーティリティを使用してデータベースを開き、プログラムで使用しようとしている正確なクエリで正常にクエリを実行できるため、データベースは引き続き有効である必要があります。

以下に示すコードで何が起こるかというと**sqlite3_prepare_v2**、エラー コードを返すことはありません26。通常、このコードは、ファイルが有効なデータベースではないことを示します。では、なぜコマンド ライン ユーティリティが機能するのでしょうか。

このコードを突然壊してしまう可能性のある変更のアイデアはありますか?

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);
}
4

2 に答える 2

1

私は修正を見つけました。私の製品は V3.6 でビルドされ、動作しなくなりました。実際に機能したコマンドライン ユーティリティは V3.7 でした。そこで、プログラムを sqlite3.c V3.7.14.1 で再構築したところ、動作するようになりました!

そのため、どうやら Google は新しいバージョンの SQLite を使用しているため、何らかの理由でデータベースが後方互換性を失っているようです。

(私のプログラムは、Android デバイスで使用される SQLite データベースも作成するため、バージョンの更新について少し心配していましたが、問題なく動作しているようです。)

于 2012-10-26T22:04:04.467 に答える
0

コマンド ライン ユーティリティは、データベースを読み取り専用モードで開こうとしません。試してみてくださいSQLITE_OPEN_READWRITE

読み取り専用モードが失敗する理由は 2 つあります。データベースにホット ジャーナルがあり、リカバリが必要な場合、または WAL が有効になっている場合です。

于 2012-10-26T07:04:06.780 に答える