TBlob = packed record
    sText : String[14];
    nNum  : Integer;
  end;
//保存
procedure TForm1.Button1Click(Sender: TObject);
var
  Stream   : TMemoryStream;
  Blob     : TBlob;
begin
  Stream := TMemoryStream.Create;  Blob.sText := Edit2.Text;
  Blob.nNum  := SpinEdit1.Value;  Stream.Write(Blob, SizeOf(TBlob));
  try
    with ADOQuery do begin
      Close;
      SQL.clear;
      SQL.text:= 'select * from test where Acc=:nm';
      Parameters.ParamByName('nm').Value:= Edit1.Text;
      Open;
      if RecordCount > 0 then begin
        Edit;
        FieldByName(Acc).Value := Edit1.Text;
        TBlobField(FieldByName('TestBlob')).LoadFromStream(Stream);      end else begin
        Append;
        FieldByName(Acc).Value := Edit1.Text;
        TBlobField(FieldByName('TestBlob')).LoadFromStream(Stream);
      end;
      Post;
      Close;
    end;
  except
    on E:Exception do Memo1.Lines.Add(E.Message);
  end;
  Stream.Free;
end;
//读取
procedure TForm1.Button2Click(Sender: TObject);
var
  Stream   : TMemoryStream;
  Blob     : TBlob;
  nSize    : Integer;
begin
  Stream  := TMemoryStream.Create;
  try
    with ADOQuery do begin
      Close;
      SQL.Clear;
      SQL.text := 'select * from test where Acc=:nm;
      Parameters.ParamByName(nm).Value := Edit1.Text;
      Open;
      if RecordCount > 0 then begin
        TBlobField(FieldByName('TestBlob')).SaveToStream(Stream); //直接这样,读不到数据
          //下面先保存到文件,再读进来,就正常,这是为什么呢?总不能总是先保存文件啊?
        //TBlobField(FieldByName('TestBlob')).SaveToFile('D:\ffff.txt');
        //Stream.LoadFromFile('D:\ffff.txt');
        nSize := Stream.Read(Blob, SizeOf(TBlob));
        Memo1.Lines.Add('nSize:' + IntToStr(nSize));
        Memo1.Lines.Add('Text:' + Blob.sText);
        Memo1.Lines.Add('nNum:' + IntToStr(Blob.nNum));
      end;
      Close;
    end;
  except
    on E:Exception do Memo1.Lines.Add(E.Message);
  end;
  Stream.Free;
end;求大神指点一下,有什么方法可以直接将BLOB读到流中不???

解决方案 »

  1.   

      TBlob = packed record
        sText : String[14];
        nNum  : Integer;
      end;
    //保存
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Stream   : TMemoryStream;
      Blob     : TBlob;
    begin
      Stream := TMemoryStream.Create;  Blob.sText := Edit2.Text;
      Blob.nNum  := SpinEdit1.Value;  Stream.Write(Blob, SizeOf(TBlob));
      try
        with ADOQuery do begin
          Close;
          SQL.clear;
          SQL.text:= 'select * from test where Acc=:nm';
          Parameters.ParamByName('nm').Value:= Edit1.Text;
          Open;
          if RecordCount > 0 then begin
            Edit;
            FieldByName(Acc).Value := Edit1.Text;
            TBlobField(FieldByName('TestBlob')).LoadFromStream(Stream);      end else begin
            Append;
            FieldByName(Acc).Value := Edit1.Text;
            TBlobField(FieldByName('TestBlob')).LoadFromStream(Stream);
          end;
          Post;
          Close;
        end;
      except
        on E:Exception do Memo1.Lines.Add(E.Message);
      end;
      Stream.Free;
    end;
    //读取
    procedure TForm1.Button2Click(Sender: TObject);
    var
      Stream   : TMemoryStream;
      Blob     : TBlob;
      nSize    : Integer;
    begin
      Stream  := TMemoryStream.Create;
      try
        with ADOQuery do begin
          Close;
          SQL.Clear;
          SQL.text := 'select * from test where Acc=:nm;
          Parameters.ParamByName(nm).Value := Edit1.Text;
          Open;
          if RecordCount > 0 then begin
            TBlobField(FieldByName('TestBlob')).SaveToStream(Stream); 
              Stream.Position := 0; //加上这一句后,就正常了。
            nSize := Stream.Read(Blob, SizeOf(TBlob));
            Memo1.Lines.Add('nSize:' + IntToStr(nSize));
            Memo1.Lines.Add('Text:' + Blob.sText);
            Memo1.Lines.Add('nNum:' + IntToStr(Blob.nNum));
          end;
          Close;
        end;
      except
        on E:Exception do Memo1.Lines.Add(E.Message);
      end;
      Stream.Free;
    end;问题已经解决好了。把解决方法也同时回复在这,希望对其他的新手朋友们有些许的帮助。
    CSDN的朋友们让我学习到了不少的东西,谢谢大家。