赞
踩
一、 命令运行平台
学习一样新的先要把环境平台搭建起来,然后自己多实践才能领悟的更快一点。初学时可以参考《sqlite3权威指南》。
首先去官网下载sqlite-tools-win32-x86-3190300.zip和sqlite-dll-win64-x64-3200100.zip(注意我的是64位的,如果是32位的下载x86版)
然后在d盘创建一个文件夹D:\sqlite3,把 sqlite3.def、sqlite3.dll和sqlite3.exe三个文件放进去。打开cmd,先进入D盘,再cd进入sqlite3目录,再运行sqlite3.exe,敲命令时只需敲前几个字母,再按tab键就会自动补齐。如下图创建成功。
然后创建数据库,出错
这是因为之前运行了sqlite3.exe,现在表示数据库状态,怎么能在数据库里创建数据库呢,按ctrl+c退回原目录,再创建数据库就可以了,这时还看不到创建的db文件,一定要先创建一张表之后,才能在目录下看到文件。
输入sqlite3.exe test.db
create table test (id integer primary key, value text);
这里要注意一点,命令是没“;”的,sql语句是有“;”的
下面是基本命令介绍:
.dump:这个就是输出你之前对数据库的各种操作命令
.output stdout:输出到屏幕上
.output file.sql:输出到file.sql文件
.read file.sql:把文件里的命令导入到当前数据库并执行
如果命令符是在安装目录,可以这样D:\sqlite3>sqlite3.exe test.db < file.sql,这样就把file.sql导入到test.db里。
二、 visul stdio 2010平台
这个主要参考http://blog.csdn.net/hyxiaohaiyang/article/details/7382551
在官网下载sqlite-amalgamation-3180000.zip,里面有sqlite3.h文件,首先把从VS2010的安装目录下Microsoft Visual Studio 10.0\VC\bin找到lib.exe和link.exe,从VS2010的安装目录下Microsoft Visual Studio 10.0\Common7\IDE找到mspdb100.dll。将lib.exe link.exe mspdb100.dll放到上文所说的D:\sqlite3文件夹里,在D:\sqlite3目录下运行lib /def:sqlite3.def,将会生成sqlite3.lib文件。
然后在vs里新建win32控制台应用工程,选空项目,然后把sqlite3.h、sqlite3.lib复制到源码目录,然后添加一个cpp文件,并把输入以下测试代码,现在先不管代码的意思
- #include <stdio.h>
- #include "sqlite3.h"
-
- //查询的回调函数声明
- int select_callback(void * data, int col_count, char ** col_values,
- char ** col_Name);
-
- int main(int argc, char * argv[])
- {
- const char * sSQL1 =
- "create table users(userid varchar(20) PRIMARY KEY, age int, birthday datetime);";
- char * pErrMsg = 0;
- int result = 0;
- // 连接数据库
- sqlite3 * db = 0;
- int ret = sqlite3_open("./test.db", &db);
- if (ret != SQLITE_OK)
- {
- fprintf(stderr, "无法打开数据库: %s", sqlite3_errmsg(db));
- return (1);
- }
- printf("数据库连接成功!\n");
-
- // 执行建表SQL
- sqlite3_exec(db, sSQL1, 0, 0, &pErrMsg);
- if (ret != SQLITE_OK)
- {
- fprintf(stderr, "SQL error: %s\n", pErrMsg);
- sqlite3_free(pErrMsg);
- }
-
- // 执行插入记录SQL
- result = sqlite3_exec(db, "insert into users values('张三',20,'2011-7-23');",
- 0, 0, &pErrMsg);
- if (result == SQLITE_OK)
- {
- printf("插入数据成功\n");
- }
- result = sqlite3_exec(db, "insert into users values('李四',20,'2012-9-20');",
- 0, 0, &pErrMsg);
- if (result == SQLITE_OK)
- {
- printf("插入数据成功\n");
- }
-
- // 查询数据表
- printf("查询数据库内容\n");
- sqlite3_exec(db, "select * from users;", select_callback, 0, &pErrMsg);
-
- // 关闭数据库
- sqlite3_close(db);
- db = 0;
- printf("数据库关闭成功!\n");
-
- return 0;
- }
-
- int select_callback(void * data, int col_count, char ** col_values,
- char ** col_Name)
- {
- // 每条记录回调一次该函数,有多少条就回调多少次
- int i;
- for (i = 0; i < col_count; i++)
- {
- printf("%s = %s\n", col_Name[i],
- col_values[i] == 0 ? "NULL" : col_values[i]);
- }
-
- return 0;
- }
然后必须把sqlite.lib添加到工程里,lib有两种,静态的不需要dll,动态的需要链接dll,这里是动态的lib。
编译整个工程,出现LINK:fatal error LNK1123:转换到 COFF期间失败:文件无效或损坏,出现这个问题参考http://blog.csdn.net/kevin_mqj/article/details/22981873,将项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否”就可以了。
编译通过后生成exe文件,在debug文件夹里(注意有2个debug文件夹,exe文件在外层那个),然后把sqlite.dll放到这个目录下面。运行后又出现“应用程序无法正常启动0xc000007b的错误”,网上搜了一下,主要问题大概是于32位的程序调用了64位的dll或者反过来,由于我的dll是64位的,那么说明应用程序是32位,可能需要对vs的环境进行设置。另外一种方法我直接重新下了一个32位的dll替换掉64位就可以了。
三、 eclipse cdt和 gcc平台
使用eclipse之前首先要安装jdk,这里jdk要和eclipse的版本对应,然后再安装cdt插件,不同版本的cdt对应着不同的eclipse版本,可以在官网查看对应版本
http://www.eclipse.org/cdt/downloads.php
也可以直接下载带cdt的eclipse,这样就不用安装插件了
http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/oxygen1a
我使用的版本是eclipse 4.3、 cdt8.3、 jdk1.6,先安装jdk,再安装插件,然后要安装gcc编译器,一般网上讲的都是mingw,但是这个似乎要在线安装比较麻烦,所以我选择TDM-GCC,软件很小,一键安装就可以,使用都和mingw差不多。
然后把jdk的环境变量设一下就可以了,这个网上讲的很多了,就不说了,TDM-GCC安装后,它的环境变量会自动添加的。这里要注意的是如果想自己使用make命令的话,要把安装目录TDM-GCC-32\bin下的mingw32-make.exe的改为make.exe。如果用eclipse的话就不要管了。
接下来新建项目,如图所示
然后添加main.c文件,代码和上面的一样,再把sqlite.dll和sqlite.h放到工程下,这里eclipse不用添加文件,因为他的工程目录和文件目录是保持同步的,拷到工程目录下就可以了。这里sqlite.dll要重新命名为libsqlite.dll(不改好像也可以),然后右键工程—属性—c++构建—库里面添加dll路径,路径添加时点+号里的工作空间,找到位置双击就可以了
编译后在debug文件夹下生成sqlite_test2.exe,这时要把sqlite.dll文件拷到这个文件夹下才能运行,点绿色三角形的运行按钮后,运行成功。
如果要debug,工程目录不能为中文,点击虫子按钮右边三角形下拉的调试配置选项
把原来的gdb改为
这样就可以单步调试了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。