Bootstrap

MFC实例【12】中使用sqlite3操作数据库

1、数据库语句:

1、创建表
Create table if not exists stu_info(id int PRIMARY KEY ASC, subject char(10), name char(10), mark char(5))
2、增加数据
Insert into stu_info (id, subject, name, mark) values (%d, '%s', '%s', '%s')
3、查询数据报表
Select * from stu_info
4、查询并去重
select *, count(distinct 字段名) from 表明 where 字段名1 = '条件' group by 字段名
SELECT  DISTINCT clientid FROM ShangxiaxianLog

2、在MFC中操作Sqlite3数据库:

   需要用到的文件有sqlite3.h ,sqlite3.lib。链接:https://pan.baidu.com/s/1FbrXR6Cw0qSoz4ogui3zFw 提取码:h47e 

(1)在头文件添加

#include "sqlite3.h"
#pragma comment(lib,"sqlite3.lib") 
typedef struct _INFO_
{
	CString subject;
	CString name;
	CString mark;
}Info;

typedef struct _LOG_
{ 
	CString clientid;
	CString szShangxian;
	CString szTime;
	CString szWan;
}Log;

(2)界面自己搭建,创建数据库和表

#define SQL_CREATE_TABLE "Create table if not exists stu_info(id int PRIMARY KEY ASC, subject char(10), name char(10), mark char(5))"
void CLineLogDlg::OnBnClickedButCreate()
{
	// TODO: 在此添加控件通知处理程序代码
	sqlite3 *m_pDB;
	int rc;
	char * err_msg = NULL;

	rc = sqlite3_open("myDatabase.db", &m_pDB);// 打开数据库,不存在时创建  
	if (rc)
	{
		sqlite3_close(m_pDB);  //打开失败!   
		MessageBox(_T("数据库打开失败,请检查后再操作!"), NULL, MB_ICONSTOP);
		return;
	}

	if (sqlite3_exec(m_pDB, SQL_CREATE_TABLE, NULL, NULL, &err_msg) != SQLITE_OK)
	{
		MessageBox(_T("操作失败,数据库链表生成错误!"), NULL, MB_ICONSTOP);
		return;
	}
	sqlite3_close(m_pDB);
}

 (3)插入数据库

#define SQL_INSERT_DATA "Insert into stu_info (id, subject, name, mark) values (%d, '%s', '%s', '%s')"
void CLineLogDlg::OnBnClickedButInsert()
{
	// TODO: 在此添加控件通知处理程序代码
	sqlite3 *m_pDB;
	int rc;
	char * err_msg = NULL;
	char sql[256];

	rc = sqlite3_open("myDatabase.db", &m_pDB);// 打开数据库,不存在时创建  
	if (rc)
	{
		sqlite3_close(m_pDB);  //打开失败!   
		MessageBox(_T("数据库打开失败,请检查后再操作!"), NULL, MB_ICONSTOP);
		return;
	}
	sprintf_s(sql, SQL_INSERT_DATA, 1, "Java", "John", "3");
	int exit = sqlite3_exec(m_pDB, sql, 0, 0, &err_msg);
	if (exit != SQLITE_OK)
	{
		sqlite3_close(m_pDB);
		return;
	}

	sprintf_s(sql, SQL_INSERT_DATA, 2, "C", "Deny", "1");
	exit = sqlite3_exec(m_pDB, sql, 0, 0, &err_msg);
	if (exit != SQLITE_OK)
	{
		sqlite3_close(m_pDB);
		return;
	}

	sqlite3_close(m_pDB);
}

(4)、查询数据库

#define SQL_QUERY_DATA "Select * from stu_info"
void CLineLogDlg::OnBnClickedButTest()
{
	// TODO: 在此添加控件通知处理程序代码
	sqlite3 *m_pDB;
	sqlite3_stmt *stmt;
	int rc;
	int result;
	char * errmsg = NULL;
	char **dbResult; //是 char ** 类型,两个*号
	int nRow, nColumn;
	rc = sqlite3_open("offlinefile.db3", &m_pDB);// 打开数据库,不存在时创建 
	if (rc)
	{
		sqlite3_close(m_pDB);  //打开失败!   
		MessageBox(_T("数据库打开失败,请检查后再操作!"), NULL, MB_ICONSTOP);
		return;
	}
	
	result = sqlite3_get_table(m_pDB, SQL_QUERY_DATANEW, &dbResult, &nRow, &nColumn, &errmsg);
	int StartNum = m_list.GetItemCount();
	if (nRow > StartNum) 
	{
		rc = sqlite3_prepare_v2(m_pDB, SQL_QUERY_DATANEW, -1, &stmt, 0);
		if (rc != SQLITE_OK)
		{
			sqlite3_close(m_pDB);
			return;
		}
		rc = sqlite3_step(stmt);
		int i = 0;
		m_list.DeleteAllItems();
		while (rc == SQLITE_ROW)
		{
			Log info;
			info.clientid = sqlite3_column_text(stmt, 0);
			info.szShangxian = sqlite3_column_text(stmt, 1);
			info.szTime = sqlite3_column_text(stmt, 2);
			info.szWan = sqlite3_column_text(stmt, 6);

			int nCount = m_list.GetItemCount();
			if (nCount > 0)
				m_list.EnsureVisible(nCount - 1, FALSE);
			m_list.InsertItem(i, _T(info.clientid));
			m_list.SetItemText(i, 1, _T(info.szWan));
			m_list.SetItemText(i, 2, _T(info.szShangxian));
			m_list.SetItemText(i, 3, _T(info.szTime));
			i++;
			rc = sqlite3_step(stmt);
	
	}
	}
	
	sqlite3_close(m_pDB);

}

(5)、初始化界面

BOOL CLineLogDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	CRect rect;

	// 获取编程语言列表视图控件的位置和大小   
	m_list.GetClientRect(&rect);

	// 为列表视图控件添加全行选中和栅格风格   
	m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

	// 为列表视图控件添加三列   
	m_list.InsertColumn(0, _T("XXID"), LVCFMT_CENTER, rect.Width() / 4, 0);
	m_list.InsertColumn(1, _T("XXXX1"), LVCFMT_CENTER, rect.Width() / 4, 1);
	m_list.InsertColumn(2, _T("XXX2"), LVCFMT_CENTER, rect.Width() / 4, 2);
	m_list.InsertColumn(2, _T("XXX3"), LVCFMT_CENTER, rect.Width() / 4, 2);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

;