简介本文向大家介绍一个C++实战项目:基于MFC中SQLite3数据库操作快速入门,主要介绍MFC中对SQLite3数据库的创建、数据查询、删除等常见操作,并对其进行封装操作,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
SQLite是一个C语言库,它实现了一个小型、快速、自包含、高可靠性、全功能的SQL数据库引擎。SQLite是世界上使用最多的数据库引擎。SQLite内置于所有手机和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。目前最新版本是SQLite3。
本文示例源码工程中已集成编译好的sqlite3.lib、sqlite3.dll,有需要的可在文末下载。
使用VS2015创建一个名为“SQLiteDemo”的对话框工程:
然后将sqlite3.h、 sqlite3.dll包含到项目中:
测试创建数据库代码:
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的操作进行封装。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”的数据库
本文向大家介绍一个C++实战项目:C++中SQLite与文件系统I0读写性能比较,主要介绍SQLite数据库的优缺点,以及在同样条件下SQLite与文件系统IO读写性能比较,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++中SQLite多行数据一次性写入,提高多行数据插入到SQLite数据库中的速度,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现一个SQL数据库连测试工具,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:基于Win32工程C++连接MYSQL数据库,主要介绍C++如何快速连接MySQL数据库并执行SQL语句,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现对SQL Server访问操作的封装类,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍C++实现对MySQL访问操作的封装类,感兴趣的朋友可以参考一下。