首页 > 数据库 >Win11系统,VS2022编写数据库程序,小体积,绿色单文件,支持密码保护,XP到Win11都能运行

Win11系统,VS2022编写数据库程序,小体积,绿色单文件,支持密码保护,XP到Win11都能运行

时间:2023-05-03 10:24:10浏览次数:44  
标签:int 密码保护 db char VS2022 rc sqlite3 Win11 NULL

在WIN11中用VS2022编写 小体积的绿色单文件,支持密码保护,XP到WIN11都能运行的数据库程序


1. 用VC60 建立一个Win32工程,VC60建立的工程默认是字节型的。
2. 用VS2010 读取并转换为2010格式,再用VS2022 读取,选择SDK和平台都不升级
3. 把 wxsqlite3-4.5.1.zip\wxsqlite3-4.5.1\sqlite3secure\src 整个目录复制到工程的工作目录。 (更高版本的wxsqlite3的结构不同)
4. 工程属性页配置VC++路径,include和source都加入wxsqlite3的路径
5. 把sqlite3.h和sqlite3secure.c加入工程,对sqlite3secure.c设置属性不使用预编译头
6.工程属性页的c/c++ 预处理定义中增加wxsqlite3的开关
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_HAS_CODEC=1
SQLITE3ENCRYPT_EXPORTS
SQLITE_ENABLE_FTS3
SQLITE_ENABLE_FTS3_PARENTHESIS
SQLITE_SECURE_DELETE
SQLITE_SOUNDEX
CODEC_TYPE=CODEC_TYPE_AES256
7.如果程序用到了WIN32 rebar工具调,在预定义头文件stdafx.h中增加版本定义

#define WINVER 0x500 // for win95 Rebar 
#define _WIN32_WINNT 0x500 // for win95

8.对于wxsqlite3,相比普通的sqlite3在打开数据库后增加调用密码
rc = sqlite3_open(filename, &m_db);
rc = sqlite3_key(m_db,"password",8); //使用密码,第一次为设置密码,以后为解密,最后参数是密码长度
9.尽量不要用图形化编程,纯代码是最通用的。

程序运行如图,测试在win11和XP中都能单个EXE文件正常运行,不需要额外的DLL

 整个程序因为是模仿MFC的C++封装SDK API,框架的代码有点长,主要就是把sqlite3的几个函数放在类里。调用执行。

 

#pragma once
#include "sqlite3.h"

class CwxSQLite
{
public:
    CwxSQLite(void);
    ~CwxSQLite(void);

public:
    sqlite3*    m_db;
    char**        m_sresult;
    BOOL        m_IsOpen;

public:
    BOOL    Open(char* filename);
    void    Close(); 
    BOOL    Query(char* sql, int &nrow, int &ncolum);
    BOOL    OnSqlExec(char* sql);
    static int sqlcallback(void* NotUsed, int argc, char** argv, char** azColName);

};

 

#include "StdAfx.h"
#include "wxSQLite.h"

CwxSQLite::CwxSQLite(void)
{
    m_sresult = NULL;
    m_db = NULL;
    m_IsOpen = FALSE;
}

CwxSQLite::~CwxSQLite(void)
{
    if (NULL != m_sresult)
    {
        sqlite3_free_table(m_sresult);
        m_sresult = NULL;
    }

    if (NULL != m_db)
    {
        sqlite3_close(m_db);
        m_db = NULL;
    }

    m_IsOpen = FALSE;
}

BOOL CwxSQLite::Open(char* filename)
{
    int rc;

    if (NULL != m_db)
    {
        sqlite3_close(m_db);
        m_db = NULL;
        m_IsOpen = FALSE;
    }

    rc = sqlite3_open(filename, &m_db);
    if (rc)
    {
        sqlite3_close(m_db);
        return FALSE;
    }
    else
    {
        //m_IsOpen = TRUE;
    }

    rc = sqlite3_key(m_db,"password",8); //使用密码,第一次为设置密码,以后为解密,最后是密码长度 
    //rc = sqlite3_rekey(m_db,NULL,0); //清空密码
      
    m_IsOpen = TRUE;
    return TRUE;

}
void CwxSQLite::Close()
{
    if (NULL != m_db)
    {
        sqlite3_close(m_db);
        m_db = NULL;
    }

    m_IsOpen = FALSE;
}

//查询SQL
BOOL CwxSQLite::Query(char* sql, int& nrow, int& ncolum)
{
    char* szErrMsg;
    int rc;

    if (NULL != m_sresult)
    {
        sqlite3_free_table(m_sresult);
        m_sresult = NULL;
    }

    rc = sqlite3_get_table(m_db, sql, &m_sresult, &nrow, &ncolum, &szErrMsg);  /* execute SQL statement */
    if (rc != SQLITE_OK)
    {
        if (NULL != szErrMsg)
        {
            //PRINT(_T("\r\n<ERR>SQL error: %s\n"), szErrMsg);
            sqlite3_free(szErrMsg);
            return FALSE;
        }
        //PRINT(_T("\r\n<OK>select success!"));
    }

    return TRUE;
}

//sql执行回调函数
int  CwxSQLite::sqlcallback(void* NotUsed, int argc, char** argv, char** azColName)
{
    int i;
    for (i = 0; i < argc; i++)
    {
        //PRINT(_T("%s = %s\n"), azColName[i], argv[i] ? argv[i] : "NULL");
    }
    //PRINT(_T("\r\n"));
    return 0;
}
//执行SQL
BOOL  CwxSQLite::OnSqlExec(char* sql)
{
    char* szErrMsg;
    int rc;
    //strcpy(sql,"create table  TStock(StockCode text, Time text, RealValue real );");

    rc = sqlite3_exec(m_db, sql, sqlcallback, 0, &szErrMsg);  /* execute SQL statement */
    if (rc != SQLITE_OK) 
    {
        sqlite3_free(szErrMsg);
        return FALSE;
    }

    return TRUE;
}

 

标签:int,密码保护,db,char,VS2022,rc,sqlite3,Win11,NULL
From: https://www.cnblogs.com/xgz21/p/17368731.html

相关文章

  • VS2022使用ClickOnce发布程序本地安装.net框架
    因为遇到下面的错误,没有在网上搜到详细解决问题的教程,费了一些时间才解决了问题,特此记录一下,也希望能帮助到其他人。 要在“系统必备”对话框中启用“从与我的应用程序相同的位置下载系统必备组件”,必须将“.NET桌面运行时6.0.14(x64)”项的文件“net6desktopruntime_x64\win......
  • Win11卸载“连接手机”UWP应用
    孽缘起因Win11提示可以联机手机,在电脑上能读取到手机上的通知,短信,通话等,也是闲着无事,就安装了试了试,发现其实没有MIUI+好用,就另外装上之后电脑玩游戏时CPU占用规律性的100%,我怀疑有bug,就准备卸载。结果呢?呵!好家伙,这鬼东西不让卸载!流氓行径!微软你学啥不好学这玩意,你这......卸......
  • excel的练习1--自定义单元格格式(win11)
    题目1.4自定义单元格格式。在EXCEL单元格区域设置自定义数字格式,实现如下效果:在该区域的任意单元格输入数字1,则显示为√,其他数据原样显示。则:1.格式定义形式为【1】.【提示:格式-单元格格式-自定义】2.格式定义之后得到的结果B4:F10复制粘贴为文本到第【2】空。答案步骤选......
  • 怎么在win11上使用安卓app
    首先开启Hyper-V开启之后直接去微软应用商店搜索amzonappstore下载然后这里我用的是一个叫秋之盒的软件管理找到子系统的IP地址这里需要开启开发人员模式然后输入IP连接就行......
  • Win11 删除右键固定到开始屏幕、快速访问
    Win11删除右键"固定到开始屏幕注册表路径: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shellex\ContextMenuHandlers删除: 删除名为PintoStartscreen的项目恢复: 新建名为PintoStartscreen的项目,默认数据:{470C0EBD-5D73-4d58-9CED-E91E22E23282}Win11删除......
  • DELL笔记本安装supportAssist方法for win11
    先安装,https://www.advanceduninstaller.com/卸载本机自带的supportAssist然后重新下载supportAssist地址:https://www.dell.com/en-us/shop/supportassistforpcs/cp/supportassistforpcs安装即可 ......
  • 卸载Win11小组件
    小组件就是Win+w的功能,也是widgets.exe的原型以管理员身份运行cmd,运行以下命令wingetuninstallMicrosoftWindows.Client.WebExperience_cw5n1h2txyewy之后Win+w就无效了要重新安装就wingetinstall9MSSGKG348SP......
  • Win11和Win10怎么禁用驱动程序强制签名? 关闭Windows系统驱动强制签名的技巧?
    前言什么是驱动程序签名?驱动程序签名又叫做驱动程序的数字签名,它是由微软的Windows硬件设备质量实验室完成的。硬件开发商将自己的硬件设备和相应的驱动程序交给该实验室,由实验室对其进行测试,测试合格后实验室将在其驱动程序中添加数字签名。由于数字签名是由微软完成的。Win11......
  • VS2022支持.Net4.0到4.8之前的方法
    1、在单独装VS2022的情况下(没有安装VS2019/2017...的情况下),打开ji代码报错2、报错原因:VS2022不在包含.netframework4系列版本。3、解决方法:拷贝对应版本的目录到 C:\ProgramFiles(x86)\ReferenceAssemblies\Microsoft\Framework\.NETFramework ......
  • WIN11 Windows 11 安装过程中如何跳过强制联网
    WIN11Windows11安装过程中如何跳过强制联网.22H2.在要求联网的页面中按下“Shift+F10”调出命令行窗口,再输入“OOBE\BYPASSNRO”,回车,会自动重启,再重新回到这一页面,此时选择“我没有Internet连接”即可。- ......