• MFC中使用sqlite3操作数据库 创建、插入、查询、修改、删除数据


    需要用到的文件有sqlite3.h 、sqlite3.dll、sqlite3.lib。获取方法可参考https://blog.csdn.net/qinbaby/article/details/83107345 。

    将这三个文件拷贝到自己新建MFC项目目录下,在解决方案窗口下 添加现有项,选择sqlite3.h 、sqlite3.dll、sqlite3.lib这三个文件,添加到项目中。

    然后在.cpp开头添加#include “sqlite3.h”

    一些宏定义:

    #define SQL_CREATE_TABLE "Create table if not exists User_info(UserName char(20), Password char(20), Level char(5))"
    
    #define SQL_INSERT_DATA "Insert into User_info (UserName, Password, Level) values ('%s', '%s', '%s')"
    
    #define SQL_QUERY_DATA "Select * from User_info"
    

    以及自定义管理struct

    typedef struct _INFO_
    {
    	CString UserName;
    	CString Password;
    	CString Level;
    }Info;
    
    sqlite3* m_pDB;
    

    1、创建数据库:

    	int rc;
    	char* err_msg = NULL;
    	sqlite3* m_pDB;
    	rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建  
    	if (rc)
    	{
    		sqlite3_close(m_pDB);  //打开失败!   
    		MessageBox(_T("数据库打开失败,请检查后再操作!"));
    		return;
    	}
    	if (sqlite3_exec(m_pDB, SQL_CREATE_TABLE, NULL, NULL, &err_msg) != SQLITE_OK)
    	{
    		MessageBox(_T("操作失败,数据库链表生成错误!"));
    		return;
    	}     
        sqlite3_close(m_pDB);
    

    2、插入数据

    		int rc;
    		char* err_msg = NULL;
    		char sql[256];
    		rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建  
    		if (rc)
    		{
    			sqlite3_close(m_pDB);  //打开失败!   
    			MessageBox(_T("数据库打开失败,请检查后再操作!"));
    			return;
    		}
    		USES_CONVERSION;
    		sprintf_s(sql, SQL_INSERT_DATA, W2A(c_UserName), W2A(c_PassWord), W2A(c_Level));
    		int exit = sqlite3_exec(m_pDB, sql, 0, 0, &err_msg);
    		if (exit != SQLITE_OK)
    		{
    			sqlite3_free(err_msg);
    			sqlite3_close(m_pDB);
    			CString cMessagebox;
    			cMessagebox.Format(_T("用户注册失败,失败原因:%s"), (LPCTSTR)err_msg);
    			return;
    		}
    		sqlite3_close(m_pDB);
    		MessageBox(_T("用户添加成功!")); 
    

    3、查询数据,两种方式都可以实现:

    方式1:

    	CString ErrMessage;
    	int rc;
    	char* err_msg = NULL;
    	rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建  
    	if (rc)
    	{
    		sqlite3_close(m_pDB);  //打开失败!   
    		MessageBox(_T("数据库打开失败,请检查后再操作!"), NULL, MB_ICONSTOP);
    		return;
    	}
    	sqlite3_stmt* stmt;
    	rc = sqlite3_prepare_v2(m_pDB, SQL_QUERY_DATA, -1, &stmt, 0);
    	if (rc != SQLITE_OK)
    	{
    		sqlite3_finalize(stmt);
    		sqlite3_close(m_pDB);
    		return;
    	}
    	m_List_UserManage.DeleteAllItems();
    	int m_line = 0;
    	rc = sqlite3_step(stmt);
    	while (rc == SQLITE_ROW)
    	{
    		Info info;
    		info.UserName = sqlite3_column_text(stmt, 0);
    		info.Password = sqlite3_column_text(stmt, 1);
    		info.Level = sqlite3_column_text(stmt, 2);
    		m_List_UserManage.InsertItem(m_line, info.UserName);
    		m_List_UserManage.SetItemText(m_line, 1, info.Password);
    		m_List_UserManage.SetItemText(m_line, 2, info.Level);
    		m_line = m_line + 1;
    		rc = sqlite3_step(stmt);
    	}
    	sqlite3_finalize(stmt);
    	sqlite3_close(m_pDB);
    

    方式2(未验证):

    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 ;  
    } 
     
    int row=0; 
    int colum=0;
    char **azResult;
    CArray<Info> arr;
    rc=sqlite3_get_table(m_pDB,SQL_QUERY_DATA,&azResult,&row,&colum,&err_msg);
    for (int i=1; i<row+1; i++)
    {
    Info info;
    info.subject= *(azResult+i*colum+1);
    info.name= *(azResult+i*colum+2);
    info.mark= *(azResult+i*colum+3);
    arr.Add(info);
    }
    sqlite3_free_table(azResult);
    sqlite3_close(m_pDB);
    

    4、修改数据:

    	//修改数据库
    	cUserName = DataChangeDlg.c_UserName;
    	cPassWord = DataChangeDlg.c_PassWord;
    	cLevel = DataChangeDlg.c_Level;
    	int rc;
    	char* err_msg = NULL;
    	char sql[256];
    	rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建  
    	if (rc)
    	{
    		sqlite3_close(m_pDB);  //打开失败!   
    		MessageBox(_T("数据库打开失败,请检查后再操作!"));
    		return;
    	}
    	USES_CONVERSION;
    	sprintf_s(sql, "UPDATE User_info Set Password='%s'  WHERE UserName='%s';", W2A(cPassWord), W2A(cUserName));
    	rc = sqlite3_exec(m_pDB, sql, NULL, 0, &err_msg);
    	if (rc != SQLITE_OK)
    	{
    		CString cMessagebox;
    		cMessagebox.Format(_T("密码更新失败,失败原因:%s"), (LPCTSTR)err_msg);
    		MessageBox(cMessagebox);
    		sqlite3_free(err_msg);
    		sqlite3_close(m_pDB);
    		return;
    	}
    	sprintf_s(sql, "UPDATE User_info Set Level='%s'  WHERE UserName='%s';", W2A(cLevel), W2A(cUserName));
    	rc = sqlite3_exec(m_pDB, sql, NULL, 0, &err_msg);
    	if (rc != SQLITE_OK)
    	{
    		CString cMessagebox;
    		cMessagebox.Format(_T("用户等级更新失败,失败原因:%s"), (LPCTSTR)err_msg);
    		MessageBox(cMessagebox);
    		sqlite3_free(err_msg);
    		sqlite3_close(m_pDB);
    		return;
    	}
    	MessageBox(_T("用户修改完成!"));
    	sqlite3_close(m_pDB);
    

    5、删除数据:

    	CString ErrMessage;
    	char sql[256];
    	int rc;
    	char* err_msg = NULL;
    	rc = sqlite3_open("UserData.db", &m_pDB);// 打开数据库,不存在时创建  
    	if (rc)
    	{
    		sqlite3_close(m_pDB);  //打开失败!   
    		MessageBox(_T("数据库打开失败,请检查后再操作!"), NULL, MB_ICONSTOP);
    		return;
    	}
    	//删除数据
    	USES_CONVERSION;
    	sprintf_s(sql, "delete from User_info WHERE  UserName='%s';",  W2A(cUserName));
    	rc = sqlite3_exec(m_pDB, sql, 0, 0, &err_msg);
    	if (rc != SQLITE_OK)
    	{
    		CString cMessagebox;
    		cMessagebox.Format(_T("删除失败,失败原因:%s"), (LPCTSTR)err_msg);
    		MessageBox(cMessagebox);
    		sqlite3_free(err_msg);
    		return;
    	}
    	MessageBox(_T("该用户已删除!"));
    	sqlite3_close(m_pDB);
    	m_List_UserManage.DeleteItem(nId);
    
  • 相关阅读:
    csp-s模拟 77/78 (达哥专场)
    csp-s 模拟76
    csp-s模拟75 导弹袭击
    反思集
    模拟69/70 考试反思
    抱大腿
    csp-s模拟61 甜圈
    实时记录
    好题思路集汇
    半集训反思 8.28 「路,还是要自己走的」
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16519749.html
Copyright © 2020-2023  润新知