我的程序如下,很简单的procedure TForm1.MBBitBtn1Click(Sender: TObject);
var
  Ms:TmemoryStream;
  jpg:Tjpegimage;
  testStream:TMemoryStream;
begin
  try
    testStream := TMemoryStream.Create;
    Image1.Picture.Graphic.SaveToStream(testStream);
    adoquery1.Close;
    adoquery1.SQL.Clear;
    adoQuery1.SQL.Add('Insert into RPT_CAR_INFO(JPGDATE,CARJPG) values (:id,:photo)');
    adoquery1.Parameters.ParamByName('id').Value := '003';
    adoQuery1.Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob);
    adoquery1.ExecSQL;
  finally
    testStream.Free;
  end;
end;
表结构
create table RPT_CAR_INFO
(
  JPGDATE        VARCHAR2(16),
  CARJPG         blob    );运行后报错:“ORA-12571 TNS  包写入程序失败”
虽然报错,记录倒是插进去了,字段 JPGDATE 有值
不知道什么原因,我快晕了......

解决方案 »

  1.   

    1.可能是由杀毒软件或防火墙引起的,关闭它们试试
    2.你的SQLNET.ORA文件的不正确配置也可能导致问题。删除你的客户端和你的数据库服务器上SQLNET.ORA 文件中SQLNET.EXPIRE_TIME=0这一条。
      

  2.   

    在本机上
    D:\oracle\ora81\network\ADMIN\SAMPLE 下有一个SQLNET.ORA 
    里面有一条 #sqlnet.expire_time = 10 ,这样是有问题的吗
    数据库服务器上我暂时看不到
      

  3.   

    另外就是,我这样写
        ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('select JPGDATE,CARJPG from RPT_CAR_INFO');
        ADOQuery1.Open;
    会提示 “数据类型不被支持” 这样的错误是不是我什么地方搞错了?有谁遇到过这样的情况
      

  4.   

    问题解决,我把字段类型改为 LONG RAW 就行了
    但是我就不知道使用 blob 类型为什么会出错?
    blob 和 LONG RAW 类型有何区别呢?
      

  5.   

    刚查到的资料:
    用ADO连接ORACLE数据库,不支持BLOB,打不开含有BLOB字段的记录集。
    当然,也没办法插入数据了是这样吧,各位
      

  6.   

    建议用ODAC,我一直用它连oracle,没任何问题
      

  7.   

    真晕,掉了一句:ms.position:=0;非常重要的一句,要不会出错的,到文件尾了!
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject); // 插入图片过程
    var
    testStream:TMemoryStream;
    begin
      try
        testStream := TMemoryStream.Create; //  创建内存流
        Image1.Picture.Graphic.SaveToStream(testStream);   // 将图片保存到内存流中
        adoquery1.Close;
        adoquery1.SQL.Clear;
        adoQuery1.SQL.Add('Insert into tbltemp (Image) values (:photo)');    // 进行插入操作
        adoQuery1.Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob); // 读取保存的内存图
        adoquery1.ExecSQL;
      finally
        testStream.Free;     // 释放内存流
      end;
    end; 试试这个呢我的数据类型是image哈,不是blob
      

  9.   

    procedure TForm1.Button1Click(Sender: TObject); // 插入图片过程
    var
    testStream:TMemoryStream;
    begin
      try
        testStream := TMemoryStream.Create; //  创建内存流
        Image1.Picture.Graphic.SaveToStream(testStream);   // 将图片保存到内存流中
        
        testStream.position:=0;  //关键的一句
        
        adoquery1.Close;
        adoquery1.SQL.Clear;
        adoQuery1.SQL.Add('Insert into tbltemp (Image) values (:photo)');    // 进行插入操作
        adoQuery1.Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob); // 读取保存的内存图
        adoquery1.ExecSQL;
      finally
        testStream.Free;     // 释放内存流
      end;
    end;