设为首页 收藏本站
查看: 725|回复: 0

[经验分享] Delphi处理SQL Server多媒体数据

[复制链接]

尚未签到

发表于 2016-11-2 01:17:29 | 显示全部楼层 |阅读模式
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 sunnynthy2002';
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;


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-294263-1-1.html 上篇帖子: SQL Server 2005中PIVOT與UNPIVOT 下篇帖子: SQL Server触发器的使用方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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