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
}