好久没写博客了,下面把今天的总结下:
自己测试过,在VC6.0 VS05和VS08都可以
首先搭建环境:
一、需要的文件
sqlite3.dll
SQLITE3.lib
sqlite3.h
C++封装库,如果纯C去做就不需要这个了
CppSQLite3U.cpp
CppSQLite3U.h
然后在VS2005 下项目->属性->连接器->输入->附加依赖项里添加 SQLITE3.lib
然后在程序中添加#include "CppSQLite3U.h"
VC6.0的话
VC6.0(默认多字节)的话如果假如C++库的话,编译会提示一个错误,貌似是转换为整型的,改下就可以了,
OK
一般的创建、查询:
(创建可以纯用C去写,我这里为了方便调用的C++的库 CppSQLite3U.cpp CppSQLite3U.h)
-
CppSQLite3DB db;
-
CppSQLite3Query q;
-
-
m_list.ResetContent();
-
db.open("d:\\test.db");
-
q = db.execQuery("select * from student"); //查询
-
CString strTemp;
-
while (!q.eof())
-
{
-
strTemp.Format(("%s-%s-%s"),q.fieldValue(0),q.fieldValue(1),q.fieldValue(2));
-
m_list.AddString(strTemp);
-
-
q.nextRow();
-
}
-
q.finalize();
-
db.close();
插入blob类型的数据时:
(稍微修改一点,应该可以跨平台使用)
-
sqlite3 *db;
-
char *zErrMsg = 0;
-
int ret;
-
// char **Result;
-
char *sql;
-
sqlite3_stmt *stat = 0;
-
ret = sqlite3_open("db2.db", &db); //打开数据库,跟打开文本文件一样
-
sqlite3_exec(db, "CREATE TABLE list (age int UNIQUE, fliename varchar(128), fzip blob);", 0, 0, &zErrMsg); //
-
-
for (int i = 1; i <= 2; i++)
-
{
-
CString str;
-
str.Format("insert into list values (%d,'mmmm.rar',?);", i);
-
//由于mmmm.rar是一个二进制文件,所以要在使用insert语句时先用?号代替
-
sqlite3_prepare(db, str, -1, &stat, 0);
-
FILE *fp = NULL;
-
long filesize = 0;
-
char * ffile;
-
fp = fopen("mmmm.rar", "rb");
-
if(fp != NULL)
-
{
-
//计算文件的大小
-
fseek(fp, 0, SEEK_END);
-
filesize = ftell(fp);
-
fseek(fp, 0, SEEK_SET);
-
//读取文件
-
ffile = new char[filesize + 1];
-
size_t sz = fread(ffile, sizeof(char), filesize + 1, fp);
-
fclose(fp);
-
}
-
//将文件数据绑定到insert语句中,替换“?”部分
-
sqlite3_bind_blob(stat, 1, ffile, filesize, NULL);
-
//执行绑定之后的SQL语句
-
sqlite3_step(stat);
-
/////////////////////////////////////////////////////////////////////////
-
//这时数据库当中已经有了一条包含BLOB字段的数据。接下来我们要读取这条数据:
-
//选取该条数据
-
sqlite3_prepare(db, "select * from list;", -1, &stat, 0);
-
sqlite3_step(stat);
-
//得到记录中的BLOB字段
-
-
// 得到第几列的2进制数据
-
const void * test = sqlite3_column_blob(stat, 2);
-
//得到字段中数据的长度
-
int size = sqlite3_column_bytes(stat, 2);
-
char *buffer;
-
buffer = new char[size + 1];
-
-
//用内存拷贝 拷贝该字段
-
memcpy(buffer, test, size);
-
//拷贝该字段
-
// sprintf(buffer, "%s", test);
-
// buffer[size] = '\0';
-
-
//此时可以将buffer2写入到文件当中,至此BLOB数据处理完毕。
-
-
fp = fopen("111.rar", "wb"); //此处以后应当先接受文件名。之后打开文件,接受客户端的数据写文件。
-
if (fp == NULL)
-
{
-
return;
-
}
-
fseek(fp, 0, SEEK_END);
-
fwrite(buffer, 1, size + 1, fp);
-
fflush(fp);
-
fclose(fp);
-
fp = NULL;
-
-
if (buffer != NULL)
-
{
-
delete []buffer;
-
buffer = NULL;
-
}
-
}
-
-
sqlite3_close(db);
以上自己测试成功。。。
附图:
参考文章:
http://www.cnblogs.com/wengzilin/archive/2012/03/28/2420796.html
http://www.cnblogs.com/hnrainll/archive/2011/09/08/2170506.html
阅读(8300) | 评论(0) | 转发(0) |