Delphi+MTS+SQL Server存储读取任何格式的文件 #13#10高手们,快出招 (100分)

  • 主题发起人 主题发起人 gztoms
  • 开始时间 开始时间
G

gztoms

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想用Delphi+MTS+SQL Server来存储读取任何格式的文件,比如文本格式(DOC,TXT等),
图片格式等等,我认为用流的方法应该可以解决这个问题,曾经试过:
数据库表 :
testtable
id : integer;
content : image;
程序:
procedure TForm1.Button1Click(Sender: TObject);
var
str:Tmemorystream;
sSql : string;
begin
sSql := 'select * from testtable';
ClientDataSet1.Close;
ClientDataSet1.CommandText := sSql;
ClientDataSet1.Open;
str:=Tmemorystream.Create;
Str.LoadFromFile('aa.doc');
str.Position:=0;
ClientDataSet1.insert;
ClientDataSet1['id'] := 1;
Tblobfield(ClientDataSet1.FieldByName('content')).loadfromstream(str);
try
ClientDataSet1.ApplyUpdates(-1);
finally
str.Free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
str:Tmemorystream;
sSql : string;
begin
sSql := 'select * from testtable';
ClientDataSet1.Close;
ClientDataSet1.CommandText := sSql;
ClientDataSet1.Open;
str:=Tmemorystream.Create;
str.Position:=0;
Tblobfield(ClientDataSet1.FieldByName('content')).savetostream(str);
str.SaveToFile('bb.doc');
str.Free;
end;
Client端用SocketConnection1+ClientDataSet1;
server端用ADOConnection1 + ADOQuery1 + DataSetProvider1;
以上的控件除了相应的设置以外,其余的属性都用默认值;
我在运行过程中虽然没报错,但是数据总是没有保存到数据库,不知是何原因,
请各位大侠多多指教。最好给出例子,先谢谢了!
 
我觉得是控件的属性没设置好,
那位大侠有做过的请尽管说,
先到先给分!
 
李微的书上有现成的例子
 
to jpw
是《ADO/MTS/COM+高级程序设计篇》吗?
在那一章那一节
 
不好意思,我也想知道 。
 
这么多天,怎么没有高手出现!
 
>>Tblobfield(ClientDataSet1.FieldByName('content')).loadfromstream(str);
问题1: str的值是什么?
>>我在运行过程中虽然没报错,但是数据总是没有保存到数据库,不知是何原因,
问题2: 数据库中该字段保存的是什么?
 
to Tense
1.strs是指向aa.doc的流
2。数据库中该字段保存的是空值
 
直接用Tblobfield(ClientDataSet1.FieldByName('content')).loadfromfile('文件名');
Tblobfield(ClientDataSet1.FieldByName('content')).savetoFile('文件名');
 
to jiangxiancheng:
按你的说法作,可是不行阿!
 
不会吧,,
var
aa:TStream;
begin
query1.sql.text:='insert into table(field……)values(:field……)'
var
aa:tmemorystream;
begin
aa:=tmemorystream.Create;
aa.Position:=0;
memo1.Lines.SaveToStream(aa);
query1.ParamByName('meo字段').LoadFromStream(aa,ftblob
这样就能成功的
 
to 风中流云:
能不能写详细一点,注意我要存储的东东是文件哦。
谢谢了!
 
只要将你要存储的文件存为流,然后再存进库中。。
 
to 风中流云:
能不能给一段详细一点的代码,是不是分数不够多,
怎样把分数加多,也请你说说,谢谢了!
 
我以前是用TABLE,很少用参数,我想了解一下!
 
to 风中流云:
老大,我是要通过中间件MTS来存储数据的(三层结构);
象你那种(两层结构)的存储方法,我早已经试验成功过。
 
to gztoms:
我也碰到这种问题,不知道你解决没有,把结果贴上来.
我觉得主要是MTS中传过来的是OLEVariant,如果能转换成stream就好办了,不知道这样
理解对不对.
 
to gztoms:
又看了一遍你的代码,你是在客户端通过clientset操作表,可是完全三层结构中,客户端是
不直接操作数据库的,我现在就是想从客户端传文档的内容(.doc或者.txt)到MTS组件,由
MTS递交到数据库,不知道,用什么类型传递,如何递交?
 
var
aa,a2:tfilestream;
begin
if opendialog1.Execute then
begin
aa:=tfilestream.Create(opendialog1.filename,fmOpenRead);
aa.Position:=0;
table1.insert;
Table1NAME.asstring:='111';
Table1BMP.LoadFromStream(aa);
//
table1.post;
aa.free;
end;
memo1.Lines.Assign(table1bmp);//取文本数据
if opendialog1.execute then
begin
a2:=tfilestream.create(opendialog1.filename,fmopenread);
a2.position:=0;
query1.close;
query1.sql.text:='insert into table(a,b)values(:a,:b)'
query1.parambyname('a').asstring:='111';
Query1.ParamByName('b').LoadFromStream(a2,ftBlob);
query1.execsql;
a2.free;
end;
aa:=Query1.CreateBlobStream(query1.FieldByName('b'),bmReadWrite);
image1.Picture.Bitmap.loadfromstream(aa);//取位图数据
end;
 
to trackboy
我还没有解决,你说得对,能够传递TStream类型就好办,
可惜delphi的接口没有提供这种类型,其他数据类型又不能传递
文件内容,所以才用这种虚三层结构,可是还是不行。。。
我现在有一种想法,在客户端将文件内容按某种格式转换成String
类型,再传递给服务器存盘,不过还没有真正思考。你有什么想法吗
 
后退
顶部