如何把数据库中的图像数据提取给数据窗口的picture object

adwork 2003-03-05 08:38:48
数据是存放在数据库的,picture object是数据窗口里面的,
在数据窗口里面,picture只能通过设定文件存放路径来提取,但我想直接从数据库中提取,请问如何实现
谢谢
...全文
113 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
adwork 2003-03-07
  • 打赏
  • 举报
回复
数据窗口怎么打印jpg文件,它只支持bmp文件打印呀
888888888888 2003-03-05
  • 打赏
  • 举报
回复
关注
adwork 2003-03-05
  • 打赏
  • 举报
回复
谢谢各位

  我是想把数据库中存放的blob类型的字段(就是图像)取出来传给数据窗口中的picture object,至于如何存,我知道,在window窗口中显示也知道,就是不知道如何在数据窗口中显示。因为数据窗口只能通过设定文件存放路径来存放
boyliulang 2003-03-05
  • 打赏
  • 举报
回复
你在网上查查.pb---blob
boyliulang 2003-03-05
  • 打赏
  • 举报
回复
第二十九讲:如何使用 BLOB 数据类型




张健姿
我 们 在 使 用PowerBuilder 编 程 的 过 程 中, 总 是 不 可 避 免 地 要 用 到BLOB(Binary Large Objects , 大 型 二 进 制 对 象) 字 段 及 其 相 关 函 数。 这 里 我们 来 介 绍 一 下 使 用BLOB 的 方 法
一、何 时 使 用BLOB 数 据 类 型
在 下 列 情 况下, 我 们 可 能 要 在PowerScript 语 言 中 使 用 到BLOB 数 据 类 型:
· 您 要 将OLE 对 象( 如 图 形、 声 音 等) 存入 您 的 数 据 库 中;
· 您 要 将 大 型 的 二 进 制 对 象 存 入 您 的数 据 库 中;
· 您 所 要 操 纵 的 文 本 对 象 过 大, 以 致于 一 般 的 字 符 串 函 数 无 法 对 其 操 作;
· 您 所 使 用 数 据 库 的 数 据 类 型PowerBuilder 不 能 支 持, 如SQLBase 中longvarchar 这 一 数 据 类 型, 所 以 您 只能 使 用blob 函 数 对 其 进 行 操 纵。

您 所 使 用 的DBMS 中, 怎 样 的 数 据 类型 可 以 在PowerScript 中 与BLOB 数 据 类 型 相 对 应 ?
这 里 罗 列 的一 些 常 见 数 据 库 的 数 据 类 型, 其 它 类 型 的 数 据 库 请 查询 该 数 据 库 的 相 关 文 档, 及PowerBuilder 的 用 户 手 册。


二、在 数 据 窗 口 中 使 用OLE 列
在 数 据 窗 口 中 使 用OLE 列, 必 须 满 足以 下 要 求:
· 包 括OLE 列 的 表 必 须:
具 有 一 个 可 以 对 应 成 为BLOB 的 数 据 类 型;
一 个OLE 列 必 须 允 许 为 空;
必 须 有 主 键;
· 如 果 您 使 用 的 开 发 环 境 是SQL Server,您 必 须 将AUTOCOMMIT 设 置 为TRUE;
· 在 数 据 窗 口 画 笔 中 指 定 数 据 源 的 列名 时, 存 储BLOB 数 据 的 列 不 能 被 包 括;
在 数 据 窗 口设 计 时, 选 择 菜 单Ojbect|OLE Database Blob, 然 后 在 设 计 窗 口 上空 点 一 下, 这 时 会 出 现 这 样 的 一 个 屏 幕:
在 这 个 定 义属 性 的 窗 口 中, 大 部 分 的 内 容 与 定 义 其 它 数 据 窗 口 列属 性 的 窗 口 大 致 相 当, 只 有 这 个definition 项 与 其 它 列 不同, 这 里 特 别 说 明 一 下:
上 面 几 项 内容 的 填 写 较 易 理 解, 事 实 上 只 要 保 留 其 缺 省 值 就 可 以了。
Key Clause: 这 一项 的 内 容 是PowerBuilder 用 以 确 定 在select 和update 语 句 中 如 何使 用WHERE 子 句 的。 一 般 我 们 使 用 这 一 个 表 的 主 键 就 可以 了。 在 这 个 例 子 里, 就 相 当 于where 子 句 是"... where id =: id"。 请 注 意 理 解 这 两 个“id” 不 同 的 含 义 和 各 自 的指 代。
File Template: 用以 指 定 您 所 希 望 的 这 个OLE 对 象 使 用 的 公 共 模 板。 在 本列 中, 我 们 保 留 其 为 空。 但 是 如 果 您 存 储 的 是word 文件, 您 就 应 当 指 定 一 个DOC 文 件, 或 者 是normal.dot 文 件 等。
OLE Class: Description (Only Class is used) : 如 果 您 没 有 使 用 文 件 模 板, 您 就应 当 在 这 里 指 定 一 个 应 用 类, 本 例 中 我 们 使 用PaintBrush。如 果 您 打 算 使 用 的 应 用 类 并 没 有 包 括 在 这 个 下 拉 式列 表 框 中, 您 就 应 当 在Windows 的 注 册 文 件 中 加 入: 在Windows3.1 中 您 应 当 修 改win.ini 文 件, 而 在Windows95 和Windows NT 中 您 应 当调 用REGEDIT 应 用 程 序。
Client Name Expression: 这 个 表 达 式 是 用 以 得 到blob 列 中 每 行 的 不 同 值。这 可 以 使OLE 对 不 同 的blob 行 引 用 不 同 的 对 象。
完 成 了 数 据窗 口 的 设 计 后, 您 可 以 在 其 设 计 预 览 方 式 下 测 试 这 个OLE 列。 只 要 在 这 个 对 象 上 双 击,PowerBuilder 就 会 自 动 启 动 服务 器 应 用, 进 入 一 个 新 文 件 的 编 辑 和 一 个 模 板 拷 贝 的编 辑, 这 当 然 要 根 据 您 设 定 的 是 对 象 类 还 是 文 件 模板。 为 了 使 这 个OLE 列 更 醒 目, 您 可 以 在 其 背 后 加 入 一幅 图, 或 加 上 边 框。
当 您 确 实 地在 这 一 列 中 存 储 了 数 据, 在 这 一 列 的 位 置 上 就 会 出 现一 个 与 您 所 使 用 的OLE 服 务 器 应 用 相 对 应 的 图 标。
对OLE 列 的 更新
OLE 列 只 能 够 在 数 据 窗 口 中 得 以更 新。OLE 对 象 存 储 在OLE 对 象 容 器(container) 之 中, 并 为OLE 服务 器 提 供 信 息 和 它 们 的 类 名。 当 其 中 的 内 容 更 新 时,这 个 容 器 必 须 保 留。 这 个 功 能 是 设 计 在 数 据 窗 口 和OLE 列 对 象 之 内 的, 可 是 如 果 您 打 算 在 数 据 窗 口 之 外 更 新这 个Blob 对 象, 您 就 将 破 坏 这 个 容 器。
使 用OLEActivate 函 数
如 果 您 打 算 使 用 程 序 激 活 一 个OLE 列, 而 不 是 等 用 户 双 击 这 个 列, 您 就 可 以 使 用OLEActivate 函 数。 这 个 函 数 的 语 法 为:
datawindowcontrol.OLEActivate ( row, column, verb )
此 外 您 打 算以 非 零 的“verb” 值 激 活OLE 列, 也 需 要 用 到 这 个 函 数。 关于“verb” 值 的 定 义, 是 根 据 不 同 的OLE 服 务 器 而 定 的, 您必 须 查 询 所 使 用 的OLE 服 务 器 文 档。 使 用windows95 的 用 户 可以 用REGEDIT 查 询 注 册 窗 口 的 数 据 库。 键 入REGEDIT /V 可 以 看到 整 个 注 册 窗 口 的 树 型 列 表。
例 如 我 们 有一 个 名 为dw_sound 的 数 据 窗 口, 其 中 有 一 个OLE 列 为“sound_blob” 包 含 的 是.wav 文 件, 我 们 希 望 使 用 微 软 的Quick Recorder 作 为OLE 服 务 器, 我 们 可 以 这 样 调 用 这 个 函 数
dw_sound.OLEActivate(5, "sound_blob", 1)
在Quick Recorder 中“verb” 值 为1 表 示 编辑。
又 如:
dw_sound.OLEActivate(2, 4, 0)
表 示 激 活OLE 服 务 器 调 用 数 据 窗 口 中 第 二 行 第 四 列 的 数 据,“verb” 为0 表 示 演 奏 这 个.wav 文 件。
使 用Sybase 用 户应 注 意 的 问 题:
Sybase 对 于OLE 列的 控 制 同 其 它 数 据 库 比 有 一 些 小 小 的 限 制, 这 体 现 在Sybase 的text 数 据 类 型 上。 由 于Sybase 的 字 符 串 函 数 的 作 用, 作为blob 字 段 的text 数 据 类 型 最 大 只 能 到4K。
三、不 使 用OLE 方 式 对Blob 进 行 操 作:
在PowerScript 中提 供 给 您 许 多 不 使 用OLE 而 处 理 大 型 二 进 制 大 型 的 方法。 例 如 下 例 将 数 据 读 入Blob 列:
/* 本 段 代 码将 读 取 一 个 超 过32766 字 节 的 文 件, 这 个 代 码 可 以 用 以读 取Text 文 本 和Bitmap 图 象。*/

SetPointer(HOURGLASS!)
int li_filenum, li_loops, li_counter long ll_filelen, ll_ll_bytes_read, ll_new_pos
blob lb_ourblob, lb_tot_b
ll_filelen = FileLength(sle_filename.text)
// 获 取 文 件 的 大 小
li_filenum = FileOpen(sle_filename.text,STREAMMODE!,
READ!,LOCKREAD!)
// 指 定 该 文 件 为 只 读,li_filenum 为 这 个 文 件 的 句 柄
IF ll_filelen > 32766 THEN
li_loops = ((ll_filelen-1)/32766) + 1
ELSE
li_loops = 1
END IF
/*FileRead() 函 数 不 支 持 读 取 大 于32K 的 文 本,
计 算 将 使 用 FileRead 函 数 的 次 数*/
// 读 文 件...
FOR li_counter = 1 to li_loops
ll_bytes_read = FileRead(li_filenum,lb_our_blob )
lb_tot_b = lb_tot_b + lb_our_blob
ll_new_pos = ll_new_pos + ll_bytes_read
FileSeek(li_filenum,ll_new_pos,FROMBEGINNING!)
NEXT
FileClose(li_filenum)
// 现 在lb_tot_b 已 包 括 了 文 件 的 内 容, 如 果 这 个 文 件 是 位 图 文 件, 可对 其 使 用SetPicture 函 数, 如 果 是 文 本 文 件, 可 使 用string() 函 数 将 其 转 成text 文 件。
SetPicture(p_my_picture, lb_tot_b)
现 在 您 已 有了 一 个 存 在blob 变 量 中 的BLOB 数 据, 您 可 以 将 其 写 入 数 据库 中。 如 果 您 不 打 算 使 用OLE, 您 可 以 使 用 在PowerScript 中使 用SELECTBLOB,UPDATEBLOB 语 句。 同 时, 必 须 满 足 以 下 条 件:
1. 您 必 须 在数 据 库 中 定 义 有 与blob 数 据 类 型 相 等 的 数 据 类 型( 如 在Watcom 中 的Long Varchar 和Long Binary, 在SQL Server 中 的Image, 在Oracle 中 的long raw 等)。
2. 每 一 个 定 义 有blob 字 段 的 表 必须 有 主 键。
3. blob 列 必 须 允 许 为 空。
4. 您 打 算 写 入blob 数 据 的 这 一 条记 录 必 须 已 经 输 入 数 据, 也 就 是 说 您 只 能 使 用UPDATE 的方 式 写 入blob 数 据。
5. SQL SERVER 的 用 户 必 须 在 使 用BLOB 功能 前 将AUTOCOMMIT 设 置 为TRUE, 在BLOB 功 能 结 束 后 可 再 恢 复 回FALSE 状 态。 可 是 有 关BLOB 的 功 能 却 不 能 同 其 它 操 作 在 同 一 个事 物 之 中。
例 如 我 们 在Watcom 数 据 库 中 有 一 个 称 作blob_table 的 表 其 中 有 两 个 字 段 分 别为blob_id, 整 型, 主 键;blob_col 数 据 类 型 为long binary 并 且 将 其设 置 为 允 许 为 空。 在 我 们 将blob 写 入 数 据 库 之 前, 我 们必 须 将 主 键 的 值 写 入 数 据 库。 我 们 在 表 中 加 入 一 个 新记 录,blob_id 的 值 为373, 而blob_col 设 置 为NULL。 然 后 我 们 执 行下 面 的 代 码:

UPDATEBLOB blob_table SET blob_col = :lb_tot_b
WHERE blob_id = 373 USING SQLCA;
IF sqlca.sqlcode <> 0 then
messagebox("UPDATEBLOB 失 败", sqlca.sqlerrtext)
END IF
与UPDATEBLOB 相 对应 的 是SELECTBLOB, 使 用SELECTBLOB 同 使 用SELECT INTO 语 句 基 本 相同, 只 是 这 时 我 们 操 纵 的 是BLOB 数 据 类 型 而 已。 例 如:

blob lb_blob_var
SELECTBLOB blob_col INTO :lb_blob_var FROM
boyliulang 2003-03-05
  • 打赏
  • 举报
回复
1\用 ole
2\读取后,用setpicture试试。

在PB中用OLE存取blob类型数据
 

前言:

在数据库的开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样-如有可能是语音文件、视频文件、图片文件、文本文件等,怎样在PB中实现这些格式不同的备注文件的存取及预览,一直是PB开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法。

  对备注二进制信息的存储可以采用以下三种方式;
  方法一:文件保存在固定的路径下,数据库中存取文件路径和名称

  方法二:数据库中用blob类型或者varbinary类型字段存储备注文件

  方法三:在本地用OLE存储结构存储备注文件

1、OLE的基本概念

OLE是Object Linking Embedding(对象链结与嵌入)的缩写,它可以使windows应用程序共享数据和程序。

2、OLE控件

  在PB中OLE控件是一个OLE对象的包容器,可以使用服务器应用程序提供的功能和命令来编辑对象,也可以使用自动化OLE交互,在程序中激活对象和向服务器应用程序发送命令;在PB 的window画板中的OLE控件允许用户从多个应用程序嵌入和链结组件

  2.1建立和设置OLE控件

  从window画板中选择OLE控件插入window。

  当建立一个OLE控件并且插入一个对象时,PB将激活服务器应用程序以允许对对象进行编辑和修改;在使OLE中的对象称为非活动状态后,可以使用控件属性选项卡来设置控件的属性。

  2.2 激活修改window画板中的OLE对象

  在OLE控件的弹出菜单中选择open可以激活画板中OLE对象

  使用服务器应用程序修改OLE对象

  结束修改:使对象恢复为非活动状态,只要单击服务器应用对象之外的任何区域即可,也可以直接关闭服务器应用程序的窗口。

  2.3 嵌入和链结OLE控件

  可以将OLE对象嵌入或者链结到自己的应用程序中。嵌入对象的数据放在应用程序中,在开发过程中这些数据放在应用程序的PBl库中,当生成应用后,这些数据将存放在exe或PBd文件中,虽然在程序的运行过程中可以修改,但修改的数据不会保存;链结对象的数据存放在PB应用程序以外,当链结一个对象时,在PB应用程序中不存放数据文件,而是存放引用数据的指针, 使用链结的数据,对数据的管理和保存都由服务器应用程序负责。这样可以用服务器应用程序修改处理数据,处理后的数据可以保存回原文件中。链结方式应用于需要多个应用程序共享的数据文件,任何一个应用程序修改了数据文件,都将影响到所有链结该文件的应用程序。

  2.4 OLE控件的激活方式

  OLE控件的激活方式有offsite和in-place两种激活方式,offsite激活方式是指在PB应用程序的界面以外单独打开OLE对象,in-place激活方式是指PB应用程序的界面的原位置打开OLE对象。在数据窗口中的dbOLE默认的是offsite激活方式,而window中的OLE默认的激活方式是in-place。

  在PB应用程序中可以用命令

  OLE_control.active(offsite) 或者OLE_control.active(in-place)设置OLE对象的以何种方式打开。

  2.5 设置和插入OLE对象

  在程序运行时可以用函数:

  OLE_control.insertfile(soucefile) 插入对象

  OLE_control.objectdata = blobvar 设置对象

3、OLE存储

  3.1 OLE存储(OLEstorage)的概念

  OLE存储(OLEstorage)是OLE数据的一个仓库,存储就象磁盘上的目录结构,它可以是一个OLE对象,也可以包含在OLE对象中,每个对象都包含在OLE存储或者存储内的子存储内。保存在OLE存储中数据称作OLE流(OLE stream),OLE流同OLE对象的关系就象文件同目录的关系。含有OLE对象的存储或子存储可以看做是属于特殊服务器的信息,在该层次之下的各部分都可以被相应的服务器程序操作。OLE存储对象是类用户对象,可以说明相应类型的变量,建立与之相应的实例和打开存储等,在使用完存储后需要关闭存储、释放分配的内存。

  3.2 OLE存储的打开和保存

  OLE存储可以用open函数打开,open函数的格式为:

  Olecontrol.Open(OLEsourcefile),

  此函数在OLEsourcefile不存在时,自动创建该文件,所以创建OLE文件也用该函数; OLE存储可以用save函数保存,save函数的格式为:

  OLEcontrol.save() // 保存OLE控件

  OLEstorage.save() //保存OLE存储

4、处理blob类型数据

   对于大二进制数据,在PB Script中是用blob数据类型表示并加以处理。标准SQL语句中的select、insert和update语句无法直接查询blob类型的数据,在PB中操作blob类型的数据只能用专用的语句,从数据库中查询blob类型的数据的命令是:

   selectblob restofselectstatement {using transactionobject};

   更新数据库中blob类型数据的格式是:

   updateblob tablename

   set blobcolumn = blobvarible  

   restofupatestatement {using transctionobject};

   如连接的数据库是sybase或者Sql,则selectblob和updateblob语句要求数据库的自动提交方式为true,所以在在每次调用selectblob和updateblob语句以前必须用命令 Sqlca.autocommit=true,把数据库的自动提交方式设置为true,在updateblob语句的结束后,再用命令Sqlca.autocommit = false,把自动提交方式设置为false。 索数据的参数(如flag),然后在可修改列的Protect后的框中输入(user_name是该DataWindow中的一列,代表输入者的名称):

5、数据窗口的blob列

  5.1 数据窗口blob列的功能

  在PB 的datawindow画板中DBOLE控件允许用户利用这个控件浏览和操作数据库中的大二进制数据,即通过DBOLE控件可以作如下操作:

  往数据库中存储大二进制数据,如:excel工作表、word文档、视频文件、图片文件等各种格式的文件;

  ● 从数据库中检索数据到datawindow对象; 

  ● 使用OLE服务器程序察看修改数据; 

  ● 将修改后的数据保存回数据库;

  5.2 在数据窗口中添加blob列的的步骤

  1) 选择具有二进制字段的数据表作为数据源建立一新的数据窗口(该窗口可以至少需要包含非数据库表的标识列)

  2) 选择insert -control-OLE database blob 菜单,在数据窗口的detail节中要插入blob列的位置单击鼠标,这时将显示如图1所示的对话框

  下面解释这些属性的具体含义

  1) client class: 客户类名,默认为datawindow

  2) client name:客户名,默认为untitled

  3) table: 选择含有blob列的数据库表,所选表的字段将出现在右侧的large binary/text column列表框中。

  4) large binary/text column:选择一个blob类型的字段列

  5) key clause:检索和更新blob数据的关键字表达式其中使用带冒号前缀的变量指出是数据窗口对象的列,如 表达式 id=:id,id是数据库表中的列,变量指出数据窗口对象的列

  6) filetemplate :如果需要OLE应用服务器每次打开相同的文件,则在filetemplate框中输入文件名。

  7) OLE class :如果不需要OLE应用服务器每次打开相同的文件,则在OLE class框中选择一个OLE类,如Pbrush。

  8) Client name expression:显示在OLE服务器应用程序窗口标题的文字,可以输入为:"对应记录的id号是"+id

  单击ok按钮关闭对话框,将dbole列添加到适当的位置,保存数据窗口。 预览则可以对数据库中的blob数据进行存取,但是在新建的记录中只能存取OLE class框中选择的一种格式的blob数据,不能存储多种格式的数据;但如果数据库中存有多种格式的数据,可以预览各种格式的数据。

6、源程序建立

  1) 首先在数据库中建立如下结构的表blobsave:

  字段名称数据类型备注

  idchar(4)primairy key index

  s_pathchar(50)

  pic binary (50)

  2) 在PB建立PBl库blobsave.PBl

  3) 在PBl库blobsave.PBl中建立应用blobsave

  在应用的open事件中设置数据库连接程序(本程序中采用的是odbc方式连接数据库,读者可根据自己所建立的数据库的不同选用不同的连接方式,以下连接数据库的代码也有所改动,至于连接不同的数据库的方法,请参考有关资料,本文不做详细介绍):

  SQLCA.DBMS = "ODBC"

  SQLCA.AutoCommit = False

  SQLCA.DBParm = "Connectstring='DSN=blob'"

  connect;

  open(w_main)

  其中命令按钮cb_path的clicked中的代码格式如下:open(w_path)

  其中命令按钮cb_dbblob的clicked中的代码格式如下:open(w_dbblob)

  其中命令按钮cb_OLEblob的clicked中的代码格式如下:open(w_OLEblob)

  4) 建立数据窗口dw_blobsave

  按照上文中建立数据窗口的blob列的方法建立数据窗口dw_blobsave如图所示:

  其中:add,del,save,cancel,,retrieve等分别为数据窗口dw_blobsave的append row,delete row,update,retrieve动作按钮。

  首先创建实例变量 OLEstorage stor1

  然后如图建立窗口w_path,其中数据窗口控件dw_1的rowfocuschanged中的代码如下:

  long row_num

  row_num=dw_1.getrow()

  if row_num >0 then

  ole_1.insertfile(dw_1.object.s_path[row_num])

  end if

  其中数据窗口dw_1的buttonclicked中的代码如下:

  if dwo.name="cbselect" then

  long row_num

  row_num=dw_1.getrow()

  string filepath,filename

  getfileopenname("请选择备注文件",filepath,filename)

  dw_1.object.s_path[row_num]=filepath

  ole_1.insertfile(filepath)

  end if

     保存窗口w_path

     6) 建立
qianfl 2003-03-05
  • 打赏
  • 举报
回复
试试看把图片字段的列的display as pic属性勾上

611

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧