下面是一个拷贝图像到SQL Server的pubs数据库的例子, 表名pub_info, 字段名logo,图像文件名picture.bmp,保存到pub_id='0736'记录
sp_textcopy @srvn
ame = 'ServerName',
@login = 'Login',
@password = 'Password',
@dbname = 'pubs',
@tbname = 'pub_info',
@colname = 'logo',
@filename = 'c:\picture.bmp',
@whereclause = " WHERE pub_id='0736' ",
@direction = 'I'
sp_textcopy @srvn
ame = 'ServerName',
@login = 'Login',
@password = 'Password',
@dbname = 'pubs',
@tbname = 'pub_info',
@colname = 'logo',
@filename = 'c:\picture.bmp',
@whereclause = " WHERE pub_id='0736' ",
@direction = 'I'
然而,如果使用SQL Server 2000提供的image数据类型来存放图纸文件,就可以解决上述问题。
image 列所做的全部工作就是提供一个位置,用来存储组成图像数据值的位流。SQL Server 2000提供了一个小工具:Textcopy.exe,是专门用来存取image类型、ntext(长文本)类型数据的,使用很方便。我们要做的就是写一个存储过程,在应用程序中调用该存储过程,把各个必需的参数提供给Textcopy.exe,然后由它来完成存取图纸文件的工作。
但是在具体实施的时候也遇到了一个问题。开始,我们发现Textcopy.exe只对那些现有记录的image列起作用,当试图向一条新记录中添加图纸数据时就会出错。经过反复的试验和探讨,我们找到了问题症结所在:Textcopy.exe是通过image列的文本指针来存取数据的。当image列为空时,其文本指针并不存在。要存取image列,首先必须获得文本指针;而要获得文本指针,就得先对image列作初始化。进一步的试验证明,仅仅把image列初始化为null是不够的,只有输入非空的数据才能产生一个文本指针。例如,假设表prjsketch中有两个字段:usrid 和sketch,我们要把usrid为1001的用户的一张图纸存入prjsketch表中,则在使用Textcopy.exe之前,应执行如下操作:
INSERT INTO emp (usrid,sketch) VALUES (‘1001’,'0xffff ')
这就把sketch字段初始化为’0xffff’。虽然’0xffff’没有什么实际意义,但是可以确保产生并且获得文本指针。然后再使用Textcopy.exe添加图纸文件,就成功了。
实际上,我们采用了另外一种办法来实现初始化,那就是在创建表的时候,给image列设置默认值:
CREATE TABLE prjsketch(usrid char(4),sketch image DEFALUT ‘0xffff’)
这样,每次添加一条新记录时,只需要执行
INSERT INTO emp (usrid) VALUES (‘1001’)
则SQL Server 2000自动将prjsketch列的值置为 ’0xffff’,同样达到了初始化的目的,而且这种方式还减少了代码量,提高了程序运行效率。
数据库SQL Server,存放文件的字段类型Image
Create Table MyTable
(
FileName VarChar(20),
FileSource Image
)
存放文件到数据库var FileName :String;
FileName := ExtractFileName(OpenDialog1.FileName);
with Query do
begin Close;
Sql.Clear;
Sql.Add('INSERT INTO MyTable VALUES (:FileName,:FileSource)');
ParamByName('FileName').AsString := FileName;
ParamByName('FileSource').LoadFromFile(OpenDialog1.FileName,ftBolob);
ExecSQL;
end;从数据库中取出文件var
FileName :String;
begin
with Query do
begin
Close;
Sql.Clear;
Sql.Add('SELECT * FROM MyTable WHERE FileName = '?'');
Open;
FileName := 'c:\'+FieldByName('FileName').AsString;
(FieldByName('FileSource') AS TBlobField).SaveToFile(FileName);
end;
end;
[email protected]