Y
yck
Unregistered / Unconfirmed
GUEST, unregistred user!
我要用DELPHI3+ORACLE8.05存取一个大字段LONG RAW,
即把一个WORD或EXCEL文件存入数据库或从数据库中取出。
刚开始用TTABLE构件,应该没有问题。但是,TABLE的OPEN太慢。
所以我希望用TQUERY构件来实现,就出现问题了。
具体情况是:存入没有问题,取出时碰到了一些小麻烦:
对于<32K的文件,取出也没有问题,超过32K就有问题了:
取出后的文件大小为32K,从而也就达不开它了
后来,我仔细查看了BDE的HELP,发现可以修改其中BLOB SIZE的值。
HELP中明确指出:BLOB SIZE的值在32和1000之间,缺省为32。
我将它改为64后,小于64K的文件没有问题,大于64K的就有问题了:
取出后的文件大小为64K,从而也就达不开它了。
我将它改为大于64的数字后,文件大小的限定就没有规律了,
但是肯定必须小于64K,比如数字改为999后,
大于64K的文件取出后39934字节。
还有一点需要说明一下,存入的文件(最大的有4M多)
用TTABLE取出没问题。
BWT:我想问一下如何知道一个LONG RAW字段中存入的内容有多大,
即它的SIZE是多少?
希望各位大虾能赐教一下。
下面是我的源程序:
procedure TForm1.BtnSqlInClick(Sender: TObject);
VAR
S:STRING;
A:TFileStream;
begin
if not opendialog1.execute
then
exit;
A:=TFileStream.Create(opendialog1.filename,fmOpenRead);
with query1 do
begin
close;
sql.clear;
sql.add('insert into aa (a,b)');
Sql.Add('values a,:b)');
paramByName('a').asstring:=OpenDialog1.FileName;
ParamByName('b').DataType:=ftBlob;
paramByName('b').LoadFromStream(A,ftBlob);
execsql;
end;
ShowMessage('OK');
a.free;
end;
procedure TForm1.BtnSqlOutClick(Sender: TObject);
begin
if not opendialog1.execute
then
exit;
with query1 do
begin
close;
sql.clear;
sql.add('select A,B from AA');
Sql.Add('where a='''+OpenDialog1.FIleName+'''');
open;
if eof
then
begin
showmessage('eof');
if OleContainer1.State<>osEmpty
then
OleCOntainer1.DestroyObject;
exit;
end;
TBlobField(fieldByName('B')).savetofile('d:/qqqq.doc');
if OleContainer1.State<>osEmpty
then
OleCOntainer1.DestroyObject;
OleContainer1.CreateObjectFromFile('d:/qqqq.doc',false);
OleContainer1.DoVerb(ovPrimary);
end;
end;
即把一个WORD或EXCEL文件存入数据库或从数据库中取出。
刚开始用TTABLE构件,应该没有问题。但是,TABLE的OPEN太慢。
所以我希望用TQUERY构件来实现,就出现问题了。
具体情况是:存入没有问题,取出时碰到了一些小麻烦:
对于<32K的文件,取出也没有问题,超过32K就有问题了:
取出后的文件大小为32K,从而也就达不开它了
后来,我仔细查看了BDE的HELP,发现可以修改其中BLOB SIZE的值。
HELP中明确指出:BLOB SIZE的值在32和1000之间,缺省为32。
我将它改为64后,小于64K的文件没有问题,大于64K的就有问题了:
取出后的文件大小为64K,从而也就达不开它了。
我将它改为大于64的数字后,文件大小的限定就没有规律了,
但是肯定必须小于64K,比如数字改为999后,
大于64K的文件取出后39934字节。
还有一点需要说明一下,存入的文件(最大的有4M多)
用TTABLE取出没问题。
BWT:我想问一下如何知道一个LONG RAW字段中存入的内容有多大,
即它的SIZE是多少?
希望各位大虾能赐教一下。
下面是我的源程序:
procedure TForm1.BtnSqlInClick(Sender: TObject);
VAR
S:STRING;
A:TFileStream;
begin
if not opendialog1.execute
then
exit;
A:=TFileStream.Create(opendialog1.filename,fmOpenRead);
with query1 do
begin
close;
sql.clear;
sql.add('insert into aa (a,b)');
Sql.Add('values a,:b)');
paramByName('a').asstring:=OpenDialog1.FileName;
ParamByName('b').DataType:=ftBlob;
paramByName('b').LoadFromStream(A,ftBlob);
execsql;
end;
ShowMessage('OK');
a.free;
end;
procedure TForm1.BtnSqlOutClick(Sender: TObject);
begin
if not opendialog1.execute
then
exit;
with query1 do
begin
close;
sql.clear;
sql.add('select A,B from AA');
Sql.Add('where a='''+OpenDialog1.FIleName+'''');
open;
if eof
then
begin
showmessage('eof');
if OleContainer1.State<>osEmpty
then
OleCOntainer1.DestroyObject;
exit;
end;
TBlobField(fieldByName('B')).savetofile('d:/qqqq.doc');
if OleContainer1.State<>osEmpty
then
OleCOntainer1.DestroyObject;
OleContainer1.CreateObjectFromFile('d:/qqqq.doc',false);
OleContainer1.DoVerb(ovPrimary);
end;
end;