as TBlobField).LoadFromStream(lBlobStream);
as TBlobField). SaveToStream(lBlobStream);
摘 要 本文详细描述了在尝试使用极限编程在软件开发中的一个实现例子,在小步迭代开发中逐步的实现用例需要的功能,同时每个迭代都能集成实现的功能。
关键字 极限编程
在一次项目开发中我们开发组遇到了一个需求,该需求的要使用的技术是我们所不熟悉的,就是说在开发过程中我们必须逐步的掌握该项技术,同时希望能够尽可能的保持代码有好的结构,因为在不断增加功能的过程中,会让代码逐渐的变得复杂降低可阅读性。
该需求的用例很简单,就是把图档文件保存到数据库中,同时在需要时提取出来显示。但是有的图档文件会比较大,在向数据库提交过程中可能会有性能问题,还有图档文件格式的问题,(.bmp,.Jpeg)
小组讨论的时,大家提出了首先要对要保存的数据进行压缩,同时对较大的文件要分割成合适的块,这样提交到数据库中才不会有性能问题。这样提取图档文件过程中就得对分割压缩的数据进行解压和拼接才能获得原始数据,还有就是文件格式的转换问题。
该项功能我想对于熟悉的开发人员来说可能很简单,但是由于我们组的开发人员没有类似的开发经验,就不可能在一开始获得优良的设计,只能在不断的开发进程中改进你的设计,在以往的开发中我们尝试过小步迭代开发的好处,就是在不断累积中实现需求的功功能,同时减少过程中的挫折感——你的每一步都很好的实现了需求的功能,还能每日集成你的软件,实时掌握你的开发进度。
每次迭代实现认为优先级高的功能。
我们认为图档文件的保存和提取在开发中是优先级最高的,我们首先保证可以向数据库提交图档,同时可以提起图档。这样在我们完成这个功能后其它开发组就可以使用这项功能了(虽然会有因为图片太大保存和提取的效率问题,但是它是可以使用的功能了)。我们使用的开发工具是Delphi数据库是Oracle
迭代1:文件以二进制的形式保存到数据库中,然后再以二进制的形式从数据库中提取出来。
通过查找资料后我们决定Oracle数据库使用Long Raw 类型的字段来保存二进制数据,Delphi里面使用TBlobField来把流装载都字段中向数据库提交。本文的例子简化了表的设计和使用简化后的代码
表的设计
字段名
字段类型
字段长度
字段说明
FID
Number
主键
F_NAME
VarChar2
50
文件名称
F_BINARY_DATA
Long Raw
二进制图档数据
procedure TForm1.Button2Click(Sender: TObject);
var
OpenDialog: TOpenDialog;
lFileFullName: string;
lBlobStream: TMemoryStream;
begin
lFileFullName := ;
OpenDialog := TOpenDialog.Create(Self);
lBlobStream := TMemoryStream.Create;
try
OpenDialog.InitialDir := extractfilepath(Application.ExeName);
if OpenDialog.Execute then
lFileFullName := OpenDialog.FileName;
if lFileFullName <> then
begin
lBlobStream.LoadFromFile(lFileFullName);
ClientDataSet1.Append;
ClientDataSet1.FieldByName(F_ID).Value := 2;
ClientDataSet1.FieldByName(F_NAME).Value := lFileFullName;
(ClientDataSet1.FieldByName(F_BINARY_DATA)
ClientDataSet1.Post;
end;
finally
OpenDialog.Free;
lBlobStream.Free;
end;
end;
这样就可以在向数据库提交图档数据了,这里图档文件先装载成流然后以二进制流的形式提交到数据库中的。
提取的方式就是
(ClientDataSet1.FieldByName(F_BINARY_DATA)
这样就完成图档文件的保存和提取功能。由于对该项技术不熟悉实现该功能花了我们3小时时间。在下午下班的时候我们提交了可以使用的保存图档文件的程序。