我想在TQuery中取BLOB类型的数据(SQL 2k),查帮助说可以用CreateBlobStream
来读取,但使用时老报错,哪位大虾能帮助一下?非常感谢!

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Blob:TBlobStream;
    begin
       Query1.Close;
       Query1.SQL.Clear;
       Query1.SQL.Add('select content from nordata where subservice=''YD'' and number=2');
       Query1.Open;
       Blob:=Query1.CreateBlobStream(Query1.FieldByName('content'),bmRead);
       Blob.Read(PChar(Memo1.Text),Blob.Size);
    end;这段代码编译通不过,但帮助上的例子就是这样用的,
    如果把TBlobStream改为TStream则编译能通过,但运行会报错
      

  2.   

    //写入
    var
     MS: TMemoryStream;
    begin
     MS:=TMemoryStream.create;
     Image1.Picture.Bitmap.SaveToStream(MS);
     MS.Position:=0;
     Table1.Append; 
     //在数据库中添加一条记录
     TBlobField(Table1.FieldbyName(’image’)).LoadFromStream(MS);
     Table1.Post; 
     //将所作的更新写入数据库
    end;
    //读取
    var
     MS: TStream;
    begin
     with Table1 do
      MS:=CreateBlobStream(FieldbyName(’image’),bmRead);
     Image1.Picture.Bitmap.
     LoadFromStream(MS);
     MS.Free;
    end;
      

  3.   

    只能这样用吗?如果我在SQL 2K中一个字段为varchar(1024),就不能这样读了吗?还是需要作转换?
      

  4.   

    Query1.CreateBlobStream(Query1.FieldByName('content'),bmRead)
    结果是TStream,要先用一个TStream进行转换.
    function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyblobStream: TBlobStream;
    begin
       Query1.Close;
       Query1.SQL.Clear;
       Query1.SQL.Add('select content from nordata where subservice=''YD'' and number=2');
       Query1.Open;
       //用此句也可以,注意如果为bmWrite的话,要先query1.edit
       MyBlobStream := TBlobStream.Create(TBlboField(Query1.FieldByName('content')),bmRead);
    end;
      

  6.   

    我这样作了,但执行
    TBlobStream.Create(TBlboField(Query1.FieldByName('content')),bmRead);
    这一句时会报一个错:
    Project Project1.exe raised exception class EAccessViolation with message
    'Access violation at address 00404440 in module 'Project1.exe',Read of
    address FFFFFFF7',Process stopped.Use Step or Run to continue.
    为什么会有非法的地址操作呢?
      

  7.   

    我发现把Varchar(1024)在SQL Server上直接修改为Text就可以直接用FieldByName().AsString取出所有数据