mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【C言語】SQLite3 で OPEN,SELECT,CLOSE(VisualStudio2017)

MFC & SQLite3 の勉強がてら VS2017でツールを作成中
とりあえず SELECT 関連のコードをメモ

f:id:myerss555:20190218034235j:plain

f:id:myerss555:20190218033003j:plain

	typedef struct tag_ListDb
	{
		// TABLE-GAME
		int		iGame_Id;
		CString	strGameTitleString;
		CString	strPublisherName;
		int		iReleaseYear;
		int     iPlayers;
		CString	strRatingImage;
		CString	strGameManualQrImage;
		int     iLinkGameId;
		// TABLE-DISC
		int		iDiscNumber;
		CString	strBaseName;
	} stListDb;
	stListDb		m_pstListDb[MAX_LIST_DB];
	int			m_iListDbCnt;
	char			m_ExecPath[MAX_PATH];	// 実行パス
	sqlite3		*m_pDB;
	char			*m_DBFileName = "regional_custom.db";
	sqlite3_stmt	*m_pStmt = NULL;

	int		iRet;

	char szPath[MAX_PATH];
	char szDrive[MAX_PATH];
	char szDir[MAX_PATH];
	char szFname[MAX_PATH];
	char szExt[MAX_PATH];

	m_iListDbCnt = 0;

	// 変換用
	CStringA strWork;
	std::string s;
	std::string sjis;

	// 実行ファイルのフルパスを取得
	GetModuleFileNameA(NULL, szPath, sizeof(szPath));

	//パス名を構成要素に分解
	_splitpath(szPath, szDrive, szDir, szFname, szExt);

	// 実行パスを取得
	strcpy(m_ExecPath, szDir);

	// DBファイル名を作成(フルパス)
	sprintf(szPath, "%s%s", szDir, m_DBFileName);

	// DB(GAME)のオープン
	iRet = sqlite3_open(szPath, &m_pDB);
	if (iRet != SQLITE_OK) {
		MessageBox(_T("OPEN ERROR!"), _T("SqlLite "), MB_ICONSTOP | MB_OK);
		return FALSE;
	}

	// SQL 編集
	iRet = sqlite3_prepare_v2(m_pDB,
		"SELECT * FROM game ORDER BY game_id", -1, &m_pStmt, NULL);
	if (iRet != SQLITE_OK) {
		MessageBox(_T("PREPARE ERROR!"), _T("SqlLite "), MB_ICONSTOP | MB_OK);
		iRet = sqlite3_close(m_pDB);
		return FALSE;
	}

	// SQL 実行
	int		i;
	for (i = 0; ; i++) {
		iRet = (iRet = sqlite3_step(m_pStmt));
		if (SQLITE_ROW != iRet) {
			break;
		}

		// GAME_ID
		m_pstListDb[i].iGame_Id = sqlite3_column_int(m_pStmt, 0);

		// GAME_TITLE_STRING(SELECT結果から項目取得、UTF8->SJIS変換)
		strWork = sqlite3_column_text(m_pStmt, 1);
		s = strWork;
		sjis = UTF8toSjis(s);
		m_pstListDb[i].strGameTitleString = sjis.c_str();

		// PUBLISHER_NAME(SELECT結果から項目取得、UTF8->SJIS変換)
		strWork = sqlite3_column_text(m_pStmt, 2);
		s = strWork;
		sjis = UTF8toSjis(s);
		m_pstListDb[i].strPublisherName = sjis.c_str();

		// RELEASE_YEAR
		m_pstListDb[i].iReleaseYear = sqlite3_column_int(m_pStmt, 3);
		
		// PLAYERS
		m_pstListDb[i].iPlayers = sqlite3_column_int(m_pStmt, 4);

		// RATING_IMAGE(SELECT結果から項目取得、UTF8->SJIS変換)
		strWork = sqlite3_column_text(m_pStmt, 5);
		s = strWork;
		sjis = UTF8toSjis(s);
		m_pstListDb[i].strRatingImage = sjis.c_str();

		// GAME_MANUAL_QR_IMAGE(SELECT結果から項目取得、UTF8->SJIS変換)
		strWork = sqlite3_column_text(m_pStmt, 6);
		s = strWork;
		sjis = UTF8toSjis(s);
		m_pstListDb[i].strGameManualQrImage = sjis.c_str();

		// LINK_GAME_ID
		m_pstListDb[i].iLinkGameId = sqlite3_column_int(m_pStmt, 7);

		m_iListDbCnt++;
	}
	m_pstListDb[i].iGame_Id = 0;

	// SQL 解放
	iRet = sqlite3_finalize(m_pStmt);
	m_pStmt = NULL;

	// DBのクローズ
	iRet = sqlite3_close(m_pDB);
	if (iRet != SQLITE_OK) {
		MessageBox(_T("CLOSE ERROR!"), _T("SqlLite"), MB_ICONSTOP | MB_OK);
		return FALSE;
	}