我从外部倒入一个大型文本文件(字符数很多)Update到一个
Oracle数据库表中去,写入(Update)已成功,库表里字段的数据完整,但是我用Select查询出来再用FieldByName()方法读出来时数据就不完整了?哪位高手指导一下,谢谢!急急急急急!!!

解决方案 »

  1.   

    是不是你的数据库字段中,允许的最大字符数不足啊?
    不过大文本,建议使用Blob流字段来存储比较好,存取和读取都是用流相关的方法,应该不会有问题的
      

  2.   

    你用memo来显示你查询出来的字段值看看是不是完整.
    对于大文本,如楼上所说的,最好用blob来读取.
      

  3.   

    使用CBlob来保存,然后使用TBlobField来读取
      

  4.   

    zzn007说得值得你去查一下. 不完整有可能是你字段大小不够啊.仔细查一下即可.
      

  5.   

    楼主,我现在也用odac,但是总提示我cannot modify a read-only dataset。
    我是新手,不知道错在哪里!
    请指教~!
      

  6.   

    楼上,看看是不是readonly设置成true.
    或在修改的时候没有edit
      

  7.   

    谢谢以上的朋友,你们说的方法都试过了但还是不行,现将代码粘出,本代码本身就是要存入的文本
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, MemDS, DBAccess, Ora, Provider, OraProvider, ADODB,
      Grids, DBGrids, DBCtrls;type
      TForm1 = class(TForm)
        OraProvider1: TOraProvider;
        OraSession: TOraSession;
        Query: TOraQuery;
        btnRead: TButton;
        Memo1: TMemo;
        btnWrite: TButton;
        Button3: TButton;
        Button4: TButton;
        quInsertRecord: TOraQuery;
        Button5: TButton;
        OpenDialog: TOpenDialog;
        Button6: TButton;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        OraQuery1: TOraQuery;
        BtnQuery: TButton;
        DBMemo1: TDBMemo;
        DataSource2: TDataSource;
        procedure Button3Click(Sender: TObject);
        procedure btnWriteClick(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure btnReadClick(Sender: TObject);
        procedure Button5Click(Sender: TObject);
        procedure Button6Click(Sender: TObject);
        procedure BtnQueryClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button3Click(Sender: TObject);
    var
      f: TOpenDialog;
    begin
      f := OpenDialog;
      f.Execute;
      memo1.Lines.LoadFromFile(f.FileName );
    end;procedure TForm1.btnWriteClick(Sender: TObject);
    var
      s: TStringStream;
      rData: WideString;
      f:TextFile;
      sSQL:String;
      //iSize:integer;
    begin
      rData := memo1.Text;
      s := TStringStream.Create(Trim(rData));
      //iSize:=s.Size;
      //Application.MessageBox(PChar('s.size='+IntToStr(iSize)),'系统提示');
      try
        try
              with quInsertRecord do
              begin
                OptionsDS.LongStrings := True;
                Close;
                //SQL.Text := 'Update a set a1=EMPTY_CLOB() where a0=:a0 RETURNING a1 into :a1';
                SQL.Text := 'Update a set a1=:a1 where a0=:a0';
                Params.ParamByName('a0').AsString := '1';
                Params.ParamByName('a1').ParamType := ptInput;
                //Params.ParamByName('a1').DataType := ftOraClob;
                Params.ParamByName('a1').AsWideString:=s.DataString;
                //TBlobField(Params.ParamByName('a1')).SaveToFile('c:\直接输出.txt');
                AssignFile(f,'c:\aaa.txt');
                ReWrite(f);
                Write(f,Params.ParamByName('a1').AsWideString);
                Closefile(f);
                //Params.ParamByName('a1').AsOraClob.SaveToFile('c:\aaa.txt');
                //Application.MessageBox(PChar('s.size='+IntToStr(s.Size)),'写入');
                ExecSQL;
              end;
              showmessage('ok');
        except
           on e: exception do
              showmessage(e.Message);
        end;
      finally
          s.free;
      end;
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
      OraSession.Connected := True;
    end;procedure TForm1.btnReadClick(Sender: TObject);
    var
        s:TStringStream;
        iSize:Integer;
        sReadText:WideString;
        f:TextFile;
    begin
          try
            with query do
            begin
              Close;
              SQL.Text := 'select a1 from a where a0=''1''';
              Open;
              if not Eof then
              begin
                  //sReadText:=
                  TBlobField(FieldByName('a1')).SaveToFile('c:\read.txt');
                  //AssignFile(f,'c:\Read.txt');
                  //ReWrite(f);
                  //Write(f,sReadText);
                  //Closefile(f);
                 {s := TStringStream.Create(sReadText);
                 iSize:=s.Size;
                 Application.MessageBox(PChar('iSize='+IntToStr(iSize)),'系统提示');
                 TBlobField(FieldByName('a1')).SaveToFile('c:\a1.txt');
                 TBlobField(FieldByName('a1')).SaveToStream(s);
                 Application.MessageBox(PChar('iSize='+IntToStr(iSize)),'系统提示');
                 memo1.Lines.LoadFromStream(s);}
              end;
              Close;
            end;
          finally
             //s.Free;
          end;
    end;procedure TForm1.Button5Click(Sender: TObject);
    var
      Stream: TStream;
      BlobStream: TStream;
    begin
      with quInsertRecord do
      begin
        SQL.Text := 'select * from a';
        Open;
        Edit;    Stream := nil;
        BlobStream := nil;
        try
          Stream := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
          BlobStream := CreateBlobStream(
            FieldByName('Value'), bmWrite);      BlobStream.CopyFrom(Stream, 0);
        finally
          BlobStream.Free;
          Stream.Free;
        end;     post;
      end;
    end;procedure TForm1.Button6Click(Sender: TObject);var
        s:TStringStream;
        BlobStream: TStream;
    begin    BlobStream := nil;    try
          s := TStringStream.Create('');
          try
            with query do
            begin
              Close;
              SQL.Text := 'select a0 from rep_data where outter_field_fk=742 ';
              Open;
              if not Eof then
              begin             //TBlobField(FieldByName('a1')).SaveToFile('c:\1.txt');             BlobStream := CreateBlobStream(
                      FieldByName('a0'), bmRead);             s.CopyFrom(BlobStream,0);
              end;
              Close;
            end;
             memo1.text := s.DataString;
          finally
             s.Free;
             if assigned(BlobStream) then
             BlobStream.free;
          end;    except    end;
    end;procedure TForm1.BtnQueryClick(Sender: TObject);
    var
      sSQL:String;
    begin
      sSQL:='select * from a';
      with self.OraQuery1 do
      begin
        Close;
        SQL.Clear;
        SQL.Append(sSQL);
        Open;
      end;
    end;end.