三层结构中保存blob值的方法(oracle)(50分)

  • 主题发起人 主题发起人 zys1975117
  • 开始时间 开始时间
Z

zys1975117

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序是三层结构,数据库是用oracle8I,我以前是用table保存blob字段的值,不过速度会很慢.所以我想用query来保存,请问各位怎么样写代码,我也查了以前的问题,但还是解决不了.(字段类型:longraw)
 
用流啊 !
Query控件要post的时候写
var
st: TMemoryStream;
begin

try
st := TMemoryStream.Create;
with Editordo
begin
SelStart := 0;
SelLength := Length(Text);
SelAttributes.Protected := FALSE;
Lines.SaveToStream(st);
end;
st.Position := 0;
TBlobField(qrySummary.FieldByName('你的那个字段)).LoadFromStream(st);
try
qrySummary.Post;
except
Application.MessageBox('添加有误,重试!',
'警告',
MB_ICONWARNING);
exit;
end;
finally
st.Free;
end;
 
to crazyD:你那是两层,可我是三层结构呀.
 
没用过O8i,不知我的想法对你有没有帮助:
将blob字段的值转换为string类型,当然要自己编写代码的,
可以参考李维的书<<Delphi5.x ADO/MTS/COM+>>第104页
 
Sorry! 没办法了 帮你顶一下好啦
 
to chinaxzx:
我也想过此办法,那是万不得已我才会采用的方法。
 
crazyD 的代码没有错,不过在三层结构中Query换成clientdataset!
在post之后 ClientDataSet1.ApplyUpdates(-1);
我在三层结构保存过,绝对可以
 
procedure Savemap(cd:TClientDataSet;Bfpic: TBlobField;op: TOpenDialog;Img: TImage;DBImg: TDBImage);
var
picstream:TClientBlobStream;
ghy:TClientBlobStream;
pic:tjpegimage;
begin
if not (CD.State in [dsedit,dsInsert]) then
CD.edit;
picstream:=TClientBlobStream.Create(Bfpic,bmWrite);
try
if Op.execute then
begin
if not FileExists(Op.FileName) then
begin
Application.MessageBox('文件不存在。','提示',MB_ICONERROR);
exit;
end;
picstream.LoadFromFile(Op.filename);
picstream.Seek(0,soFrombegin
ning);
TBlobField(Bfpic).loadfromstream(picstream);
CD.post;
//CDSC.ApplyUpdates(-1);
ghy := TClientBlobStream.Create(Bfpic, bmRead);
try
ghy.Seek(JpegStartsInBlob1(Bfpic),soFrombegin
ning);
Pic:=TJpegImage.Create;
try
Pic.LoadFromStream(ghy);
DBImg.Picture.Graphic:=Pic;
finally
Pic.Free;
end;
finally
ghy.Free
end;
img.Picture := DBImg.Picture;
DBImg.Width := img.Width;
DBImg.Height := img.Height;
Img.Visible:=true;
end;
finally
picstream.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部