求助!!!
我用Ado存取blob大字段。发现没有存到库中!!(我用db2数据库!)
用bde方式ok!没有问题!
不知为什么???现在系统用Ado方式

解决方案 »

  1.   

    我也遇到同样问题,我用oracle8i,bde驱动,但读出的blob字段也最大只能32k,
    ado读出的就更小了。
    代码如下
    blob:tblobstream;
    blob:=tblobstream.Create(TBlobField(query1.fields[0]),bmread);
    请高手大哥大姐帮忙!
      

  2.   

    可以把在文件分段写入字段中,代码应当是这样(未调试):
    从文件读入字段:
    Var
      Stream: TBlobStream;
      FromFile:   File       ;
      ReadNum:    Integer    ;
      Buffer:     Array[1..2048] of Char;
      FileName:   String;
    begin
      Try
        If OpenDialog1.Execute Then
          Begin
            FileName := OpenDialog1.FileName;
            AssignFile(FromFile,FileName);
            Reset(FromFile,1);
            Query1.append;
            Stream := TBlobStream.Create(TBlobField(Fields[0]),bmReadWrite);
            repeat
              BlockRead(FromFile,Buffer,SizeOf(Buffer),ReadNum);
              If ReadNum <>0 Then
                BlobStream.Write(Buffer,ReadNum);
            Until (ReadNum = 0);
            Query1.Post;
        End;
      Finally
        CloseFile(FromFile);
      End;
    从字段中读出到文件:
    Var
      FileName:   String;
      ToFile:     File;
      Stream: TBlobStream;
      MemSize:    Integer;
      Buffer:     PChar;
      i,j,k,WriteNum: Integer;
    begin
      FileName := 'C:\......';
      AssignFile(ToFile,FileName);
      ReWrite(ToFile,1);
      Stream := TBlobStream.Create(TBlobField(Query1.Fields[0]),bmRead);
      Try
        MemSize := Stream.Size;
        Inc(MemSize);
        Buffer := AllocMem(2048);
        Try
          j := (MemSize - 1) div 2048 + 1 ;
          For i := 1 to j Do
          Begin
            If i = j Then k := MemSize - (j-1)*2048 - 1 Else k := 2048;
            Stream.Read(Buffer^ , k);
            BlockWrite(ToFile,Buffer^,k,WriteNum);
          End;
        Finally
          FreeMem(Buffer,MemSize);
        End;
      Finally  End;
      CloseFile(ToFile);
      Stream.Free;
    end;
      

  3.   

    oracle8i时ado我以前用了一下,是有保存不进入的问题。
      

  4.   

    可以修改bolb字段的大小的
    在库里面修改
    或者在建表的时候附值
      

  5.   

    关于blob字段的数据,最好是用两个getmem和getdata函数,其他的应该不好使。
    给你一段类似的代码参考:
    try
          if adotbsql.FieldByName('feature').IsBlob then
          begin
             getmem(p3[i],s3);
             if adotbsql.FieldByName('feature').GetData(p3[i]) then
                //adotbTemp.FieldByName('feature').GetData(p3[i])
                adotbTemp.Fields[3].GetData(p3[i])
             else
                showmessage('图像 is null');
             freemem(p3[i]);
          end;
    ……
      

  6.   

    最好不要用ado,微软的驱动好像有问题,用bde驱动
    设置database的params参数
    SERVER NAME=''
    USER NAME='';
    PASSWORD=''
    BLOB SIZE=''
    然后
    Stream := TBlobStream.Create(TBlobField(Query1.Fields[0]),bmRead);
    可以写进BLOB或其他二进制流,如果不设置BLOB SIZE属性最大
    也只能有32K,因为BLOB SIZE 默认值为32K
    希望对你有帮助。
      

  7.   

    试了各位的方法都不行阿,是不是真是Ado驱动有问题阿!?
    有没有大侠们使用过Ado存取大字段阿!!????????
      

  8.   

    不会呀,我用ADO 和Sql Server 存几兆的Doc文档也没什么问题呀.    ADOBlobStream := TADOBlobStream.Create(TBlobField(ADOQueryAll.FieldByName('LAWS_CONTENT')),bmRead);
        if OpenDialog.Execute then
        begin
        ADOBlobStream.LoadFromFile(OpenDialog.FileName);
        ADOBlobStream.Position := 0;
        TBlobField(ADOQueryAll.FieldByName('LAWS_CONTENT')).LoadFromStream(ADOBlobStream);
        end;
        ADOBlobStream.Free;
      

  9.   

    ADODatabase.edit;
    ADODatabaseBLOB.LoadFromFile('c:\temp\myfile.doc');   //ADODatabaseBLOB为Blod字段
    ADODatabase.post;
      

  10.   

    TBlobField(AdoDataset.FieldbyName(FieldName)).loadFromFile()
    post
      

  11.   

    如果取到JPG格式的图像保存进字段,那又如何读取出来呢???
      

  12.   

    to theam(云无常定)  兄 :
     我试了你的方法,没有错误,但还是没保存到库中。
     偶把Adodataset的lock type 属性设为 itoptimistic ,在post时报“参数数目错误”的提示。 设为ltBatchOptimistic 时,post不报错。但还是没保存到库中。 因为ltBatchOptimistic ,Ado执行是按批模式保存,所以我加了Ado的connection的事务处理。还是不行阿!!
     小弟现在真是郁闷阿
      

  13.   

    我的后台数据库是sqlserver,没有你说的问题
      

  14.   

    oracle8i时用ado我遇到很多问题的
    不知道是不会用还是ado连oracle8i有问题
    后来改用bde 和 ODAC 了
      

  15.   

    我看也是Ado连db2的问题!
    用bde可以的!!
    我就是搞不懂!
    有什么补丁嘛??
      

  16.   

    ado 的两个补丁打了吗
    up
      

  17.   

    用< theam(云无常定) )说的应是没问题的。我一直在用。