一个很常见的数据库问题(300)(300分)

  • 主题发起人 主题发起人 ftop1
  • 开始时间 开始时间
F

ftop1

Unregistered / Unconfirmed
GUEST, unregistred user!
我想把一个文件保存在数据库中(SQL Server)

字段类型用什么好?
该把一个文件存入?
该怎样把一个数据库中存的文件取出来?

我做个例子,只能存入,不能取出来

 
数据字段用Image(好象是,好久没有使用了,你查一下吧!
SQL SERVER字段类型不多,看一下帮助或相关书籍)
保存:
TBlobField(Query1->FieldByName("fieldname")).LoadFromFile/LoadFromStream(参数)即可。
取数:
TBlobField(Query1->FieldByName("fieldname")).SaveToFile/SaveToStream(变量)即可。
 
是Image字段,用Delphi的话,将楼上的->改为点号即可,LoadFromFile或SaveToFile时的
参数是文件名,否则是流变量。
 
用text就可以,默认的是4k,在数据库中可以动态的增加,
保存:
TBlobField(Query1->FieldByName("fieldname")).LoadFromFile/LoadFromStream(参数)即可。
取数:
TBlobField(Query1->FieldByName("fieldname")).SaveToFile/SaveToStream(变量)即可。
和楼上的一样,用流模式就可以了。
 
是的,用Image,能存储各种类型的文件,存入时要记住原来的文件类型,
读取时把字段的内容先还原成原文件,再读取就不会有问题了。
 
字段用text可以吧

然后用 BlobField.LoadFromFile(const FileName: string) 进行存入
 
用IMAGE吧,TEXT只能存储无格式的文本文件,至于读写建议用流
 
用IMAGE吧,TEXT和blob都不好用
 
用IMAGE类型。
给你一个例子。读与写,我是分成1M一个块保存的。
function TfrmResManager.ReadFileFromDataBase(
const FileName: string; const FileID: integer): Boolean;//把文件从数据库中读出再组合成文件
var FileStream: TFileStream; // 将写入的文件
BlobStream: TMemoryStream; //保存的BLOB流
iPosition: integer;
daqTemp: TADOQuery;
begin
Result := False;
FileStream := TFileStream.Create(FileName, fmCreate or fmOpenWrite);
BlobStream := TMemoryStream.Create;
daqTemp := dm.daqTemp;
try
with daqTemp do
begin
Active := False;
SQL.Text := 'select * from filesdata where i_id=' + IntToStr(FileID) + ' order by i_sort';
LockType := ltReadOnly;
Active := True;
if IsEmpty then
begin
MessageDlg('数据库中没有找到相应的文件!', mtError, [mbOK], 0);
abort;
end;
iPosition := 0;
while not Eof do
begin
Application.ProcessMessages;
BlobStream.Clear;
BlobStream.Position := 0;
TBlobField(FieldByName('vc_data')).SaveToStream(BlobStream);
FileStream.Seek(iPosition, soFromBeginning);
FileStream.CopyFrom(BlobStream,0);
iPosition := iPosition + BlobStream.Size;
Next;
end;
Active := False;
FileStream.Position := iPosition;
end;
finally
FileStream.Free;
BlobStream.Free;
end;
end;

function TfrmResManager.WriteFileToDataBase(
const FileName: string; const FileID: integer): Boolean;//把文件分解写入数据库
var FileStream: TFileStream; // 将写入的文件
BlobStream: TMemoryStream; //保存的BLOB流
iPosition,num: integer;
size: Cardinal;
begin
if not FileExists(FileName) then
begin
MessageDlg(FileName + '文件不存在!',mtError,[mbOK],0);
abort;
end;
FileStream := TFileStream.Create(FileName, fmOpenRead);
BlobStream := TMemoryStream.Create;
Size := FileStream.Size;

try
Num := 1;
iPosition := 0;
with daqFilesData do
begin
Active := True;
while iPosition < Size do
begin
Application.ProcessMessages;
Append;
FieldByName('i_id').AsInteger := FileID;
FieldByName('i_sort').AsInteger := Num;
FileStream.Position := iPosition;
BlobStream.Clear;
BlobStream.Position := 0;
if (iPosition + BlockSize) <= Size then
BlobStream.CopyFrom(FileStream, BlockSize)
else
BlobStream.CopyFrom(FileStream, Size - iPosition);

BlobStream.Position := 0;
TBlobField(FieldByName('vc_data')).LoadFromStream(BlobStream);
Post;

iPosition := iPosition + BlockSize;
inc(Num);
end;
Result := True;
Active := False;
end;
finally
FileStream.Free;
BlobStream.Free;
end;
end;
你试着改写,绝对没有问题的。我的软件中用得很好。
 
来晚,555,image 字段,我用过,不错,很好用
 
接受答案了.
 
555....
白费劲了!!
 
后退
顶部