PASSWORD 's Blog

用耳朵去聆听,用心来感受

用户操作
[即时聊天] [发私信] [加为好友]
彭为ID:libra01
58669次访问,排名1811(1)好友0人,关注者0
libra01的文章
原创 63 篇
翻译 0 篇
转载 4 篇
评论 65 篇
彭为的公告

网名:PASSWORLD
QQ:3569555
MSN:pwzyp#msn.com
现工作在上海
最近评论
mldstk:wow power leveling
zhangjiajun1982:建议你看看这篇文章对你会有帮助的 http://www.150it.cn/bianchengwendang/VC/865064948.html
lovevirus:持之以恒,这是最重要的,谢谢主人的金玉良言,呵呵,郁闷时期给我一点鼓舞
dugang:兄弟,钱多的好找,不累的难找
骆归:楼主还行,但我想没有这么难,不想多说,帮你顶.
文章分类
收藏
    相册
    爱的足迹
    博客图片
    丑男形象
    Delphi
    ★卢培培★
    Angus Johnson's Delphi Components
    CrazyCock专栏
    flier_lu(有价值的文章)
    Think in Patterns 中文
    午夜听风的代码人生
    抉择不悔's blog
    梁甫吟
    超强的Delphi Tips
    风中之歌
    友情链接
    ===天地弦===
    DigJim 的博客(RSS)
    E步·软件资讯
    hkbarton-delphi
    为艺术为技术(RSS)
    孙辉的BLOG
    张硕(CathyEagle)的BLOG
    成片的大树
    我的另外一个生活博客
    编程手札(RSS)
    (RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 在sqlserver中存储多媒体数据收藏

    新一篇: 看到最简单的用非Form的控件拖动Form  | 旧一篇: PI小数点后一百万位

    二、怎样处理多媒体数据

      1.多媒体数据的存储

      多媒体信息包括图像、声音和视频等,它们都是以二进制数据集合的形式存在的,在本系统中处理的对象是图像。SQL Server提供了Image数据类型来存储可变长度二进制数据(大小范围为0~2GB)。但Image字段并不能将多媒体数据直接装入,必须经过一些中间步骤才能将数据存进去。下面以图像数据的存储为例,给大家介绍怎样在Delphi中实现这些中间步骤。

      Delphi中的TStream数据类型以流的形式对字符或非字符数据进行存储,就像在内存中开辟了一个大小可变的临时缓存区。它不仅能方便地对外部文件进行读写,而且还可以将流中的全部数据直接转入数据库,所以用它作桥梁来完成数据存入工作是非常合适的。

      下面的SavetoImage函数的功能是将TStream数据存入数据表的Image字段中。

    function SavetoImage(const Stream:TStream;const AField:TField):boolean;
    var
    FieldStr:string;
    PFieldStr:PChar;
    begin
    Result:=false;
    if (Assigned(AField)) and (Assigned(Stream)) then
    begin
    try
    Stream.Seek(0,0);
    SetLength(FieldStr,Stream.Size);
    PFieldStr:=PChar(FieldStr);
    Stream.Read(PFieldStr^,Stream.Size);
    AField.Value:=FieldStr;
    Result:=true;
    except
    end;
    end;
    end;

      下面是调用SavetoImage函数完成图像数据存储的程序片段。

    Var
    FS:TFileStream;
    begin
    FS:=TFileStream.Create('C:\Car001.jpg',fmOpenRead);
    SavetoImage(FS,Adodataset1.FieldBy
    Name('st_img'));
    FS.Free;
    end;

      其中,Adodataset1是与数据库进行连接的ADO数据集控件,st_img为Image字段。

      2.多媒体数据的转移

      利用SQL Server所带的BCP实用工具,可以很方便地将数据库部分或全部数据复制出来,包括二进制数据。对复制出的多媒体数据可以通过网络或移动存储设备将它们转移到远端的监控电脑上,再利用BCP将它们复制到监控数据库中,以便对多媒体数据进行回放或做其它处理。下面是简化了的将数据从数据库复制到外部文件和从外部文件复制入数据库的程序片段。

    var
    s1:string;
    begin
    s1:='bcp "select * from st2002..st2002_sf where st_flag=1" queryout c:\Media_data.dat -N -P -S sunnynt\hy2002';
    winexec(PChar(s1),sw_show);
    end;

      其中“select * from st2002..st2002_sf where st_flag=1”表示从st2002数据库的st2002_sf表中提取数据,“c:\Media_data.dat”为输出数据文件,参数queryout表示从查询中复制数据到外部文件,-N表示进行大容量数据复制操作,-P表示使用默认密码,-S提定进行数据复制操作的数据库服务器或实例。

    var
    s1:string;
    begin
    s1:= 'bcp ST2002..ST2002_SF in c:\Media_data.dat -n -E -P -S sunnynt \hy2002';
    winexec(PChar(s1),sw_show);
    end;

      其中参数in表示将数据从外部文件复制到数据表中。

      3.多媒体数据的回放

      同存储的方法类似,多媒体数据的回放也要借助TStream数据类型作桥梁,而且它基本上是存储的逆过程。

      LoadfromImage函数的功能是将数据表的Image字段数据装入TStream中。

    function LoadfromImage(const AField:TField;const Stream:TStream):boolean;
    var
    ResultStr:string;
    PResultStr:PChar;
    begin
    Result:=false;
    if (Assigned(AField)) and (Assigned(Stream)) then
    begin
    try
    ResultStr:=AField.Value;
    PResultStr:=PChar(ResultStr);
    Stream.Write(PResultStr^,length(Result
    Str));
    Stream.Seek(0,0);
    Result:=True;
    except
    end;
    end;
    end;

      下面是调用LoadfromImage函数将数据表Image字段中的图像数据转出到外部文件中并利用图像显示控件回放图像的程序片段。

    var
    FS:TFileStream;
    begin
    FS:=TFileStream.Create('c:\Car001.jpg',fmCreate);
    LoadfromImage(adodataset1.fieldby
    name('st_img'),FS);
    FS.Free;
    image1.picture.LoadFromFile('c:\Car001.jpg');
    end;

      三、小结

      其它多媒体数据类型如声音、视频等的转出过程与图像的转出完全相同,只是回放部分应针对不同媒体类型采用不同的媒体播放控件。

      上面所述的原型程序在Delphi 5/6/7+SQL Server 2000标准版中调试通过,经过适当的扩充和修改后,这些程序在笔者开发的高速公路收费系统中得到了验证。同样,这些程序也可使用在如学籍管理、档案管理、人事管理、商品交易等涉及到多媒体数据的应用系统中。

      如今已经是数码时代,DC、DV、MP3等数码设备正逐渐深入到我们生活和工作中,它们产生的图像、视频、声音等多媒体信息呈爆炸式增长,如何有效管理这些多媒体信息成为摆在我们面前的课题。本文简单讨论了利用SQL Server数据库对多媒体信息进行管理的几个基本问题,其原理同样适合Sybase、Oracle等数据库和Powerbuilder、VB等前端开发工具。

    发表于 @ 2004年09月26日 14:28:00|评论(loading...)|编辑

    新一篇: 看到最简单的用非Form的控件拖动Form  | 旧一篇: PI小数点后一百万位

    评论

    #疑惑 发表于2004-10-29 11:15:00  IP: 218.13.193.*
    用了你的程序式了一下,30k以下的文件保存运行正常,超过30k就报 invalid blog length 错误? sql server 用的是image字段了。是哪里出的问题啊
    #123 发表于2004-11-18 12:59:00  IP: 61.178.78.*
    正确的应该是32k,我也遇到了
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 彭为