基于MFC中SQLite3数据库操作快速入门

2023-01-27 15:10:44 3487人已围观 12已点赞 11人已收藏

简介本文向大家介绍一个C++实战项目:基于MFC中SQLite3数据库操作快速入门,主要介绍MFC中对SQLite3数据库的创建、数据查询、删除等常见操作,并对其进行封装操作,具有一定的C++实战价值,感兴趣的朋友可以参考一下。

1、SQLite简要介绍

SQLite是一个C语言库,它实现了一个小型、快速、自包含、高可靠性、全功能的SQL数据库引擎。SQLite是世界上使用最多的数据库引擎。SQLite内置于所有手机和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。目前最新版本是SQLite3。

2、SQLite3下载编译

本文示例源码工程中已集成编译好的sqlite3.lib、sqlite3.dll,有需要的可在文末下载。

3、创建示例工程

使用VS2015创建一个名为“SQLiteDemo”的对话框工程:

SQLite,SQLite3,C++操作SQLite3数据库,MFC操作SQLite3数据库

然后将sqlite3.h、 sqlite3.dll包含到项目中:

SQLite,SQLite3,C++操作SQLite3数据库,MFC操作SQLite3数据库

测试创建数据库代码:

void CSQLiteDemoDlg::OnBnClickedOk()
{
	CString strDbPath;
	GetCurrentDirectory(strDbPath);
	strDbPath += _T("test.db3");

	USES_CONVERSION;
	sqlite3* db;
	int res = sqlite3_open(T2A(strDbPath), &db);
	if (SQLITE_OK == res)
	{
		OutputDebugStringA("Open database succeed.");
	}
	else
	{
		CString sTemp = _T("");
		sTemp.Format(_T("Can't open database:%s"), sqlite3_errmsg(db));
		MessageBox(sTemp, _T("系统提示"), MB_ICONEXCLAMATION);
		return;
	}
	// SQL语句
	const char* sql = "CREATE TABLE company("  \
		"id INT PRIMARY KEY     NOT NULL, " \
		"name           TEXT    NOT NULL, " \
		"age            INT     NOT NULL, " \
		"address        CHAR(50), " \
		"salary         REAL );";
	// 执行SQL语句
	char* errmsg = nullptr;
	res = sqlite3_exec(db, sql, 0, 0, &errmsg);
	if (SQLITE_OK == res)
	{
		OutputDebugStringA("Create table succeed.");
	}
	else
	{
		CString sTemp = _T("");
		sTemp.Format(_T("SQL error:%s"), errmsg);
		MessageBox(sTemp, _T("系统提示"), MB_ICONEXCLAMATION);
		sqlite3_free(errmsg);
	}
	sqlite3_close(db);
	MessageBox(_T("创建完成!"), _T("系统提示"), 0);
}

执行后会在程序运行目录下生成一个名为“test.db3”的数据库。使用辅助工具SQLiteStudio打开,可以看到数据库表中结构如下:

SQLite,SQLite3,C++操作SQLite3数据库,MFC操作SQLite3数据库

4、CppSQLite3U的使用

以上编写创建数据库语句使用起来不是很友好,考虑到后续执行查询、清除数据等命令,因此需要对SQLite的操作进行封装。CppSQLite3U是一个封装好的MFC可以使用的操作sqlite3的类。

实战示例:创建一个“学生信息数据库”,创建一张“学生成绩表信息”。

首先创建一个继承自CppSQLite3DB的数据库操作类CStudentSqlite:

#pragma once
#include "..\stdafx.h"
#include "..\basic\sqlite\CppSQLite3U.h"


// 学生成绩表信息
typedef struct STUDENT_GRADE_INFO
{
	CString ID;
	CString Name;
	int Grade;
}STUDENT_GRADE_INFO;

// 学生信息数据库
class CStudentSqlite : public CppSQLite3DB
{
public:
	// @Path 数据库文件所在目录
	CStudentSqlite(const TCHAR* Path);
	virtual ~CStudentSqlite();
	// 写入
	bool AddRecordToTableGrade(const STUDENT_GRADE_INFO* pStuGradeInfo);
	// 读取
	void ReadDataTest();
protected:
	void InitDB();
private:
	char m_csDir[512];
	bool m_bIsOpen;
};

InitDB()函数中创建表:

void CStudentSqlite::InitDB()
{
	try
	{
		if (!tableExists(_T("学生成绩表")))
		{
			execDML(TEXT("CREATE TABLE 学生成绩表 ( \
					ID           CHAR( 50 )      PRIMARY KEY,\
					Name		 CHAR( 50 ),\
					Grade		 integer\
					);"));
		}
		else
		{
			// 清空数据
			execDML(TEXT("DELETE FROM 学生成绩表"));
		}
	}
	catch (CppSQLite3Exception &e)
	{
		TRACE("CStudentSqlite::InitDB %s", e.errorMessage());
	}
}

然后,我们在示例工程中创建名为“student.db3”的数据表:

#define STUDENT_DB_FILE_NAME TEXT("student.db3")
void CSQLiteDemoDlg::OnBnClickedOk()
{
	CString strDbPath;
	GetCurrentDirectory(strDbPath);
	strDbPath += STUDENT_DB_FILE_NAME;

	CStudentSqlite BbStudent(strDbPath);
	STUDENT_GRADE_INFO* pStuGradeInfo = new STUDENT_GRADE_INFO;
	for (int i = 0; i < 10; ++i)
	{
		pStuGradeInfo->ID.Format(_T("%07d"), i + 1);
		pStuGradeInfo->Name.Format(_T("学生%d"), i + 1);
		pStuGradeInfo->Grade = rand() % 100;
		BbStudent.AddRecordToTableGrade(pStuGradeInfo);
	}
	BbStudent.ReadDataTest();
	MessageBox(_T("创建完成!"), _T("系统提示"), 0);
}

执行后会在程序运行目录下生成一个名为“student.db3”的数据库

SQLite,SQLite3,C++操作SQLite3数据库,MFC操作SQLite3数据库

源码下载
  • 最近更新:   2022-06-13开发环境:   Visual Studio 2015
  • 源码大小:   492.83KB下载次数:  30 

更多为你推荐