1.下面的语句在SQL EXPLORER 中执行通过,用SELECT(在ENTER SQL处输入)查看此表也可以,但直接选表,查看DATA,会报错:“General SQL ERROR, ORQ-00936: 缺少表达式”,请问是为什么?
-----------------------------------------
CREATE TABLE TMPTABLE (
  GNAME VARCHAR2(10),
  AAA BLOB

-----------------------------------------2.现在要向TMPTABLE写入数据,如果要把richedit的内容写入AAA中,如何做,能写上代码最好,谢!我在保留区搜了一些也看了,用流文件,可还是有问题。
----------------------------------------
   s1 := 'insert into tmptable (gname,aaa) values ('+''''+ComboBox3.Text+''''+',:edittext)';
   query2.SQL.Add(s1);
   Query2.ParamByName('aaa').LoadFromStream(bstream,ftOraBlob);
      //执行是报什么 LOB定位器错,请高手指点------------------------------------------------
3.把AAA的内容导到richedit中怎么做,我看了些贴子大多是导出文件,再请指点
-----------------------------------------------------------
*****************
这是我按一个贴子的例子改写的,在激活TABLE1时也报 ORQ-00936: 缺少表达式
var
  st :TMemoryStream;
begin
  //Table1.TableName := 'tmptable';
  //Table1.Active := true;
  try
    st := TMemoryStream.Create;
    st.Clear;
    RichEdit1.Lines.SaveToStream(st);
    if not (Table1.State in [dsEdit, dsInsert]) then
      table1.Append;
    TBlobField(Table1.FieldByName('edittext')).LoadFromStream(st);
    Table1.Post;
  except
    st.Free;
  end;
    st.Free;
end;
-------------------------------------------------------
总之,希望高手给说详细点,分不够可以再加,大家来讨论一下吧,谢

解决方案 »

  1.   

    1.用Long Raw类型可能更好一些。BLOB是后来才有的类型,用法我不清楚;而LongRaw比较早就有了,我用了很多都没有什么问题。建议用LongRaw来试一试。
      

  2.   

    2.
    >>Query2.ParamByName('aaa').LoadFromStream(bstream,ftOraBlob);
    改成:
    Query2.ParamByName('edittext').LoadFromStream(bstream,ftOraBlob);如果还有问题试一试把ftOraBlob换成ftBlob还有记得流的游标置零3.
    var Stream: Tmemorystream;//RichEdit写入字段aaa
    with Table1 do
      begin
      Append;
      stream.Clear ;
      richedit1.Lines.SaveToStream(stream);
      stream.Position :=0;
      (FieldByName('aaa') as TBlobField).LoadFromStream(Stream);
      post;
      end;//读字段aaa到RichEdit
    Stream.Clear ;
    TblobField(table1.FieldByName('aaa')).savetostream(stream);
    stream.Position :=0;
    richedit1.lines.clear;
    richedit1.lines.LoadFromStream(stream);
      

  3.   

    第一点:就我以前的经历,oracle数据库你最好有一个Primary Key,强烈建议
    第二点:读例(我刚完成的项目中的)//==============================================================================
    //功能:从批量交易表中读出当前的交易信息
    //入参:aRecIndex 当前的批量交易表的记录号
    //出参:aBITran 交易数据信息
    //返回:当数据库操作正常 返加true 否则返回 false
    //==============================================================================
    function ReadRecFmBatchTab(const aRecIndex:Integer;
                               aDatabase:TDatabase;
                               var aBITran:TBITran):Boolean;
    var
      mQuery:TQuery;
      BlobStream:TStream;
    begin
      Result:=true;
      mQuery:=TQuery.Create(nil);
      mQuery.DatabaseName:=aDataBase.DatabaseName;
      mQuery.SessionName:=aDataBase.SessionName;
      mQuery.SQL.Clear;
      with mQuery do
      begin
        Sql.Add('SELECT * FROM BATCHTRANS_TAB WHERE TINDEX='+IntToStr(aRecIndex)); 
        try
          try        mQuery.Open;
            aBITran.RecIndex:=aRecIndex;
            aBITran.BznsCode:=FieldByName('TRANS_CODE').AsInteger;
            aBITran.BznsCtrl.BznsCtrlNo:=FieldByName('TRANS_CTRLNO').AsInteger;
            aBITran.BznsCtrl.BznsSta:=FieldByName('TRANS_STATE').AsInteger;
            aBITran.BznsCtrl.BznsNode:=FieldByName('TRANS_NODE').AsInteger;
            aBITran.BznsCtrl.NodeSta:=FieldByName('TRANS_NODESTATE').AsInteger;
            aBITran.UnitNo     :=FieldByName('UNITNO').AsString;
            aBITran.Card       :=FieldByName('CUST_CARDNO').AsString;
            aBITran.Ywh        :=FieldByName('CUST_AGENTNO').AsString;
            aBITran.Jzlsh      :=FieldByName('UNITSERIAL').AsString;
            aBITran.Sfbh       :=FieldByName('SFBH').AsInteger;
            aBITran.Zjfys      :=FieldByName('ZJFYS').AsInteger;
            aBITran.Zqfys      :=FieldByName('ZQFYS').AsInteger;
            aBITran.IFTRXSERNB :=FieldByName('HOSTSERIAL').AsInteger;
            aBITran.PreAmount  :=FieldByName('TRANS_PREAMOUNT').AsFloat;
            aBITran.RealAmount :=FieldByName('TRANS_AMOUNT').AsFloat;
            aBITran.Balance    :=FieldByName('TRANS_BALANCE').AsFloat;        BlobStream:=CreateBlobStream(FieldByName('CONTENTS'),bmRead);
            BlobStream.Read(aBITran.Content,BlobStream.Size+1);      except
            Result:=false;
          end;
        finally
          Free;
        end;
      end;
    end;
    第三点:写例://==============================================================================
    //功能:向批量交易表中写入交易数据信息和交易控制信息
    //入参:aRecIndex 当前的批量交易表的记录号
    //      aBITran 交易数据信息
    //      aBznsCtrl 交易控制信息
    //返回:当数据库操作正常 返加true 否则返回 false
    //==============================================================================
    function WriteRecToBatchTab(const aRecIndex:Integer;
                                      aDataBase:TDatabase;
                                const aBITran:TBITran):Boolean;
    var
      mQuery:TQuery;
      MS:TMemoryStream;
    begin
      Result:=true;
      mQuery:=TQuery.Create(nil);
      mQuery.DatabaseName:=aDataBase.DatabaseName;
      mQuery.SessionName:=aDataBase.SessionName;
      mQuery.SQL.Clear;
      with mQuery do
      begin
        //组装mQuery的sql语句
        SQL.Add('UPDATE BATCHTRANS_TAB SET TRANS_STATE=:TRANS_STATE,'+
                'TRANS_NODE=:TRANS_NODE,TRANS_NODESTATE=:TRANS_NODESTATE,'+
                'HOSTSERIAL=:HOSTSERIAL,TRANS_PREAMOUNT=:TRANS_PREAMOUNT,'+
                'TRANS_AMOUNT=:TRANS_AMOUNT,TRANS_BALANCE=:TRANS_BALANCE,'+
                'UNITSERIAL=:UNITSERIAL,'+
                'SFBH=:SFBH,ZQFYS=:ZQFYS,ZJFYS=:ZJFYS,TRANS_MEMO=:TRANS_MEMO,'+
                'CONTENTS=:CONTENTS'+
                ' WHERE TINDEX=:TINDEX');
                
        MS:=TMemoryStream.Create;
        try      MS.Write(aBITran.Content,StrLen(aBITran.Content));
          try
            ParamByName('TINDEX').AsInteger:=aBITran.RecIndex;
            ParamByName('TRANS_STATE').AsInteger:=aBITran.BznsCtrl.BznsSta;
            ParamByName('TRANS_NODE').AsInteger:=aBITran.BznsCtrl.BznsNode;
            ParamByName('TRANS_NODESTATE').AsInteger:=aBITran.BznsCtrl.NodeSta;
            ParamByName('HOSTSERIAL').AsInteger:=aBITran.IFTRXSERNB;
            ParamByName('TRANS_PREAMOUNT').AsFloat:=aBITran.PreAmount;
            ParamByName('TRANS_AMOUNT').AsFloat:=aBITran.RealAmount;
            ParamByName('TRANS_BALANCE').AsFloat:=aBITran.Balance;
            ParamByName('UNITSERIAL').AsString:=aBITran.Jzlsh;
            ParamByName('SFBH').AsInteger:=aBITran.Sfbh;
            ParamByName('ZQFYS').AsInteger:=aBITran.Zqfys;
            ParamByName('ZJFYS').AsInteger:=aBITran.Zjfys;
            ParamByName('TRANS_MEMO').AsString:=aBITran.Describe;
            ParamByName('CONTENTS').LoadFromStream(MS,ftMemo);
            aDataBase.StartTransaction;
            ExecSQL;
            aDataBase.Commit;
          except
            Result:=false;
            aDataBase.RollBack;
          end;
        finally
          Free;
          MS.Free;
        end;
      end;
    end;
      

  4.   

    关于读写BLOB字段的例子很多,
    我加一句,在读写ORACLE的BLOB时要注意BDE的Blob size参数。默认还是10k,太小了。
      

  5.   

    默认的BDE的BLOB字段的大小是32K,可以再BDE Administrator中修改
      

  6.   

    TO:  junerr(路在何方),
    你的代码应该是对的,我还存在个问题是,在激活TABLE1时报 ORQ-00936: 缺少表达式;这可能是表建 的有问题,如知是什么原因还请告知!
    =====================================
    CREATE TABLE TMPTABLE (
      GNAME VARCHAR2(10),
      AAA BLOB

      

  7.   

    我没用过Oracal的BLOB类型,也许问题就出在它的身上,你方便的话换成LongRaw的试试
      

  8.   

    to see:
    http://www.csdn.net/expert/topic/1017/1017585.xml?temp=.3102686