SQLiteDB 数据库连接_Frank.Ginger的博客-程序员ITS301_sqllite 链接db

技术标签: 数据库  

BOOL CSqliteDB::InitDB( WCHAR* pDbName, BOOL bType )
{
    //数据库信息
    m_pDbFileName = pDbName;

    //初始化数据库
    if( m_bInit )
    {
    	CloseDatabase();
    }

    //判断数据库文件是否存在
    if( !PathFileExists( m_pDbFileName ) && !CreateDatabase( m_pDbFileName ) )
    {
    	//FS_LOG_ERROR( _T( "数据库文件丢失,并且创建失败,错误码: [%d]" ), 0x00003 );
    	return FALSE;
    }

    //连接到数据
    if( !OpenDatabase( bType ) )
    {
    	//FS_LOG_ERROR( _T( "连接到数据库失败,错误码: [%d]" ), 0x00004 );
    	return FALSE;
    }

    //输入密钥,如果无密码则加密,如果有密码则解密
    //EnterEncryptKey( DB_ENCRYPT_KEY, strlen( DB_ENCRYPT_KEY ) );

    //登录信息 
    if( !IsTableExist( TABLE_NAME ) && bType )
    {
    	_CreateTable();
    }
}
BOOL CDBBase::CloseDatabase()
{
    m_bInit = false;
    if (m_pDB == nullptr) return true;

    sqlite3_finalize(m_statement);
    int ret = CloseDBHandle();

    m_statement = nullptr; 
    m_pDB = nullptr; 
    
    return (SQLITE_OK == ret);
 }

 int CDBBase::CloseDBHandle()
 {
    int code = sqlite3_close( m_pDB );
    while ( SQLITE_BUSY == code )
    {
        code = SQLITE_OK; sqlite3_stmt * stmt = sqlite3_next_stmt( m_pDB, NULL );
        if ( stmt == nullptr ) break; 
        code = sqlite3_finalize( stmt );
        if ( code == SQLITE_OK )
        {
            code = sqlite3_close( m_pDB );
        }
    }
		
    if ( SQLITE_OK != code )
    {
        m_nLastError = code;
    }
    return code;
}
BOOL CDBBase::CreateDatabase( WCHAR* pFilePullPath )
{
    if( PathFileExists( pFilePullPath ) )
    {
        return TRUE;
    }

    return CreateFileEx( pFilePullPath );
}

BOOL CDBBase::CreateFileEx( WCHAR* pFileFullPath )
{
    //要创建文件首先要检查路径存在否
    int nIndex = -1;

    WCHAR *p = _tcsrchr( pFileFullPath, _T( '\\' ) );
    if( p == nullptr )
    {
        return FALSE;
    }
    //最后创建文件
    HANDLE handle = CreateFile( pFileFullPath, GENERIC_READ | GENERIC_WRITE, 
                    FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
    if( handle == INVALID_HANDLE_VALUE )
    {
         return FALSE;
    }

    CloseHandle( handle );

    return true;
}
BOOL CDBBase::OpenDatabase( BOOL bType )
{
    if( m_bInit && m_pDB == NULL )	return FALSE;
    if( m_bInit && m_pDB )	return TRUE;

    CHAR szName[FS_MAX_PATH] = { 0 };
#ifdef _UNICODE
    int len = WBASELIB::ConvertUnicodeToUtf8( m_pDbFileName, szName, FS_MAX_PATH );
#endif
    if( len != 0 )
    {
        int nRet = 0;
        if( bType )	
            nRet = sqlite3_open( szName, &m_pDB );
        else
            nRet = sqlite3_open( ":memory:", &m_pDB );
        if( nRet != SQLITE_OK )
        {
            m_nLastError = nRet;
            m_pDB = NULL;
            return FALSE;
        }
    }
    else 
        return FALSE;

    m_bInit = true;
    return TRUE;
}
BOOL CDBBase::EnterEncryptKey( const char* key, int len )
{
    //sqlite3_key( m_pDB, key, len );

    return TRUE;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_32619837/article/details/103969379

智能推荐

android 获取短信验证码倒计时功能_0 and 1的博客-程序员ITS301_android 短信倒计时功能

直接上代码public class MainActivity extends Activity { private Button submit; private TimeCount time; @Override protected void onCreate(Bundle savedInstanceState) { super.onCrea

MSSQL,Oracle 中,对应的RPAD,LPAD的功能函数进行字符补充_sontin的博客-程序员ITS301_rpad 转mssql

这函数用于输出树杈真是超级方便,就是性能上没测试,有试过的给个回复。直接看语句吧:Oracle:select t.id,'|-'||LPAD('--', 2*(LEVEL-1),'-')||t.name from T_SYS_ORG t start with t.parentid is null and t.status = 1 connect by prior t.id = t.p

Spring boot 启动过程分析_大黄奔跑的博客-程序员ITS301_springboot启动分析

文章目录总有人替你做了一些事儿1. SpringBoot启动阶段划分2. Spring boot 的配置过程1. 绕不开的getSpringFactoriesInstances()3. 运行 Spring应用的开始源码简单浏览总结总有人替你做了一些事儿我们常常惊叹于 Spring boot 的极大简化开发者的开发流程,将我们从苦逼的 xml 配置中释放出来,可以更加愉快欢乐的摸鱼了。但是有没有想过几行简单的启动程序,Spring boot 是如何做到的呢?下面这个程序可以说是最最根本的一个 Spri

集成无线收发器&8位RISC(精简指令集)MCU SOC芯片Ci2451_Chery1140的博客-程序员ITS301_8位指令集

Ci2451是一款集成无线收发器和8位RISC(精简指令集)MCU的SOC芯片。主要应用在无线鼠标、无线键盘、无线遥控、体感设备、无线数据传输模块、无线遥控玩具等领域。

org.apache.el.parser.ParseException--异常_伊成的博客-程序员ITS301

2013-11-2 17:34:11 org.apache.catalina.core.ApplicationDispatcher invoke严重: Servlet.service() for servlet jsp threw exceptionorg.apache.el.parser.ParseException: Encountered " "\" type=\" "" at l

Kendryte K210 在freertos上的dvp解析_smile_5me的博客-程序员ITS301_k210 dvp 保存数据结构

在K210的例程中是有关dvp的代码,那么为了今后自己可以更好的理解在这记录一下,其实理解还是非常好理解的,不多说,先上代码。dvp.h#ifndef _DVPH_H#define _DVPH_H#include <stdio.h>#define DVP_WIDTH 640#define DVP_HIGHT 480extern volatile uint8_t dvp_finish_flag;extern volatile uint8_t gram_mux;exte

随便推点

java虚拟机在所有平台上都是一样的_当需要JVM运行时,如何与Java平台无关?_生锈快刀的博客-程序员ITS301

通常情况下,编译的代码是CPU“执行”程序的精确指令集。 在Java中,编译后的代码是一组精确的“虚拟CPU”指令,每个物理机器上都需要相同的指令。所以,从某种意义上讲,Java语言的devise者决定语言和编译代码将独立于平台,但由于代码最终必须在物理平台上运行,他们select将所有依赖于平台的代码JVM。这个对于JVM的要求与你的Turbo C例子相反。 使用Turbo C,编译器将生成与平..._1671465600

python读取文件里中文编码后的字符串(\\xe6\\xb1\\x9f)中文转换的问题_xiaokui9的博客-程序员ITS301_\xb9\x94\x81

最近在解析数据,悲催遇到错误手动退出,于是数据库没存储上。于是只能从日志里提取数据再存到数据库。例如:[2018-05-23 18:09:36] [DEBUG] 5 : ('\xe6\xb1\x9f\xe8\x8b\x8f\xe7\x9c\x81\xe5\xb9\xbf\xe6\x92\xad\xe7\x94\xb5\xe8\xa7\x86\xe6\x80\xbb\xe5\x8f\xb0', '\...

TypeError: string argument without an encoding_胡小牧的博客-程序员ITS301_string argument without an encoding

这个错误是把string 类型转byte类型的时候出现的问题下面就会报错print(bytes(str_a))

Delphi使用SetWindowLong 修改子窗体属性,实现z轴任意覆盖_【重楼】的博客-程序员ITS301_delphi setwindowlong

今天有个朋友问我一个问题,现在Delphi创建的子窗体默认子窗体只能在主窗体上面,不能被主窗体遮挡,问如何才可以使主窗体获得焦点的时候可遮挡子窗体,本来以为很简单的问题,其实还是需要了解一个函数。SetWindowLong是一个Windows API函数。该函数用来改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。原型LONGSetWindowLong(HWNDhWnd,//handletowindow...

2020中国大学生程序设计竞赛(CCPC)网络选拔赛min25筛_长门yuki的博客-程序员ITS301

2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛(部分题解)这次B题ac太多人了,现场时过了快700多人。导致我们队写完签到拼命打表这个题。思路不难,求一次[3,n+1]的连续和,再求[3,n]的素数和。但问题是n太大了,线性筛必定tle,而我们队没有数论选手就很难受(哭)。最后只能打表还是tle。赛后还有各种实验,就先补上部分题解。B题真就人均min_25筛,是我太菜了。思路并不难,从{2}开始,3如果连到2边,权值只能是2*3=6,4的话可以连到{2,3}中的2,权值即为本身,确实和Kru