• Delphi7 中使用ODAC存取图片


    最近很少写技术贴,前几天协助王锋师兄解决了在delphi7中,使用ODAC组件存取图片的问题。事后,他整理了一个经验文档,争得他同意,我贴出来,以备以后查询之用。
    说明:ODAC组件我不熟悉,在使用它存取图片的时候,特别注意sql的写法。(转载)

    ODAC 组件支持 Oracle8 BLOB CLOB 数据类型。你可以使用 TOraQuery 组件来获取 LOB 字段的值,BLOB CLOB 数据类型通过 LOB 定位器(指定数据地址) 存储在表列中;实际的 BLOB CLOB 数据存储在独立的表空间中。当存取 LOB 列时,返回的是定位器。要初始化 LOB 定位器,你必须使用 EMPTY_BLOB EMPTY_CLOB Oracle 函数。要返回初始化后的定位器,应在同样的语句中使用 RETURNING 子句。ODAC LOB 数据到 Oracle 且返回初始值字段,需使用:值参数. ODAC 来说,在 LOB 操作中使用 ParamType 属性是非常重要的。如果 ParamType ptInput ODAC 写数据到服务器,如果 ParamType ptOutput,它则读取数据。
    以下两个例子是从Oracle10g中存/jpgbmp图片,需要注意的是在存图片的时候SQL语句的写法。


    1)存图片
    procedure TNewStamp.BitBtn3Click(Sender:TObject);
    var
    pic:TMemoryStream;
    pjpg:tjpegimage;
    pjpeg:tjpegimage;
    bmp:tbitmap;
    begin
    {//jpg
    图片
    pjpeg:=tjpegimage.Create;
    pjpg:=tjpegimage.Create;
    pjpg.LoadFromFile(‘C:\1112.jpg’);
    pic:=TMemoryStream.Create;

    pjpg.SaveToStream(pic);
    pic.Position:=0;
    pjpeg.LoadFromStream(pic);
    image1.Picture.Assign(pjpeg);

    login.SmartQuery1.Close;
    login.SmartQuery1.SQL.Clear;
    login.SmartQuery1.SQL.Add(‘insert into TEST(TEST1,TEST2) VALUES(:t1,EMPTY_BLOB()) returning TEST2 into:TEST2′);
    login.SmartQuery1.ParamByName(‘t1′).AsString:=’123′;
    login.SmartQuery1.ParamByName(‘TEST2′).ParamType:=ptInput;
    login.SmartQuery1.ParamByName(‘TEST2′).AsOraBlob.LoadFromStream(pic);
    login.SmartQuery1.Prepare;
    login.SmartQuery1.ExecSQL;

    }
    //bmp
    图片
    bmp:=tbitmap.Create;
    pic:=TMemoryStream.Create;
    bmp.LoadFromFile(‘C:\122.bmp’);
    bmp.SaveToStream(pic);
    pic.Position:=0;

    login.SmartQuery1.Close;
    login.SmartQuery1.SQL.Clear;

    login.SmartQuery1.SQL.Add(‘insert into TEST(TEST1,TEST2) VALUES(:t1,EMPTY_BLOB()) returning TEST2 into:TEST2′);
    login.SmartQuery1.ParamByName(‘t1′).AsString:=’124′;
    login.SmartQuery1.ParamByName(‘TEST2′).ParamType:=ptInput;
    login.SmartQuery1.ParamByName(‘TEST2′).AsOraBlob.LoadFromStream(pic);
    login.SmartQuery1.Prepare;
    login.SmartQuery1.ExecSQL;
    end;

    2)取图片
    procedure TNewStamp.BitBtn2Click(Sender:TObject);
    var
    pic:TMemoryStream;
    pjpeg:tjpegimage;//jpg
    格式图片
    bmp:tbitmap;//bmp
    格式图片
    begin

    login.OraQuery1.SQL.Clear;
    login.OraQuery1.SQL.Add(‘select * from TEST ‘);
    login.OraQuery1.AutoCommit:= false;
    login.OraQuery1.FetchAll:= true;
    login.OraQuery1.Open;

    if login.OraQuery1.RecordCount = 0 then
    begin
    showmessage(‘
    没有记录’);
    exit;
    end;

    bmp:=tbitmap.Create;
    pjpeg:=tjpegimage.Create;
    pic:=TMemoryStream.Create;

    TBlobField(login.OraQuery1.fieldbyname(‘TEST2′)).savetostream(pic);
    pic.Position:=0;
    bmp.LoadFromStream(pic);
    bmp.SaveToFile(‘C:\122.bmp’);
    image1.Picture.Assign(bmp);
    pic.Free;
    end;

     /////////////////////////////////////////////////////////////////////

     

     

    ODAC 组件支持 Oracle 8 的 BLOB 和 CLOB 数据类型。你可以使用 TOraQuery 组件来获取 LOB 字段的值,使用同样的方法,你也可以获取 LONG 或 LONG ROW 字段。 当你需要使用 SQL DML 及 PL/SQL 语句存取这些字段时,你就会发现 LOB 数据类型的用法有明显的不同。
    BLOB 和 CLOB 数据类型通过 LOB 定位器(指定数据地址) 存储在表列中;实际的 BLOB 和 CLOB 数据存储在独立的表空间中。与之不同的是,LONG 或 LONG RAW 类型存储在数据库中,表中存放着它们的实际值。

    当存取 LOB 列时,返回的是定位器,而不像 LONG 或 LONG RAW 数据类型那样返回它的实际值。 
    例如,分析这个表的定义:

    CREATE TABLE ClobTable (
    Id NUMBER,
    Name VARCHAR2(30),
    Value CLOB
    )

    如果我们不通过值参数初始化 LOB 定位器, Oracle 将不允许使用下面的语句来更新数据表:

    UPDATE ClobTable
    SET
    Name = :Name,
    Value = :Value

    WHERE
    Id = :Id

    要初始化 LOB 定位器,你必须使用 EMPTY_BLOB 或 EMPTY_CLOB Oracle 函数。要返回初始化后的定位器,应在同样的语句中使用 RETURNING 子句。例如:

    UPDATE ClobTable
    SET
    Name = :Name,
    Value = EMPTY_CLOB()
    WHERE
    Id = :Id
    RETURNING
    Value
    INTO
    :Value

    ODAC 写 LOB 数据到 Oracle 且返回初始值字段,需使用:值参数。
    存储过程允许自动初始化 LOB 值,方法如下:

    CREATE OR REPLACE
    PROCEDURE ClobTableUpdate (p_Id NUMBER, p_Name VARCHAR2,
    p_Value OUT CLOB)
    is
    begin
    UPDATE ClobTable
    SET 
    Name = p_Name,
    Value = EMPTY_CLOB()
    WHERE
    Id = p_Id
    RETURNING
    Value
    INTO
    p_Value;
    end;

    注意:值参数被声明为 OUT。同时,设置 LOB 数据类型的参数的 ParamType 属性为 ptInput ,且指定它到所需的数据前来实际调用存储过程。我们可以这样调用前面声明的存储过程:

    OraStroredProc1.StoredProcName := ’ClobTableUpdate’;
    OraStroredProc1.Prepare;
    OraStroredProc1.ParamByName(’p_Id’).AsInteger := Id;
    OraStroredProc1.ParamByName(’p_Name’).AsString := Name;
    OraStroredProc1.ParamByName(’Value’).ParamType := ptInput;
    OraStroredProc1.ParamByName(’Value’).AsCLOBLocator.
    LoadFromFile(FileName);
    OraStroredProc1.Execute;

    对 ODAC 来说,在 LOB 操作中使用 ParamType 属性是非常重要的。如果 ParamType 是 ptInput , ODAC 写数据到服务器,如果 ParamType 是 ptOutput,它则读取数据。

    你可以使用 LOB 参数的 dtBlob 和 dtMemo 数据类型来编写普通的 DML 语句。在这种情况下, Oracle 自动将 LONG 和 LONG ROW 类型的值转换为 CLOB 或 BLOB 数据。
    转载:出处就是csdn博客

     

  • 相关阅读:
    IDEA中快速排除maven依赖
    Maven构建war项目添加版本号
    运行shell脚本报/bin/bash^M: bad interpreter错误排查方法
    Shell杀tomcat进程
    根据URL下载文件
    关闭Centos的自动更新
    CentOS下建立本地YUM源并自动更新
    为Linux服务器伪装上Windows系统假象
    ServerInfo.INI解密
    请教给终端推销域名的邮件该怎么写?
  • 原文地址:https://www.cnblogs.com/hssbsw/p/2300862.html
Copyright © 2020-2023  润新知