用OleContainer流为何保存不到SQL Server?(100分)

  • 主题发起人 主题发起人 tjcjh
  • 开始时间 开始时间
T

tjcjh

Unregistered / Unconfirmed
GUEST, unregistred user!
有一表名为ibm2000.dagl存放在SQL Server,两个字段(FileName, Blob),需要将
Word文件名存放在FileName字段,Word文件存放在Blob字段中,始终保存不到SQL Server,
代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
fn : String;
ms : TMemoryStream;
begin
if OpenDialog1.Execute then
begin
fn:= ExtractFileName(OpenDialog1.FileName);
ms:= TMemoryStream.Create;
try
OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False);
OleContainer1.SaveToStream(ms);

Query1.SQL.Clear;
Query1.SQL.Add('insert into ibm2000.dagl(FILENAME, BLOB) values('''+ fn+ ''', ms)');
Query1.ExecSQL;
finally
ms.Free;
end;
end;

end;

请各位高手指点一下,问题出在哪里?!谢谢。

 
Write
ms: TMemoryStream;
ms:=TMemoryStream.create;
OleContainer1.SaveToStream(ms);
ms.Position:=0;
with ibm2000.dagl do begin
edit;
TBlobField(Blob).LoadFromStream(ms);
Post;
end;
ms.Free;

Read
ms:TStream;
ms:=CreateBlobStream(FieldByName('BLOB'),bmRead);
OleContainer1.LoadFromStream(ms);
ms.Free;

 
VAR
mem:tmemorystream;;
BEGIN
WITH QUERY DO //sql 为INSERT into table(BLOBFIELD) values(:blobfield)
BEGIN
if oleform.OleContainer1.state<>osempty then //OLEFORM为放OLECONTAINER1的窗体
begin
oleform.olecontainer1.SaveToStream (mem);
Mem.Seek(0,soFromBeginning);
ParamByName('BLOBFIELD').LoadFromStream(Mem,ftBlob);
end
QUERY1.EXECSQL;
以 :XXX参数形式录入不受BDE大小限制....
 
写库之前对流进行复位
MS.POSITION := 0;
或MS.SEEK(0, soFromBeginning);
 
综合三位的帮助,看起来问题出在写库之前对流进行复位
MS.POSITION := 0;
或 MS.SEEK(0, soFromBeginning);
但还是不行,如果将
Query1.SQL.Add('insert into ibm2000.dagl(FILENAME, BLOB) values('''+ fn+ ''', ms)');
中的“ms”改为Null或0xXXXXXXXX则一切正常,虽然失去意义,但可以说明SQL SERVER服务器端、
网络、以及所写的代码没问题,问题还是出在“ms”身上。




 
你说的一切正常是什么意思?
 
Query1.SQL.Add('insert into ibm2000.dagl(fn,ms)
values(:fn,:ms)');
ParamByName('ms').LoadFromStream(Mem,ftBlob);
不行吗 ????
 
当然不对了,你的sql 语句中直接引入了tmemorystream,试想一下将它传到sql server后
sql server怎么知道如何对memorystream操作呢?
 
笑傲江湖:
我说的“一切正常”是指不出错和可以将其存入SQL Server。
mbobo:
我再试一下。
yangkee:
我该怎样做呢?

 
问题已解决,谢谢各位!
 
后退
顶部