多媒体信息包括图像、声音和视频等,它们都是以二进制数据集合的形式存在的,在本系统中处理的对象是图像。 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; |
其它多媒体数据类型如声音、视频等的转出过程与图像的转出完全相同,只是回放部分应针对不同媒体类型采用不同的媒体播放控件。