aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 12295|回复: 9

求个在sqlite中写入、读取图片等二进制文件的示例代码

[复制链接]

51

主题

212

回帖

1548

积分

四级会员

积分
1548
发表于 2016-12-28 15:17:20 | 显示全部楼层 |阅读模式
本帖最后由 o00viw 于 2016-12-28 15:20 编辑

求个在sqlite中写入、读取图片等二进制文件的示例代码,

看了示例,对增删改查已了解,一直处理不了图片。

谢谢。

2

主题

12

回帖

107

积分

一级会员

积分
107
发表于 2016-12-29 12:15:06 | 显示全部楼层
这个跟sqlite的版本没有关系吧?!为什么aardio自带的范例也不看一下呢?!
命名参数前面加个blob就可以:
/*
可在命名参数名中blob前缀显示指定该字符串为二进制数据,下面演示用法
*/

sqlConnection.prepare(
"INSERT INTO film VALUES (@blobTitle,@length,@year, 'Jodie Foster');" ).step(
   
blobTitle = '\0原样存储';
    length = 4;
    year = time.now();  
);




点评

同意: 5.0
同意: 5
  发表于 2016-12-29 21:25

10

主题

66

回帖

654

积分

三级会员

积分
654
发表于 2016-12-28 16:37:28 | 显示全部楼层
本来用BLOB类型就可以,但是SQLITE这个版本BLOB存贮二进制文件好像没有全部读进去,取出时文件大小不对。

51

主题

212

回帖

1548

积分

四级会员

积分
1548
 楼主| 发表于 2016-12-28 21:16:43 | 显示全部楼层
alajia 发表于 2016-12-28 16:37
本来用BLOB类型就可以,但是SQLITE这个版本BLOB存贮二进制文件好像没有全部读进去,取出时文件大小不对。

代码如下:"SQLite database browser"查看是,写入的数据总是4 chars
读出的数据也是4 chars。


  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add(
  5. btnFree={cls="button";text="释放空间";left=552;top=296;right=640;bottom=336;z=2};
  6. btnRead={cls="button";text="读取";left=536;top=192;right=624;bottom=232;z=3};
  7. button={cls="button";text="写入";left=528;top=96;right=616;bottom=136;z=1};
  8. plus={cls="plus";left=24;top=24;right=520;bottom=392;border=1;z=4}
  9. )
  10. /*}}*/

  11. import sqlite
  12. import console

  13. var db = sqlite("E:\360yun\aardio\工程\a6\!数据库相关\二进制读写.db")
  14. if( ! db.existsTable("sample") ){
  15.         db.exec("CREATE TABLE sample(
  16.                 num INTEGER PRIMARY KEY AUTOINCREMENT,
  17.                 ID TEXT,
  18.                 pic BLOB
  19.                 );"
  20.         )
  21. }
  22. var complete = function( ... ){
  23.         console.log(...)
  24.         console.log("完成")       
  25. }

  26. winform.button.oncommand = function(id,event){
  27.         var p = "E:\360yun\aardio\工程\a6\!数据库相关\2.jpg"
  28.         var pic = string.load( p )       
  29.        
  30.         db.prepare("INSERT INTO sample VALUES ( @num,'test',@blobPic );" ).step(
  31.                 blobPic = pic;
  32.                 num = null
  33.         );
  34.        
  35.         complete()
  36. }
  37. winform.btnRead.oncommand = function(id,event){
  38.        
  39.         db.enum(
  40.                 "SELECT * FROM [sample]",
  41.                 function(tname,tvalue){
  42.                         for(i=1;#tname;1){
  43.                                 //console.log(tname[i],string.fromto( tvalue[i] ) )
  44.                                 console.log(tname[i],string.fromto( tvalue[i] ))
  45.                         }
  46.                 }
  47.         )
  48.         complete()
  49. }
  50. winform.btnFree.oncommand = function(id,event){
  51.         db.exec("VACUUM")
  52.         complete()
  53. }

  54. winform.show();

  55. winform.btnRead.oncommand()

  56. win.loopMessage();
复制代码

点评

同意: 5.0
同意: 5
agreement.  发表于 2016-12-28 23:32
同意: 5
  发表于 2016-12-28 23:31

51

主题

212

回帖

1548

积分

四级会员

积分
1548
 楼主| 发表于 2016-12-28 21:58:45 | 显示全部楼层
自己学习后,发现成功了。成功的代码如下:

如果对后人有用,希望留个脚印。

  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add(
  5. btnRead={cls="button";text="读取";left=608;top=160;right=712;bottom=200;z=2};
  6. btnWrite={cls="button";text="写入";left=608;top=88;right=712;bottom=128;z=3};
  7. picturebox={cls="picturebox";left=24;top=24;right=560;bottom=384;border=1;z=1}
  8. )
  9. /*}}*/

  10. import sqlite
  11. import console

  12. var db = sqlite("E:\360yun\aardio\工程\a6\!数据库相关\二进制读写3.db")
  13. if( ! db.existsTable("sample") ){
  14.         db.exec("CREATE TABLE sample(
  15.                 num INTEGER PRIMARY KEY AUTOINCREMENT,
  16.                 ID TEXT,
  17.                 pic BLOB
  18.                 );"
  19.         )
  20. }

  21. winform.btnWrite.oncommand = function(id,event){
  22.         var p = "E:\360yun\aardio\工程\a6\!数据库相关\3.jpg"
  23.         var pic = string.load( p )
  24.         var cmd = db.prepare("INSERT INTO [sample] VALUES (?1,?2,?3);")
  25.         cmd.bind.string( "第三个图片",2 )
  26.         cmd.bind.blob( pic,3 )
  27.         console.log( cmd.step() )       
  28. }
  29. winform.btnRead.oncommand = function(id,event){
  30.         var n = 1
  31.        
  32.         var tt = db.getTable("SELECT * FROM [sample] ")       
  33.         winform.picturebox.image = tt[n].pic;
  34. }

  35. winform.show();

  36. //winform.btnRead.oncommand()

  37. win.loopMessage();
复制代码

点评

同意: 5.0
同意: 5
  发表于 2017-1-17 13:35

10

主题

66

回帖

654

积分

三级会员

积分
654
发表于 2016-12-29 09:51:49 | 显示全部楼层
o00viw 发表于 2016-12-28 21:58
自己学习后,发现成功了。成功的代码如下:

如果对后人有用,希望留个脚印。

谢谢!看来是执行SQL语句时,二进制要显式声明为blob或者cdata。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-2-13 18:48 , Processed in 0.069638 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表