BLOB问题,请大虾们帮帮忙!(急) (50分)

  • 主题发起人 主题发起人 覆雨翻云
  • 开始时间 开始时间
Oracle没有用过不过我用MYSQL的时候也遇上过类似的情况,不过你不一定非要用DBE嘛我建议你
用Zeos Accesss控件包,该控件包通过底层直接和ORACLE/MYSQL/MSSQL/INFOMIX/
POSTGRESQL连接!而且和几种数据库连接的控件参数、函数和过程都一样!如果你的程序需要移植
到其他数据库系统会非常方便!
 
你的含有blob字段的table可以激活吗?另外,你的oracle版本和bde上的配置是否一样?
 
to 战鹰:
zeos accesss控件包在哪里?我oracle数据库刚从7.3升至8i,bde连接出了些问题,很
需要你说的这种控件。
 
含 Blob 字段的 Clientdataset 可以激活,配置肯定一样,即时可以存入(用SQL EXPLORE
可以查看),但就是显示不出来!
现在程序执行至 TBlobField(ClientDataSet1.FieldByName('txt')).SaveToFile('c:/sxg.txt');
时提示错误: Exception EDBClient in module Project1.exe at 0008AA41,
Blob has not been fetched.
请大侠们指教!
 
http://www.zeoslib.org
 
如果你用ADO的话,根本就不存在超过32K就写不进去的问题。我的数据库为MSSQL SERVER7,
字段为IMAGE类型,20多M的文件,读写都没有问题,并且写文件到数据库时也没有用TSTREAM。

ADOQUERY1.CLOSE;
ADOQUERY1.SQL.CLEAR;
ADOQUERY1.SQL.ADD('INSERT INTO MYTABLE('FJ') VALUES(:WJ)');
ADOQUERY1.PARAMETERS.PARAMBYNAME('WJ').LOADFROMFILE('C:/TEST.TXT',FTBLOB);
ADOQUERY1.EXECSQL;

一切OK!
 
to 荷塘新月:
我现在可以写进去,是读不出来, 用 SaveFile 方法读,请大虾指教!
 
Blob 流这样用 [^][^]

var
mystream, BlobStrm: TStream;
begin
mystream:=TFileStream.Create('c:/test.txt',fmopenread);
BlobStrm := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName('TXT'), bmWrite);
BlobStrm.CopyFrom(mystream, 0);
BlobStrm.Free;
end;
 
to OopsWare:
监测到 BlobStrm := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName('TXT'), bmWrite);
执行完后 BlobStrm 中无数据,事实是字段 TXT 中有数据,问题没有解决。

最终的问题归结为:怎样将BLOB 字段中的内容存入 STREAM 或 文件中?
 
忘了一件事,BDE 在创建 BLOB 流以后,其 Position 指向 Stream 的结束,
设置 Stream 的 Position := 0 (或者seek), 就可以读出所有的数据了。 [:I]
 
还是不行,估计是 Provider or Clientdateset 哪儿设置有问题,请各位指教应
注意的设置(分有点少,问题解决后另开新题为大家加分)
 
你能确信你的blob字段真的存有数据吗?如果有数据,用dbmemo应该会有几个字符显示的,
另外,你用clientdataset,也须先在服务器端建立一个table,那个table可以正常激活吗?
我遇见同样的问题,后来通过zeos dataaccess成功存取blob字段,主要是避开了bde的连接,
我服务器端的table当时根本无法激活。程序本身应该没有什么问题。
另外,clientdataset我没用过,有什么特别之处吗?什么时候会考虑用他?
程序如下,可以参考:
procedure TForm1.Button1Click(Sender: TObject);
var stream1:tmemorystream;
begin

table1.Insert;
stream1:=Tmemorystream.Create;
stream1.LoadFromFile('d:/uuu/luck.doc');
stream1.Position:=0;
Tblobfield(table1.FieldByName('docfield')).loadfromstream(stream1);
try
table1.Post;
finally
begin
stream1.Free;

end
end;
ShowMessage('文件导入数据库成功!');
end;

procedure TForm1.Button2Click(Sender: TObject);
var str:tmemorystream;
begin
str:=Tmemorystream.Create;
str.Position:=0;
Tblobfield(table1.FieldByName('docfield')).savetostream(str);
str.SaveToFile('d:/uuu/luck1.doc');
str.Free;

ShowMessage('文件导出数据库成功!');
end;
 
我估计我的代码没什么问题,请大家回答这个问题:

还是不行,估计是 Provider or Clientdateset 哪儿设置有问题,请各位指教应
注意的设置(分有点少,问题解决后另开新题为大家加分)
 
不耽误大家的时间了,我改用 long 字段,一切OK!
 
多人接受答案了。
 
后退
顶部