C++ 使用SQLite
1.SQLite是一个完全独立的、不需要服务器、不要任何配置、支持SQL的、开源的文件数据库引擎。源代码和支持可以登录:http://www.sqlite.org/
1.1.下载sqlite3.dll和sqlite3.def文件,在下载页下载sqlite-dll-win32-x86-3080803文件
1.2.下载sqlite3.h,在下载页下载sqlite-amalgamation-201503091040文件。
2.代码编译,由于SQLite下载文件中只提供了def文件而没有提供lib文件。所以在正式使用sqlite之前需要先编译lib文件。下面给出编译lib文件的方法和步骤。
2.1 打开VS自带的命令行工具。
2.2在上面的命令行中输入(注意空格):(小技巧,输入lib.exe /def:后可以将刚刚解压sqlite3.def直接拖到命令行界面中,然后加上/machine:ix86)
D:\Program Files\Microsoft Visual Studio 10.0\VC>lib.exe /def:F:\TDdownload\sqlite-dll-win32-x86-3080803\sqlite3.def /machine:ix86
回车编译完成。
2.3 编译完成后生成sqlite3.lib、sqlite3.exp文件,该文件路径在:C:\Program Files\Microsoft Visual Studio 9.0\VC
参考 http://blog.sina.com.cn/s/blog_a459dcf501013pwv.html
把sqlite3.h拷贝到代码目录下,sqlite3.lib,sqlite3.dll文件拷贝到生成exe目录下。
#include <windows.h>
#include "..\SQLite\sqlite3.h"
#pragma comment(lib,"sqlite3.lib")
sqlite3 * pDB = NULL;
int SQLiteDB::OpenDB()
{
CMyFile myfile;
CMyString mystring;
string s_db_path = myfile.GetRunDir() + "\\TS15.db"; char *c_db_path = new char[s_db_path.length() + ];
strcpy(c_db_path, s_db_path.c_str()); int ret = sqlite3_open(c_db_path, &pDB);
if (ret != SQLITE_OK)
{
sqlite3_close(pDB);
return ;
} //delete[]c_db_path;
//return ret;
return ret;
} int SQLiteDB::ExecuteSql(string sql)
{
char *c_sql = new char[sql.length() + ];
strcpy_s(c_sql, strlen(c_sql), sql.c_str());
char* c_err_msg; int ret = sqlite3_exec(pDB, c_sql, , , &c_err_msg); if (ret != SQLITE_OK)
{
//cout << "select fail: " << cErrMsg << endl;
sqlite3_close(pDB);
return ;
} return ; } int SQLiteDB::CloseSQLiteDB()
{ sqlite3_close(pDB);
return ;
}
// ConvertPrintVarDlg.cpp : implementation file
// #include "stdafx.h"
#include "ConvertPrintVar.h"
#include "ConvertPrintVarDlg.h"
#include "afxdialogex.h" #ifdef _DEBUG
#define new DEBUG_NEW
#endif // CAboutDlg dialog used for App About class CAboutDlg : public CDialogEx
{
public:
CAboutDlg(); // Dialog Data
enum { IDD = IDD_ABOUTBOX }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation
protected:
DECLARE_MESSAGE_MAP()
}; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
} void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
} BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP() // CConvertPrintVarDlg dialog CConvertPrintVarDlg::CConvertPrintVarDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CConvertPrintVarDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
} void CConvertPrintVarDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
} BEGIN_MESSAGE_MAP(CConvertPrintVarDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_OK, &CConvertPrintVarDlg::OnBnClickedButtonOk)
END_MESSAGE_MAP() // CConvertPrintVarDlg message handlers BOOL CConvertPrintVarDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
GetDlgItem(IDC_STATIC_MSG)->SetWindowText(_T(""));
// Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
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);
}
} // Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control
} void CConvertPrintVarDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
} // If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework. void CConvertPrintVarDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), ); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + ) / ;
int y = (rect.Height() - cyIcon + ) / ; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
} // The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CConvertPrintVarDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
} sqlite3 * pDB = NULL; string save_file_path; bool WritePrintData();
void ReadPrintData(string file_path);
bool AddPrintData(string var_name, string var1);
bool UpdatePrintData(string var_name, string var2, string var3, string var4);
bool DeletePrintData();
int Sqlite3ExecCallback(void *data, int nColumn,char **colValues, char **colNames); void CConvertPrintVarDlg::OnBnClickedButtonOk()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_STATIC_MSG)->SetWindowText(_T(""));
CString file_path;
GetDlgItemTextW(IDC_MFCEDITBROWSE_File, file_path);
if (file_path == "")
{
GetDlgItem(IDC_STATIC_MSG)->SetWindowText(_T("please select file path"));
return;
}
CMyFile myfile;
CMyString mystring; string run_dir=myfile.GetRunDir();
string db_path = run_dir + "\\db.db";
char* c_db_path = mystring.StringToPchar(db_path);
//IDC_MFCEDITBROWSE_File int find_index = file_path.ReverseFind('\\'); CString file_current_path = file_path.Mid(, find_index); CString cs_save_file_path = file_current_path + "\\printvar.txt"; DeleteFile(cs_save_file_path); int len = WideCharToMultiByte(CP_ACP, , cs_save_file_path, -, NULL, , NULL, NULL);
char *ptxtTemp = new char[len + ];
WideCharToMultiByte(CP_ACP, , cs_save_file_path, -, ptxtTemp, len, NULL, NULL); save_file_path = ptxtTemp; int nRes = sqlite3_open(c_db_path, &pDB); if (nRes != SQLITE_OK)
{
/* cout << "Open database fail: " << sqlite3_errmsg(pDB);
goto QUIT;*/
GetDlgItem(IDC_STATIC_MSG)->SetWindowText(_T("database fail"));
}
else
{
DeletePrintData();
ReadPrintData("E:\\ProgramTest\\ConvertPrintVar\\Debug\\1.cpp"); WritePrintData(); GetDlgItem(IDC_STATIC_MSG)->SetWindowText(_T("ok"));
} } string& trim(string &s)
{
if (s.empty())
{
return s;
} s.erase(, s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + );
return s;
} void ReadPrintData(string file_path)
{ ifstream s;
string text_line = "";
string line_temp = ""; string var_name;
string var1;
string var2;
string var3;
string var4;
int find_index10 = ;
int find_index11 = ;
int find_index12 = ;
int find_index13 = ;
int find_index14 = ; int find_index00 = ;
int find_index20 = ;
int find_index21= ;
int find_index22 = ;
int find_index23 = ;
int find_index24 = ;
int find_index25 = ;
int find_index26 = ; string str1;
string str11;
string str2;
string str3;
s.open(file_path, ios::in);
if (s)
{
while (!s.eof())
{
getline(s, text_line); if (text_line != "")
{ //const char* PrintData::PRT_DATE = QT_TR_NOOP("Date");
find_index10 = text_line.find("QT_TR_NOOP");
find_index00 = text_line.find("//");
if (find_index10> && find_index00==-)
{
find_index11 = text_line.find("::"); find_index12 = text_line.find("="); find_index13 = text_line.find_first_of('(');
find_index14 = text_line.find_last_of(')'); var_name = text_line.substr(find_index11+, find_index12 - find_index11-);
var1 = text_line.substr(find_index13+, find_index14- find_index13-);
trim(var_name);
trim(var1);
AddPrintData(var_name, var1); }
//{PrintData::PRT_NET, "10.00", 7, PrintData::RIGHT},
find_index20 = text_line.find("{PrintData"); if (find_index20 > && find_index00 == -)
{ find_index21 = text_line.find_first_of(',');
var_name = text_line.substr(find_index20 + , find_index21 - find_index20 - ); str1 = text_line.substr(find_index21+);
trim(str1);
find_index22 = str1.find_first_of(','); str11 = str1.substr(, find_index22-); trim(str11);
var2 = str11.substr(, str11.length()-);
//var2 = str1.substr(1, find_index22-2); str2 = str1.substr(find_index22+); trim(str2);
find_index23 = str2.find_first_of(','); var3 = str2.substr(, find_index23); str3 = str2.substr(find_index23+);
trim(str3); find_index24 = str3.find("}"); var4 = str3.substr(, find_index24 - );
trim(var_name);
trim(var2);
trim(var3);
trim(var4);
UpdatePrintData(var_name, var2, var3, var4); }
text_line = ""; } //end if(text_line != "") }
}
s.close(); } bool WritePrintData()
{
string sql = "select Variable1,Variable2,Variable3,Variable4 from PrintData";
char *c_sql = new char[sql.length() + ];
// strcpy(c_sql, sql.c_str());
strcpy_s(c_sql, strlen(c_sql), sql.c_str());
char* c_err_msg;
int ret = sqlite3_exec(pDB, c_sql,&Sqlite3ExecCallback, , &c_err_msg);
if (ret != SQLITE_OK)
{ //cout << "select fail: " << cErrMsg << endl;
return false;
}
return true; }
int Sqlite3ExecCallback(void *data, int nColumn, char **colValues, char **colNames)
{
//for (int i = 0; i < nColumn; i++)
//{ // //printf("%s\t", colValues[i]);
//}
//printf("\n");
string var1 = colValues[];
string var2 = colValues[];
string var3 = colValues[];
string var4 = colValues[];
string str = var1 + ":" + var3 + ":" + var1 + ":" + var1 + ":" + var2; //添加模式
ofstream s(save_file_path, ios::app);
if (!s)
{
s.close();
}
s << str<< endl;
s.close(); return ;
} bool AddPrintData(string var_name, string var1)
{ string sql = "insert into PrintData(VarName,Variable1,Variable2,Variable3,Variable4)values('";
sql += var_name + "','" + var1 + "'," + "'',"+"''," + "'')"; char *c_sql = new char[sql.length() + ];
// strcpy(c_sql, sql.c_str());
strcpy_s(c_sql, strlen(c_sql), sql.c_str());
char* c_err_msg;
int ret = sqlite3_exec(pDB, c_sql, , , &c_err_msg); //delete[] c_sql;
//c_sql = nullptr; if (ret != SQLITE_OK)
{
//cout << "select fail: " << cErrMsg << endl;
return false;
}
return true;
}
bool UpdatePrintData(string var_name, string var2, string var3, string var4)
{ string sql = "update PrintData set Variable2='";
sql += var2 + "', Variable3='";
sql += var3 + "', Variable4='";
sql += var4 +"' where VarName='";
sql += var_name +"'"; char *c_sql = new char[sql.length() + ];
//strcpy(c_sql, sql.c_str());
strcpy_s(c_sql, strlen(c_sql), sql.c_str()); char* c_err_msg;
int ret = sqlite3_exec(pDB, c_sql, , , &c_err_msg);
//delete[] c_sql;
//c_sql = nullptr;
if (ret != SQLITE_OK)
{
//cout << "select fail: " << cErrMsg << endl;
return false;
}
return true;
}
bool DeletePrintData()
{ string sql = "delete from PrintData ";
char* c_err_msg;
char *c_sql = new char[sql.length() + ];
//strcpy(c_sql, sql.c_str());
strcpy_s(c_sql, strlen(c_sql), sql.c_str()); int ret = sqlite3_exec(pDB, c_sql, , , &c_err_msg); if (ret != SQLITE_OK)
{
//cout << "select fail: " << cErrMsg << endl;
return false;
} return true; }
C++ 使用SQLite的更多相关文章
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
- UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?
选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...
- 深入解析Sqlite的完美替代者,android数据库新王者——Realm
写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...
- VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答
用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...
- Android之SQLite数据存储
一.SQLite保存数据介绍 将数据库保存在数据库对于重复或者结构化数据(比如契约信息)而言是理想之选.SQL数据库的主要原则之一是架构:数据库如何组织正式声明.架构体现于用于创建数据库的SQL语句. ...
- 【教程】SQLite数据库修复
SQLite 大家都知道,就不多说了. 有时候数据量大了,或者存储过程中出现异常,数据库就可能会出问题. 这是以前公司产品出现过的问题,导致软件都打不开了,我花了不少时间才解决的,趁现在有空贡献出来. ...
- SQLite学习笔记(十)&&加密
随着移动互联网的发展,手机使用越来越广泛,sqlite作为手机端存储的一种解决方案,使用也非常普遍.但是sqlite本身安全特性却比较弱,比如不支持用户权限,只要能获取到数据库文件就能进行访问:另外也 ...
- mono for android中使用dapper或petapoco对sqlite进行数据操作
在mono for android中使用dapper或petapoco,很简单,新建android 类库项目,直接把原来的文件复制过来,对Connection连接报错部分进行注释和修改就可以运行了.( ...
- 【腾讯Bugly干货分享】微信iOS SQLite源码优化实践
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57b58022433221be01499480 作者:张三华 前言 随着微信iO ...
- 【腾讯Bugly干货分享】移动客户端中高效使用SQLite
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57b57f2a0703f7d31b9a3932 作者:赵丰 导语 iOS 程序能 ...
随机推荐
- Gradle笔记——Gradle的简介与安装
本博客对Gradle进行一个简单的介绍,以及它的安装. Gradle介绍 Gradle是一个基于JVM的构建工具,它提供了: 像Ant一样,通用灵活的构建工具 可以切换的,基于约定的构建框架 强大的多 ...
- java在继承中父类的成员变量是否会被子类所覆盖
假如 父类 int num =7:子类 int num =9:父类是否会被子类所覆盖? 给你看两个例子: 第一个例子: 第二个例子: 这两个例子的区别只有一句话 由此证明了子类从父类继承的时候 ...
- C语言中的EOF和回车不一样
经常我们碰到这样一个C语言问题,例如: 输入一个组整数,按照从小到大排序后输出结果 输入: 1 7 9 2 4 输出: 1 2 4 7 9 这里要用C语言读入一段数的话,如果用 int array ...
- 10条PHP编程习惯助你找工作
过去的几周对我来说是一段相当复杂的经历.我们公司进行了大裁员,我是其中之一,但却体验到了其中的乐 趣.我从来没有被开除过,所以很难不去想得太多.我开始浏览招聘板块,一个全职PHP程序员的职位很吸引人, ...
- [译]在AngularJS中何时应该使用Directives,Controllers或者Service
原文: http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/ Services Servic ...
- 一张图告诉你,只会JavaScript还不够!
会了JavaScript语法,你就真的会了JavaScript吗,来看这张图!是超实用的JavaScript代码段一书的导览!熊孩子们,赶紧学习去吧!
- PHP基础Mysql扩展库
mysql扩展库操作步骤如下: 1.连接数据库 2.选择数据库 3.设置操作编码 4.发送指令sql,并返回结果集 ddl:数据定义语句 dml:数据操作语句 dql:数据查询 ...
- POJ 2031 Building a Space Station
3维空间中的最小生成树....好久没碰关于图的东西了..... Building a Space Station Time Limit: 1000MS Memory Li ...
- Linux/CentOS配置:使用yum update更新时不升级内核的方法
RedHat/CentOS/Fedora使用 yum update 更新时,默认会升级内核.但有些服务器硬件(特别是组装的机器)在升级内核后,新的内核可能会认不出某些硬件,要重新安装驱动,很麻烦.所以 ...
- Cache and Virtual Memory
Cache存储器:电脑中为高速缓冲存储器,是位于CPU和主存储器DRAM(DynamicRandonAccessMemory)之间,规模较小,但速度很高的存储器,通常由SRAM(StaticRando ...