随心动
sqlite读取,存储二进制数据(转载)
SQLite存取二进制数据
(http://hi.baidu.com/ejoywx/blog/item/4d7b418c8677cc00b31bbae9.html)
http://blog.sina.com.cn/s/blog_60f8483a0100ydaw.html
1
#include
<
stdio.h
>
2
#include
<
memory.h
>
3
#include
<
sqlite3.h
>
4
5
int
main(
int
argc,
char
*
argv[])
6
{
7
sqlite3
*
pDB
=
NULL;
8
char
*
pErrMsg;
9
10
if
(SQLITE_OK
==
sqlite3_open(
"
./mydb.db
"
,
&
pDB))
11
{
12
sqlite3_exec(pDB,
"
create table bList(fileName varchar(16) primary key, binData blob);
"
,NULL,NULL,
&
pErrMsg);
13
{
14
char
buffer[
65535
];
15
int
iLen
=
0
;
16
sqlite3_stmt
*
stmt;
17
18
{
//
存储二进制数据
19
unsigned
char
hex[
16
]
=
{
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
}
;
20
sqlite3_prepare(pDB,
"
insert into bList values ('hex',?);
"
,
-
1
,
&
stmt,NULL);
21
sqlite3_bind_blob(stmt,
1
,hex,
16
,NULL);
22
sqlite3_step(stmt);
23
}
24
25
stmt
=
NULL;
26
{
//
存储exe文件
27
memset(buffer,
0
,
65535
);
28
{
29
FILE
*
fp
=
fopen(argv[
0
],
"
rb
"
);
30
iLen
=
fread(buffer,
1
,
65535
,fp);
31
fclose(fp);
32
}
33
sqlite3_prepare(pDB,
"
insert into bList values ('me.exe',?);
"
,
-
1
,
&
stmt,NULL);
34
sqlite3_bind_blob(stmt,
1
,buffer,iLen,NULL);
35
sqlite3_step(stmt);
36
}
37
38
stmt
=
NULL;
39
{
//
存储普通c文档
40
memset(buffer,
0
,
65535
);
41
{
42
FILE
*
fp
=
fopen(
"
../main.c
"
,
"
rb
"
);
43
iLen
=
fread(buffer,
1
,
65535
,fp);
44
fclose(fp);
45
}
46
sqlite3_prepare(pDB,
"
insert into bList values ('main.txt',?);
"
,
-
1
,
&
stmt,NULL);
47
sqlite3_bind_blob(stmt,
1
,buffer,iLen,NULL);
48
sqlite3_step(stmt);
49
}
50
stmt
=
NULL;
51
{
//
从数据库中读取txt文件数据
52
char
*
data
=
NULL;
53
memset(buffer,
0
,
65535
);
54
sqlite3_prepare(pDB,
"
select binData from bList where fileName='main.txt';
"
,
-
1
,
&
stmt,
0
);
55
sqlite3_step(stmt);
56
data
=
(
char
*
)sqlite3_column_blob(stmt,
0
);
//
得到纪录中的BLOB字段
57
iLen
=
sqlite3_column_bytes(stmt,
0
);
//
得到字段中数据的长度
58
memmove(buffer,data,iLen);
59
printf(
"
%s\n
"
,buffer);
60
}
61
}
62
sqlite3_close(pDB);
63
}
64
65
{
66
http://blog.csdn.net/chence19871/article/details/7645934
1
#include
<
stdio.h
>
2
#include
<
windows.h
>
3
#include
<
iostream
>
4
using
namespace
std;
5
6
extern
"
C
"
7
{
8
#include
"
./sqlite3.h
"
9
}
;
10
11
void
sqlite3_exec_report(sqlite3
*
db,
const
char
*
sql, sqlite3_callback func_callback,
void
*
para);
12
void
select_v2(sqlite3
*
db,
const
char
*
sql);
13
void
outputItem(sqlite3_stmt
*
stat,
int
nColumn,
char
*
out_pic_path);
14
string
GetType(
int
t);
15
//
回调函数
16
int
select_items(
void
*
para,
int
n_column,
char
**
column_val,
char
**
column_name);
//
查询
17
18
int
main(
int
args,
char
*
argv[])
19
{
20
int
result, ret;
21
sqlite3
*
db
=
NULL;
22
char
*
errmsg
=
NULL;
23
24
char
module_path[
100
];
25
26
//
获取当前exe路径
27
DWORD dwPathLen
=
GetModuleFileNameA(NULL, module_path,
100
);
28
char
*
p
=
module_path
+
dwPathLen;
29
while
(
1
)
30
{
31
char
c
=
*
p;
32
if
(c
==
'
\\
'
)
33
{
34
*
(p
+
1
)
=
'
\0
'
;
35
break
;
36
}
37
p
--
;
38
}
39
//
合成数据库文件路径
40
strcat_s(module_path,
100
,
"
db\\mydb.db
"
);
41
string
db_path(module_path);
42
//
打开(创建)数据库
43
result
=
sqlite3_open(db_path.c_str(),
&
db);
44
45
//
----------------------------第一张表------------------------------
46
//
--不包含blob数据,通过普通的方法插入
47
//
-- --------------------------------------------------------------
48
if
(result
==
SQLITE_OK)
49
{
50
//
创建第一张表
51
sqlite3_exec_report(db,
"
create table MyTable_1(ID integer autoincrement primary key, name nvarchar(30))
"
, NULL, NULL);
52
//
先清除数据
53
sqlite3_exec_report(db,
"
delete from MyTable_1
"
, NULL, NULL);
54
//
插入数据
55
const
char
*
sqls[]
=
{
56
"
insert into MyTable_1(ID,name) values(0, '钱学森')
"
,
57
"
insert into MyTable_1(ID,name) values(1, '邓稼先')
"
,
58
"
insert into MyTable_1(ID,name) values(2, '钱三强')
"
,
59
"
insert into MyTable_1(ID,name) values(3, '李四光')
"
,
60
"
insert into MyTable_1(ID,name) values(4, '贺才良')
"
61
}
;
62
for
(
int
i
=
0
; i
<
sizeof
(sqls)
/
sizeof
(
char
*
); i
++
)
63
{
64
sqlite3_exec_report(db, sqls[i], NULL, NULL);
65
}
66
67
//
查询插入的数据 用的是回调的方法
68
sqlite3_exec_report(db,
"
select * from MyTable_1
"
, select_items, NULL);
69
sqlite3_close(db);
70
}
71
else
72
{
73
//
打开数据库失败
74
cout
<<
sqlite3_errmsg(db)
<<
endl;
75
ret
=
-
1
;
76
}
77
78
//
-----------------------------第二张表------------------------------
79
//
--包含blob数据,通过sqlite3_prepare,sqlite3_bind_blob,sqlite3_step
80
//
-- 的方法实现数据的插入
81
//
-- --------------------------------------------------------------
82
result
=
sqlite3_open(module_path,
&
db);
83
if
(result
==
SQLITE_OK)
84
{
85
sqlite3_exec_report(db,
"
create table stu_msg(ID integer primary key autoincrement, name nvarchar(32), picture blob)
"
, NULL, NULL);
86
sqlite3_exec_report(db,
"
delete from stu_msg
"
, NULL, NULL);
87
88
sqlite3_stmt
*
stat;
89
const
char
*
pzTail
=
NULL;
90
91
const
char
*
sqls[]
=
{
92
"
insert into stu_msg(ID, name, picture) values(0, '华罗庚', ?);
"
,
93
"
insert into stu_msg(ID, name, picture) values(1, '钱学森', ?);
"
94
}
;
95
const
char
*
names[]
=
{
96
"
pic\\hualuogen.jpg
"
,
97
"
pic\\qianxuesen.jpg
"
98
}
;
99
100
for
(
int
j
=
0
; j
<
sizeof
(sqls)
/
sizeof
(
char
*
); j
++
)
101
{
102
//
准备
103
result
=
sqlite3_prepare(db, sqls[j],
-
1
,
&
stat,
&
pzTail);
104
105
if
(
!
result
&&
stat)
106
{
107
//
读取头像数据
108
*
(p
+
1
)
=
'
\0
'
;
//
重复利用ModuleFileName
109
strcat_s(module_path,
100
, names[j]);
110
FILE
*
file
=
NULL;
111
fopen_s(
&
file, module_path,
"
rb+
"
);
112
char
*
data
=
NULL;
113
long
l_file_size
=
0
;
114
if
(file)
115
{
116
fseek(file,
0
, SEEK_END);
117
l_file_size
=
ftell(file);
118
fseek(file,
0
, SEEK_SET);
119
data
=
new
char
[l_file_size];
120
fread(data,
1
, l_file_size, file);
121
122
//
和sql的第一个?绑定(如果有多个问号,那就要分开绑定)
123
result
=
sqlite3_bind_blob(stat,
1
, data, l_file_size, NULL);
124
125
//
将数据输入数据库
126
result
=
sqlite3_step(stat);
127
cout
<<
"
Insert result:
"
<<
sqlite3_errmsg(db)
<<
endl;
128
fclose(file);
129
delete [] data;
130
}
131
ret
=
0
;
132
}
133
else
134
{
135
//
准备失败
136
cout
<<
"
sqlite3_prepare failed!
"
<<
sqlite3_errmsg(db)
<<
endl;
137
ret
=
-
1
;
138
}
139
//
释放stat
140
sqlite3_finalize(stat);
141
}
142
143
//
查看插入数据
144
select_v2(db,
"
select ID, name, picture from stu_msg
"
);
145
146
//
关闭数据库
147
sqlite3_close(db);
148
}
149
else
150
{
151
cout
<<
"
打开数据库
"
<<
module_path
<<
sqlite3_errmsg(db);
152
ret
=
-
1
;
153
}
154
155
//
---------------------读出各记录的头像-----------------
156
result
=
sqlite3_open(db_path.c_str(),
&
db);
157
if
(
!
result)
158
{
159
sqlite3_stmt
*
stat;
160
const
char
*
pzTail
=
NULL;
161
sqlite3_prepare(db,
"
select * from stu_msg;
"
,
-
1
,
&
stat,
&
pzTail);
162
int
nColumn
=
sqlite3_column_count(stat);
163
cout
<<
"
总的列数:
"
<<
nColumn
<<
endl;
164
165
result
=
sqlite3_step(stat);
//
读取某一条记录
166
while
(result
==
SQLITE_ROW)
/**/
/*
sqlite3_step() has another row ready
*/
167
{
168
*
(p
+
1
)
=
'
\0
'
;
169
outputItem(stat, nColumn, module_path);
170
cout
<<
endl;
171
result
=
sqlite3_step(stat);
172
}
173
cout
<<
"
end
"
<<
endl;
174
}
175
176
return
ret;
177
}
178
179
//
输出一条记录
180
void
outputItem(sqlite3_stmt
*
stat,
int
nColumn,
char
*
out_pic_path)
181
{
182
int
m
=
-
1
;
183
for
(
int
k
=
0
; k
<
nColumn; k
++
)
184
{
185
string
s;
186
int
colType
=
sqlite3_column_type(stat, k);
187
if
(colType
==
3
)
//
text
188
{
189
m
=
k;
//
得到名字
190
}
191
s
=
GetType(colType);
192
cout
<<
"
column
"
<<
k
<<
"
:
"
<<
s.c_str()
<<
endl;
193
194
switch
(colType)
{
195
case
1
: cout
<<
"
Value:
"
<<
sqlite3_column_int(stat, k)
<<
endl;
break
;
196
case
2
: cout
<<
"
Value:
"
<<
sqlite3_column_int(stat, k)
<<
endl;
break
;
197
case
3
: cout
<<
"
Value:
"
<<
sqlite3_column_text(stat, k)
<<
endl;
break
;
198
case
5
: cout
<<
"
Value:
"
<<
"
内容为空
"
<<
endl;
break
;
199
case
4
: cout
<<
"
Value:
"
<<
"
二进制数据
"
<<
endl;
200
const
void
*
bi
=
sqlite3_column_blob(stat, k);
201
int
size
=
sqlite3_column_bytes(stat,k);
202
char
*
name
=
NULL;
203
if
(m
==
-
1
)
204
{
205
name
=
"
xxx
"
;
206
}
207
else
208
{
209
name
=
(
char
*
)sqlite3_column_text(stat, m);
210
}
211
strcat_s(out_pic_path,
100
,
"
out_pic\\
"
);
212
strcat_s(out_pic_path,
100
, (
char
*
)name);
213
strcat_s(out_pic_path,
100
,
"
.jpg
"
);
214
FILE
*
f
=
NULL;
215
216
fopen_s(
&
f, out_pic_path,
"
wb+
"
);
217
if
(f)
218
{
219
fwrite(bi,
1
, size, f);
220
fclose(f);
221
}
222
break
;
223
}
224
}
225
226
}
227
228
//
获取类型
229
string
GetType(
int
t)
230
{
231
string
s;
232
switch
(t)
233
{
234
case
1
: s
=
"
SQLITE_INTEGER
"
;
break
;
235
case
2
: s
=
"
SQLITE_FLOATE
"
;
break
;
236
case
3
: s
=
"
SQLITE_TEXT
"
;
break
;
237
case
4
: s
=
"
SQLITE_BLOB
"
;
break
;
238
case
5
: s
=
"
SQLITE_NULL
"
;
break
;
239
}
240
return
s;
241
}
242
243
//
执行sql语句并报告执行结果
244
void
sqlite3_exec_report(sqlite3
*
db,
const
char
*
sql, sqlite3_callback func_callback,
void
*
para)
245
{
246
char
*
errmsg;
247
int
result
=
sqlite3_exec(db, sql, func_callback, para,
&
errmsg);
248
cout
<<
endl
<<
endl;
249
if
(result
!=
SQLITE_OK)
250
{
251
cout
<<
"
error code:
"
<<
result
<<
endl
252
<<
"
error:
"
<<
errmsg
<<
endl;
253
}
254
else
255
cout
<<
"
SQL execute succeed:
"
<<
sql
<<
endl;
256
}
257
258
//
一条记录调用一次回调函数
259
int
select_items(
void
*
para,
int
n_column,
char
**
column_val,
char
**
column_name)
260
{
261
int
i;
262
cout
<<
"
contain
"
<<
n_column
<<
"
columns
"
<<
endl;
263
for
(i
=
0
; i
<
n_column; i
++
)
264
{
265
cout
<<
"
column
"
<<
i
<<
"
:
"
<<
column_name[i]
<<
endl
266
<<
"
values:
"
<<
column_val[i]
<<
endl;
267
}
268
return
0
;
269
}
270
271
//
另一种查询方式
272
void
select_v2(sqlite3
*
db,
const
char
*
sql)
273
{
274
#if
1
275
276
char
*
errmsg
=
NULL;
277
char
**
dbResult
=
NULL;
278
int
nRow, nColumn;
279
int
result
=
sqlite3_get_table( db, sql,
&
dbResult,
&
nRow,
&
nColumn,
&
errmsg );
280
281
//
查询成功
282
int
index
=
nColumn;
//
dbResult 前面第一行数据是字段名称,从 nColumn 索引开始才是真正的数据
283
284
for
(
int
i
=
0
; i
<
nRow ; i
++
)
285
{
286
cout
<<
"
第
"
<<
i
+
1
<<
"
条记录
"
<<
endl;
287
for
(
int
j
=
0
; j
<
nColumn; j
++
)
288
{
289
cout
<<
"
字段名:
"
<<
dbResult[j]
<<
"
"
290
<<
"
字段值:
"
<<
dbResult[index]
<<
endl;
291
++
index;
//
dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示
292
}
293
cout
<<
"
------------
"
<<
endl;
294
}
295
296
sqlite3_free_table(dbResult);
//
释放查询空间
297
#endif
298
}
puts(
"
Press any key to exit
"
);
67
getchar();
68
}
69
return
0
;
70
}
1
posted on 2013-03-24 16:06
陈志远
阅读(9589)
评论(1)
编辑
收藏
引用
评论
#
re: sqlite读取,存储二进制数据(转载)
2016-05-24 10:52
尘曦
提交
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2024年8月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
统计
随笔 - 9
文章 - 0
评论 - 3
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2014年3月 (1)
2013年12月 (3)
2013年4月 (1)
2013年3月 (1)
2012年7月 (3)
文章分类
2d绘画学习
(rss)
Othor's blog
搜索
最新评论
1. re: sqlite读取,存储二进制数据(转载)
提交
--尘曦
2. re: 自处理list
@ccsdu2009
我用它画 动画啊 或者执行一些可变的过程,看那个autoItem怎么实现了
--陈志远
3. re: 自处理list
干啥的?
--ccsdu2009
阅读排行榜
1. sqlite读取,存储二进制数据(转载)(9589)
2. SQLITE3 使用总结[转载](6082)
3. 自处理list(1427)
4. CODE::BLOCK-输出中文-备忘(482)
5. (转)ASSERT与VERIFY宏的区别 (443)
评论排行榜
1. 自处理list(2)
2. sqlite读取,存储二进制数据(转载)(1)
3. (转)(转)如何调试MFC的内存泄露(0)
4. (转)ASSERT与VERIFY宏的区别 (0)
5. MFC文件(转)(0)