首页> 今日优选> 用VC开发基于ORACLE数据库应用程序的两种方法.net(共6篇)

用VC开发基于ORACLE数据库应用程序的两种方法.net(共6篇)

时间:2025-11-26 14:36:02

“syntax”投稿了6篇用VC开发基于ORACLE数据库应用程序的两种方法.net,以下是小编整理后的用VC开发基于ORACLE数据库应用程序的两种方法.net,希望你喜欢,也可以帮助到您,欢迎分享!

用VC开发基于ORACLE数据库应用程序的两种方法.net

篇1:用VC开发基于ORACLE数据库应用程序的两种方法.net

1. 引 言 ORACLE 公 司 自1979 年 推 出 基 于SQL 标 准的 关 系 数 据 库 产品 到 年 版 本8 的 推 出,ORACLE 数 据 库 以其 支 持 大 数 据 库、多 用 户 的 高 性 能 事 务 处 理, 对 业 界各 项 工 业 标 准 的 支持, 完 整 的 安 全 和 完 整

1. 引 言

ORACLE 公 司 自1979 年 推 出 基 于SQL 标 准的 关 系 数 据 库 产品 到1997 年 版 本8 的 推 出,ORACLE 数 据 库 以其 支 持 大 数 据 库、多 用 户 的 高 性 能 事 务 处 理, 对 业 界各 项 工 业 标 准 的 支持, 完 整 的 安 全 和 完 整 性 控 制,支持 分 布 式 数 据 库 和 分布 处 理, 具 有 可 移 植 性、可 兼 容性 和 可 连 接 性 等 突 出 优点 倍 受 用 户 喜 爱, 根 据IDG1992 年全 球UNIX 数 据 库 的 市 场 报告,ORACLE 占 市 场 销 售 量 的50%, 而在 客 户 端 的 开 发 工 具 方面,Visual C++ 也 因 其 强 大 的 功 能和 高 度 的 灵 活 性 等 特 点 深 受 广 大 程 序 员 的 喜 爱, 因 此本 文 旨 在 介 绍 使 用Visual C++ 开 发 基 于ORACLE 数 据 库 应 用 程序 的 两 种 方 法。

2. 使 用PRO*C 开 发 数 据 库 应 用

2.1 PRO*C 工 作 原 理

PRO 系 列 是ORACLE 公 司 提 供 的 在 第 三代 高 级 程 序 设 计 语 言 中 嵌 入SQL 语 句 来 访 问 数 据 库 的 一套 预 编 译 程 序, 包 括PRO*Ada、PRO*C、PRO*COBOL、PRO*Fortran、PRO*Pascal 和PRO*PL/I 六 种。 程 序 员 用 相 应 的 高 级 语 言 编 写 嵌 入SQL 语句 的PRO 源 程 序( 若 用C 语 言 则 称 为PRO*C 源 程 序) 后 运 行 相应 的 预 编 译 程 序, 把 嵌 入 的SQL 语 句 转 换 为 标 准 的ORACLE 调 用 并 生 成 目 标 源 程 序, 即 纯 高 级 语 言 格 式 的 源 程序, 然 后 就 可 以 将 这 些 源 程 序 加 入 用 户 的 程 序 中 调用, 其 处 理 过 程 如 下 图。

ORACLE 预 编 译 程 序 提 供 如 下 功 能:

⑴ 能 用 六 种 通 用 的 高 级 程 序 设计 语 言 中 的 任 何 一 种 编 写 应 用 程 序。

⑵ 遵 循ANSI 标 准, 在 高 级 语 言 中嵌 入SQL 语 句。

⑶ 可 采 用 动 态SQL 方 法, 让 程 序 在运 行 时 接 受 或 构 造 一 个 有 效 的SQL 语 句。

⑷ 实 现ORACLE 内 部 数 据 类 型 和 高 级语 言 数 据 类 型 之 间 的 自 动 转 换。

⑸ 可 通 过 在 应 用 程 序 中 嵌 入PL/SQL 事 物 处 理 块 来 改进 性 能。

⑹ 能 在 程 序 行 和 命 令 行 上 指 定所 需 要 的 预 编 译 可 选 项, 并 可 在 预 编 译 的 过 程 中 改 变它 们 的 值。

⑺ 能 全 面 检 查 嵌 入 的SQL 数 据 操纵 语 句 和PL/SQL 块 的 文 法 和 语 义。

⑻ 可 用SQL*Net 并 行 存 取 多 个 地 点的ORACLE 数 据 库。

⑼ 可 把 数 组 作 为 输 入 和 输 出 程序 变 量 使 用。

⑽ 能 对 应 用 程 序 中 的 代 码 段 进行 条 件 预 编 译。

⑾ 提 供 了 较 强 的 异 常 处 理 功能。

由 此 可 见, 通 过 预 编 译 程 序 与其 它 高 级 语 言 的 结 合, 既 可 以 利 用SQL 强 有 力 的 功 能 和灵 活 性 为 数 据 库 应 用 系 统 的 开 发 提 供 强 有 力 的 手 段,又 可 以 充 分 利 用 高 级 语 言 自 身 在 系 统 开 发 方 面 的 优势, 从 而 提 供 一 个 完 备 的 基 于ORACLE 数 据 库 应 用 程 序 的开 发 解 决 方 案。

2.2 在VC 中 使 用PRO*C

每 个PRO*C 源 文 件 一 般 由 程 序 头 和程 序 体 两 部 分 组 成。程 序 头 包 含 宿 主 变 量(SQL 语 句 中所 包 含 的 变 量) 说 明、通 讯 区 定 义 和C 外 部 表 示 符 的 说明 等。 程 序 体 一 般 是 由 若 干 函 数 组 成, 这 些 函 数 内 含有SQL 语 句( 以EXEC SQL 起 头 的 语 句)。

PRO*C 支 持 的 数 据 类 型 包 括VARCHAR2( 变 长 字 符 串)、NUMBER( 二 进 制 数)、INTGER( 有 符 号 整数)、FLOAT( 浮 点 数)、STRING( 以NULL 结 尾 的 字 符 串)、VARNUM( 变 长 二 进 制 数)、LONG( 变 长 字 符 串)、VARCHAR( 变 长 字 符 串)、ROWID( 二 进 制 值)、DATE( 定长 日 期/ 时 间 值)、VARRAW( 变 长 二 进 制 数 据)、RAW( 定 长 二 进制 数 据) 、LONGRAW( 变 长 二 进 制 数 据)、UNSIGNED( 无 符 号 整 数)、ONGVARCHAR( 变 长 字 符 串)、LONGVARRAW( 变 长 二 进 制 数 据)、CHAR( 定 长 字 符串)、CHARZ(C 中 定 长 以NULL 结 尾 的 字 符 串)、MLSLABEL( 变 长 二 进制 数 据)。

在PRO*C 中 不 能 使 用'l' 或'u' 作 词 尾或'0x' 作 词 头 修 饰 常 量; 在SQL 语 句 中 使 用 单 引 号 来 定 义字 符 串, 用 双 引 号 来 定 义 特 殊 的 或 小 写 字 符 的 标 识 符( 如 表 名 等);SQL 语 句 中 不 允 许 使 用C 中 的 寻 址、间 接、位逻 辑、复 合 赋 值、?=、-、++、%、<<、>>操 作 符 并 且 用NOT、AND、OR、= 代 替!、&&、||、==。

下 面 的 程 序 是 一 个 联 结 数 据 库的PRO*C 源 程 序 例 子。

#include // 声 明SQL 通 讯 区

#include

#include

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR username[20]; // 声 明 宿 主 变 量

VARCHAR password[20];

VARCHAR dbname[20];

EXEC SQL END DECLARE SECTION;

void db_connect

{

strcpy((char *)username.arr,“SCOTT”);

username.len = strlen((char *)username.arr);

strcpy((char *)password.arr,“TIGER”);

password.len = strlen((char *)password.arr);

strcpy((char *)dbname.arr,“SUNDB”);

dbname.len = strlen((char *)dbname.arr);

EXEC SQL WHENEVER SQLERROR STOP;

// 隐 式 异 常 处 理

EXEC SQL CONNECT :

username IDENTIFIED BY :password USING :dbname;

/*if (sqlca.sqlcode != 0)

// 显 式 异 常 处 理

{

AfxMessageBox(“n 与 Oracle 数 据 库 连 接 失 败!”);

return;

}*/

}

在VC 中 使 用PRO*C 时, 先 用PRO*C 编 写所 需 的 操 作 数 据 库 的 子 程 序, 再 运 行PRO*C 预 编 译 程 序把PRO*C 源 程 序 转 成 相应 的CPP 源 程 序, 将 该 程 序 插 入 到 用户 工 程 文 件 中 并 在 需 要 对 插 入 函 数 进 行 调 用 的 模 块中 说 明 函 数, 然 后 就 可以 在 此 模 块 中 调 用 所 需 的 函数,

3. 使 用ODBC 中 间 件 访 问 数 据 库

3.1 ODBC 工 作 原 理

ODBC 是Open Database Connect 即 开 放 数 据 库互 连 的 简 称, 它 是 由Microsoft 公 司 于1991 年 提 出 的 一 个 用于 访 问 数 据 库 的 统 一 界 面 标 准, 是 应 用 程 序 和 数 据 库系 统 之 间 的 中 间 件。 它 通 过 使 用 相 应 应 用平台 上 和 所需 数 据 库 对 应的 驱 动 程 序 与 应 用 程 序 的 交 互 来 实 现对 数 据 库 的 操 作,避 免 了 在 应 用 程 序 中 直 接 调 用 与 数据 库 相 关 的 操 作,从 而 提 供 了 数 据 库 的 独 立 性。

ODBC 主 要 由 驱 动 程 序 和 驱 动 程 序管 理 器 组 成。 驱 动 程 序 是 一 个 用 以 支 持ODBC 函 数 调 用 的模 块( 在WIN95 下 通常 是 一 个DLL), 每 个 驱 动 程 序 对 应 于相 应 的 数 据 库, 当应 用 程 序 从 基 于 一 个 数 据 库 系 统 移植 到 另 一 个 时, 只 需 更 改 应 用 程 序 中 由ODBC 管 理 程 序 设定 的 与 相 应 数 据 库 系 统 对 应 的 别 名 即 可。 驱 动 程 序 管理 器( 包 含 在ODBC32.DLL 中) 可 链 接 到 所 有ODBC 应 用 程 序 中,它 负 责 管 理应 用 程 序 中ODBC 函 数 与DLL 中 函 数 的 绑 定。

ODBC 使 用 层 次 的 方 法 来 管 理 数 据库, 在 数 据 库 通 信 结 构 的 每 一 层, 对 可 能 出 现 依 赖 数据 库 产 品 自 身 特 性的 地 方,ODBC 都 引 入 一 个 公 共 接 口 以解 决 潜 在 的 不 一 致性, 从 而 很 好 地 解 决 了 基 于 数 据 库系 统 应 用 程 序 的 相 对 独 立 性, 这 也 是ODBC 一 经 推 出 就 获得 巨 大 成 功 的 重 要 原 因 之 一。

从 结 构 上 分,ODBC 分 为 单 束 式 和多 束 式 两 类。

⑴ 单 束 式 驱 动 程 序

单 束 式 驱 动 程 序 介 于 应 用 程 序和 数 据 库 之 间, 像 中 介 驱 动 程 序 一 样 数 据 提 供 一 个 统一 的 数 据 访 问 方 式。

当 用 户 进 行 数 据 库 操 作 时, 应用 程 序 传 递 一 个ODBC 函 数 调 用 给ODBC 驱 动 程 序 管 理 器, 由ODBC API 判 断 该 调 用 是 由 它 直 接 处 理 并 将 结 果 返 回 还 是 送交 驱 动 程 序 执 行 并将 结 果 返 回。

由 上 可 见, 单 束 式 驱 动 程 序 本身 是 一 个 数 据 库 引 擎, 由 它 直 接 可 完 成 对 数 据 库 的 操作, 尽 管 该 数 据 库 可 能 位 于 网 络 的 任 何 地 方。

多 束 式 驱 动 程 序

多 束 式 驱 动 程 序 负 责 在 数 据 库引 擎 和 客 户 应 用 程 序 之 间 传 送 命 令 和 数 据, 它 本 身 并不 执 行 数 据 处 理 操 作 而 用 于 远 程 操 作 的 网 络 通 信 协议 的 一 个 界 面。

前 端 应 用 程 序 提 出 对 数 据 库 处理 的 请 求, 该 请 求 转给ODBC 驱 动 程 序 管 理 器, 驱 动 程 序管 理 器 依 据 请 求 的 情 况, 就 地 完 成 或 传 给 多 束 驱 动 程序, 多 束 式 驱 动 程 序 将 请 求 翻 译 为 特 定 厂 家 的 数 据 库通 信 接 口( 如Oracle 的SQLNet) 所 能 理 解 的 形 式 并 交 于 接 口去 处 理, 接 口 把 请 求 经 网 络 传 送 给 服 务 器 上 的 数 据 引擎, 服 务 器 处 理 完 后 把 结 果 发 回 给 数 据 库 通 信 接 口,数 据 库 接 口 将 结 果 传 给 多 束 式ODBC 驱 动 程 序, 再 由 驱 动程 序 将 结 果 传 给 应 用 程 序。

3.2 在VC 中 使 用ODBC

Visual C++ 中 提 供 了CDatabase、CRecordset、CRecordView、CDBException 和CFieldExchange 五 个 类, 这 些 类 封 装 了ODBC SDK 函 数, 从 而 使用 户 可 以 无 需 了 解SDK 函 数 就 可 以 很 方 便 地 操 作 支 持ODBC 的 数 据 库。

CDatabase 类: 封 装 了 与 数 据 库 建 立连 接, 控 制 事 务 的 提 交 和 回 滚 及 执 行SQL 语 句 的 方 法。

CRecordset 类: 封 装 了 大 部 分 操 纵 数据 库 的 方 法, 包 括 浏 览、修 改 记 录, 控 制 游 标 移 动,排 序 等 操 作。

CRecordView 类: 提 供 了 与recordset 对 象相 连 接 的 视, 可 以 建 立 视 中 的 控 件 与 数 据 库 数 据 的 对应, 同 时 支 持 移 动 游 标, 修 改 记 录 等 操 作。

CDBException 类: 提 供 了 对 数 据 库 操作 的 异 常 处 理, 可以 获 得 操 作 异 常 的 相 关 返 回 代 码。

CFieldExchange 类: 提 供 了 用 户 变 量 与数 据 库 字 段 之 间 的 数 据 交 换, 如 果 不 需 要 使 用 自 定 义类 型, 你 将 不 用 直 接 调 用 该 类 的 函 数,MFC Wizard 将 自 动为 程 序 员 建 立 连 接。

4. 两 种 方 法 的 比 较

综 上 所 述, 使 用 这 两 种 方 法 在Visual C++ 中 都 可 以 很 方 便 地 开 发 出 基 于ORACLE 数 据 库 的 应 用 程序, 同 时, 这 两 种 方 法 又 各 有 其 优 缺 点。ODBC 由 于 有MFC 强 大 的 类 库 支 持 而 使 得 编 程 实 现 非 常 方 便, 同 时 可 移植 性 也 很 强, 在 异 构的 数 据 库 之 间 移 植 也 只 需 更 改 很少 的 一 部 分 程 序, 但 是, 由ODBC 的 实 现 机 制 我 们 可 以 看到, 与PRO*C 相 比, 应 用 程 序 需 要 经 过ODBC 驱 动 程 序 管 理 器和ODBC 驱 动 程 序 两 层 才 能 和 数 据 库 通 信 接 口 建 立 联 系,而PRO*C 是 直 接 与 通 信 接 口 联 系, 因 此 建 立 在ODBC 上 应 用程 序 的 执 行 效 率 会 相 对 低 一 些。PRO*C 具 有 执 行 效 率 高,支 持 嵌 入 式PL/SQL 块 等ORACLE 自 身 特有 的 优 点, 但 正 因 为 有了 这 些 优 点, 使 得 用PRO*C 开 发 出 的 应 用 程 序 无 法 向 异构 数 据 库平台 移 植。

原文转自:www.ltesting.net

篇2:用VC实现竖写汉字的方法.net

中国人自古就有自右至左、从上到下书写汉字的习惯,而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。 有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用VC实现竖写汉字效果的方法,现在就把它介绍给大

中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用VC实现竖写汉字效果的方法,现在就把它介绍给大家。

Windows系统内置了许多名称以“@”开头的字集,这些字集有一个共同的特点,即其所包含的文字全都是平躺着的(字头朝左,字底朝右)。如果我们能将这些字逆时针旋转270度后再显示出来,就可以达到实现竖写汉字效果的目的了。

要使文字发生旋转,我们只需创建一个逻辑字体并设定该逻辑字体的显示角度,再设定其字体名称为一个以“@”开头的字集的名称即可。我们可以采用两种方式创建逻辑字体。

其一,用CFont类的成员函数CreateFont直接创建逻辑字体。CreateFont的参数定义如下:

BOOL CreateFont(

int nHeight,           //字体的高度

int nWidth,            //字体的宽度

int nEscapement,       //字体显示的角度

int nOrientation,      //字体的角度

int nWeight,           //字体的磅数

BYTE bItalic,          //斜体字体

BYTE bUnderline,       //带下划线的字体

BYTE cStrikeOut,       //带删除线的字体

BYTE nCharSet,         //所需的字符集

BYTE nOutPrecision,    //输出的精度

BYTE nClipPrecision,   //裁减的精度

BYTE nQuality,         //逻辑字体与输出设备的实际

//字体之间的精度

BYTE nPitchAndFamily,  //字体间距和字体集

LPCTSTR lpszFacename   //字体名称

);

其中nEscapement单位为0.1角度,方向为逆时针,所以为了使平躺的字立起来应设定其值为2700,lpszFacename则赋以“@”开头的字集的名称,如“@system”。

其二,利用LOGFONT结构,将该结构作为参数调用CFont类的成员函数CreateFontIndirect创建逻辑字体。LOGFONT结构通常被用来描述一种逻辑字体,结构内的各变量分别代表逻辑字体的各个属性,这些变量与函数CreateFont的参数相同。其结构如下:

typedef struct tagLOGFONT { // lf

LONG lfHeight;         //字体的高度

LONG lfWidth;          //字体的宽度

LONG lfEscapement;     //字体显示的角度

LONG lfOrientation;    //字体的角度

LONG lfWeight;         //字体的磅数

BYTE lfItalic;         //斜体字体

BYTE lfUnderline;      //带下划线的字体

BYTE lfStrikeOut;      //带删除线的字体

BYTE lfCharSet;        //所需的字符集

BYTE lfOutPrecision;   //输出的精度

BYTE lfClipPrecision;  //裁减的精度

BYTE lfQuality;        //逻辑字体与输出设备的

//实际字体之间的精度

BYTE lfPitchAndFamily; //字体间距和字体集

TCHAR lfFaceName[LF_FACESIZE]; //字体名称

} LOGFONT;

下面我们就以一个示例来说明竖写汉字的实现方法:

1.建立一个MFC AppWizard(exe)应用工程CHNfont。在MFC AppWizard向导的第一步中选择Single Document,再点击按键Finish->OK完成工程的建立。

2.在CMainFrame.:OnCreate函数中添加如下代码,使窗体最大化。AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);

3.添加如下代码实现竖写功能。

voidCChildView::OnPaint()

{

CPaintDC dc(this);// device context for painting

/////// 利用CFont::CreateFont(...)函数实现竖写汉字////////

CFont myFont;     //创建字体对象

//创建逻辑字体

myFont.CreateFont(

56,        //字体高度(旋转后的字体宽度)=56

20,        //字体宽度(旋转后的字体高度)=20

2700,      //字体显示角度=270°

0,                  //nOrientation=0

10,                 //字体磅数=10

FALSE,              //非斜体

FALSE,              //无下划线

FALSE,      //无删除线

DEFAULT_CHARSET,    //使用缺省字符集

OUT_DEFAULT_PRECIS, //缺省输出精度

CLIP_DEFAULT_PRECIS,//缺省裁减精度

DEFAULT_QUALITY,    //nQuality=缺省值

DEFAULT_PITCH,      //nPitchAndFamily=缺省值

“@system”);         //字体名=@system

CFont *pOldFont=dc.SelectObject(&myFont);//选入设备描述表

CRect rtClient;

GetClientRect(rtClient);   //获取客户区尺寸、位置信息

//在客户区适当位置输出文字

dc.TextOut(rtClient.Width()/2+30,rtClient.Height()/8,

“无边落木萧萧下”);

dc.SelectObject(pOldFont); //将myFont从设备环境中分离

myFont.DeleteObject();     //删除myFont对象

/////////// 利用LOGFONT结构实现竖写汉字//////////////

LOGFONT lf;                     //定义字体结构

lf.lfWeight=10;                 //字体磅数=10

lf.lfHeight=56;     //字体高度(旋转后的字体宽度)=56

lf.lfWidth=20;                  //字体宽度(旋转后的字体高度)=20

lf.lfUnderline=FALSE;           //无下划线

lf.lfStrikeOut=FALSE;           //无删除线

lf.lfItalic=FALSE;              //非斜体

lf.lfEscapement=2700;           //字体显示角度=270°

lf.lfCharSet=DEFAULT_CHARSET;   //使用缺省字符集

strcpy(lf.lfFaceName,“@system”); //字体名=@system

CFont myLogFont;                   //定义字体对象

myLogFont.CreateFontIndirect(&lf); //创建逻辑字体

pOldFont=dc.SelectObject(&myLogFont);//选入设备描述表

//在客户区适当位置输出文字

dc.TextOut(rtClient.Width()/2-30,rtClient.Height()/8,

“不尽长江滚滚来”);

dc.SelectObject(pOldFont); //将myFont从设备环境中分离

myLogFont.DeleteObject();  //删除myLogFont对象

}

4.编译连接,运行,

以上实例在Windows98下,以VC++6.0编译通过。

原文转自:www.ltesting.net

篇3:用VC列表显示所有网上邻居.net

网上邻居的查找在www.codeguru.com上有例子,只是它把它做成了类,本是好事,但对大家理解它的原理增加了难度,所以现在把它实现在一对话框中,以便大家能一目了然, #include wi .net wk.h #pragma comment(lib, “mpr.lib”) BOOL CNetEnum2Dlg::Enumerate

网上邻居的查找在www.codeguru.com上有例子,只是它把它做成了类,本是好事,但对大家理解它的原理增加了难度,所以现在把它实现在一对话框中,以便大家能一目了然。

#include .netwk.h>

#pragma comment(lib, “mpr.lib”)

BOOL CNetEnum2Dlg::Enumerate(LPNETRESOURCE lpNetRC_p)

{

HANDLE hEnum = 0;

DWORD dwScope = RESOURCE_GLOBALNET ;

DWORD dwType = RESOURCETYPE_ANY ;

DWORD dwResult = WNetOpenEnum(

dwScope, // scope of enumeration

dwType, // resource types to list

0, // enumerate all resources

lpNetRC_p, // pointer to resource structure (NULL at first time)

&hEnum // handle to resource

) ;

if( dwResult != NO_ERROR )

return FALSE;

DWORD dwBuffer = 16384 ; // 16K is reasonable size

DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries

LPNETRESOURCE lpnrLocal = 0;

BOOL bRet = TRUE;

//try

{

do

{

// first allocate buffer for NETRESOURCE structures ...

lpnrLocal = (LPNETRESOURCE) GlobalAlloc( GPTR, dwBuffer ) ;

dwResult = WNetEnumResource(

hEnum, // resource-handle

&dwEntries,

lpnrLocal,

&dwBuffer

) ;

if( dwResult == NO_ERROR )

{

for( register DWORD i = 0 ; i

{

CString nsname;

nsname = lpnrLocal[i].lpRemoteName;

nsname += “ ”;

nsname +=lpnrLocal[i].lpLocalName;

nsname += “ ”;

nsname +=lpnrLocal[i].lpComment;

m_netList.AddString(nsname); // m_netList defined in NetEnumDlg2.h : CListBox m_netList;

if( RESOURCEUSAGE_CONTAINER ==

(lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER) &&

lpnrLocal[i].dwDisplayType != RESOURCEDISPLAYTYPE_SERVER )

if( !Enumerate( &lpnrLocal[i]) )

{

//TRACE0( “CNetwork::Enumerate: recursiv call failedn” );

//throw CNetworkBreak(FALSE);

return FALSE;

}

}

} else if( dwResult != ERROR_NO_MORE_ITEMS )

{

//AfxMessageBox(“WNetEnumResource”);

return FALSE;

}

} while( dwResult != ERROR_NO_MORE_ITEMS );

}

if( lpnrLocal )

GlobalFree((HGLOBAL) lpnrLocal) ;

WNetCloseEnum(hEnum) ;

return bRet;

}

void CNetEnum2Dlg::OnListWNet()

{

Enumerate(0);

}

原文转自:www.ltesting.net

篇4:PB开发Sybase数据库应用技巧.net

一、PowerBuilder与Sybase SQL Server的连接 ? 若在连接时出现问题,必须要冷静多思考,首先要检查客户端的情况,确认Open Client已经安装,并正确配置。要注意OPen Client必须与PowerBuilder同为32位,或同为16位。 PB与Sybase连不上,常见的几种错误现象

一、PowerBuilder与SybaseSQL Server的连接

?

若在连接时出现问题,必须要冷静多思考。首先要检查客户端的情况,确认Open Client已经安装,并正确配置。要注意OPen Client必须与PowerBuilder同为32位,或同为16位。

PB与Sybase连不上,常见的几种错误现象及处理方法说明如下:

1.已连接上Sybase数据库,但在PB的数据库(database)画板中却看不到用户已经定义过的表。

此时可打开isql或Sybase Advantage,用“sa”登录到“master”数据库,执行pbsyc.sql脚本文件(该文件位于PB安装盘的server目录)即可。值得一提的是,对Sybase Adaptive Server的版本号要加以注意,根据资料对有的相关项进行点改动。

2.在打开PB的项目画板(Project)或库画板(Library)时,出现错误信息提示:“cannot locate source management dll”。

这个问题是因为在安装PB时,选择了安装版本控制软件(如PVCS)的接口,实际上该用户的机器上并未安装相应的版本控制软件。

解决方法: 在PB的设置中,将版本控制软件的接口去掉,具体操作步骤是,可在PB.ini文件中,找到[Library]节,将“SourceVendor= ...”这一行注释去掉。

3.数据库连接正常,但打开用户表时若该表中有汉字则出现乱码。

这个问题通常是由于客户端的缺省字符集设置和服务器端的字符集设置不一致,应修改locales.dat文件(该文件位于Sybase安装目录的locales子目录下)。如果在Windows95/98操作系统下,可修改[NT]节下的相关内容;若操作系统平台是Windows3.x,则修改[win3]节下的内容。在此节有一行文本为locale=default,us_english,is0_1,则说明客户端的缺省字符集设为iso_1。开发中文管理信息系统一般建议将字符集改为cp85o,在服务器端必须要做相应的调整,

?

二、PB编程的几点技巧

?

1.在数据窗口(Datawindow)中实现数据列自动折行。

PB软件在市场上受用户欢迎的原因之一,就是它的数据窗口功能很强,而且方便应用。

在使用Datawindow时,常会遇到某列的数据太长,不能同时显示全部的情况。若采用自动水平滚动,操作起来又不够简便。有一种方法能实现列数据多行显示(自动折行)。

具体步骤如下:

①.在Datawindow Panter中打开此DataWindow,在需设定自动折行的列上双击鼠标,弹开此列的属性窗口。点Position标签,选中Autosize Heigh多选框; 再选择Edit标签, 不选中Auto HorzScroll多选框;单击OK按钮,保存所做的修改。

②.点中Detail Band(即写有Detail的灰色长带),单击鼠标右键,选择Properties...菜单项,选中Autosize Height多选框,单击OK按钮,保存所做的修改。

2.在数据窗口(Datawindow)中用Enter键代替Tab键在字段间移动。

其基本做法是: 选中该数据窗口,定义一用户事件,在弹出的用户事件定义窗口中,将Event ID与pbm_dwnprocessenter 相关联,在该事件的脚本中增加下面两行语句:

Send(Handle(this),256,9 Long(0,0)) (向系统发出处理TAB键的消息)

return 1 (忽略Enter键接下来应进行的缺省处理)

3.选用Grid数据窗口方式时避免表头上方也出现表格线。

用Grid数据窗口方式能够实现表格式报表输出,但是如在表头上方不加以控制或处理,它将出现Detail Band中各数据列的表格线,这是我们所不需要的。

解决问题的参考方法是:

①.可在Header Band中的表头上方增加一文本框,让该文本框足够宽且能覆盖所有的数据列, 同时将垂直长度调整Header Band中的表头上部平齐。

②.在文本框的Properties...窗口中,将该文本框的显示内容清为空,在Font标签页中将字体的背景颜色(Background)设置为与数据窗口的背景色相同,并在Position标签页中将其Layer(层次)修改为Foreound,单击OK按钮,马上就能看出效果。

原文转自:www.ltesting.net

篇5:实现oracle数据库字段自增长(两种方式)

这篇文章主要通过两种方式实现oracle数据库字段自增长,第一种方式是序列+触发器,第二种方式序列+显示调用序列,需要的朋友可以参考下

程序猿都知道mysql等其他的数据库都有随着记录的插入而表ID会自动增长的功能,反而oracle却没有这一功能,下面通过两种方式来解决字段增长的功能,具体内容情况下文,

因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式。

代码如下:

CREATE SEQUENCE 序列名

[INCREMENT BY n]

[START WITH n]

[{MAXVALUE/ MINVALUE n|NOMAXVALUE}]

[{CYCLE|NOCYCLE}]

[{CACHE n|NOCACHE}];

解析:

1)INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。

2)START WITH 定义序列的初始值(即产生的第一个值),默认为1。

3)MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

4)MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。

5)CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。

6)CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

解决方式一、序列+触发器

具体实现方式如下:

第一步,创建sequence

代码如下:

-- Create sequence

create sequence SEQ_T_RECV

minvalue 1

maxvalue 9999999

start with 1

increment by 1

cache 50;

第二步,创建表

代码如下:

-- Create table

create table RECV_MSG

(

id         NUMBER,

messageid  VARCHAR2(32),

contents   VARCHAR2,

app_flg    VARCHAR2(100),

phonenumber VARCHAR2(2000),

updatetime DATE default sysdate

);

第三步,建立触发器

代码如下:

CREATE OR REPLACE TRIGGER “recv_trig”

BEFORE INSERT ON recv_msg

REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW

DECLARE

BEGIN

SELECT SEQ_T_RECV.NEXTVAL INTO :NEW.ID FROM DUAL;

END recv_trig;

第四步,测试并确认

向表中插入一条数据,查看id字段是否自动增长了,

解决方式二、序列+显示调用序列

一、创建sequence

代码如下:

create sequence seq_on_test

increment by 1

start with 1

nomaxvalue

nocycle

nocache;

二、建表

代码如下:

--建表

drop table test;

create table test(

ID integer

,stu_name nvarchar2(4)

,stu_age number

);

三、插入数据(显示调用序列的下一个值插入)

代码如下:

--插入数据

insert into test values(seq_on_test.nextval,‘Mary‘,15);

insert into test values(seq_on_test.nextval,‘Tom‘,16);

四、查看

代码如下:

select * from test;

--结果

/*

1 Mary 15

2 Tom 16

*/

附带:查看序列当前值和下一个值的查看方式

代码如下:

--seq的两个方法

select seq_on_test.currval from dual;

select seq_on_test.nextval from dual;

--结果

/*

2

3

*/

篇6:用VC判断软件使用的操作系统.net

杜建蔚 在 开发 软件时,由于在不同的操作系统中实现技术上的区别,可能某一软件的功能仅局限于单一的操作系统环境,例如Windows98或是WindowsNT,为此,我们需要在用户使用软件时给予相应提示, 我们需要编写一段小程序用于在软件启动时来判断当前软件所运

杜建蔚

在开发软件时,由于在不同的操作系统中实现技术上的区别,可能某一软件的功能仅局限于单一的操作系统环境,例如Windows98或是WindowsNT,为此,我们需要在用户使用软件时给予相应提示。

我们需要编写一段小程序用于在软件启动时来判断当前软件所运行的环境到底是哪个操作系统,并当用户在错误的环境中运行软件时给予报警。本文将详细介绍实现的方法及过

程。

OSVERSIONINFO结构

OSVERSIONINFO结构包含了操作系统的版本信息,包括操作系统的主版本号、副版本号、创建号、以及操作系统平台ID号和关于操作系统的其他描述信息。其定义为:

typedef struct _OSVERSIONINFO{

DWORD dwOSVersionInfoSize;

//指定该数据结构的字节大小

DWORD dwMajorVersion;

//操作系统的主版本号

DWORD dwMinorVersion;

//操作系统的副版本号

DWORD dwBuildNumber;

//操作系统的创建号

DWORD dwPlatformId;

//操作系统ID号

TCHAR szCSDVersion[ 128 ];

//关于操作系统的一些附加信息

} OSVERSIONINFO;

其中dwPlatformId可为以下值:

VER_PLATFORM_WIN32s:标识为Windows 3.1;

VER_PLATFORM_WIN32_WINDOWS:标识为Windows 95或Windows 98;

对于Windows 95操作系统而言,dwMinorVersion值为0,对Windows 98操作系统dwMinorVersion则大于0;

VER_PLATFORM_WIN32_NT:标识为WindowsNT。

程序具体实现步骤

1.使用AppWizard新建一个基于单文档的工程SystemJudge。

2.在工程中添加两个文件,即定义文件judge.h和实现文件judge.cpp。

在judge.h文件中添加如下代码:

#ifndef __JUDGE_H__

#define __ JUDGE _H__

Cstring JudgeOperatingSystem();

//判断操作系统函数定义

#endif

在judge.cpp文件中添加如下代码:

#include “stdafx.h”

#include “judge.h”

Cstring JudgeOperatingSystem()

//判断操作系统函数的实现

{

OSVERSIONINFO OsVersionInfo;

OsVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);

GetVersionEx(&&OsVersionInfo);

if(OsVersionInfo.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS )

{

if(OsVersionInfo.dwMajorVersion>4) return “Windows98”;

else if(OsVersionInfo.dwMajorVersion=4)

{

if(OsVersionInfo.dwMinorVersion>0) return “Windows98”;

else return “Windows95”;

}

else return “Windows3.1”;

}

elseif(OsVersionInfo.dwPlatformId= VER_PLATFORM_WIN32_NT )

{

return “WindowsNT”;

}

else if(OsVersionInfo.dwPlatformId== VER_PLATFORM_WIN32s)

{

return “Windows3.1”;

}

else return “NoName”;

}

3.在CmainFrame类的实现文件MainFrm.cpp中开头添加#include“judge.h”,

并在其OnCreate函数中return语句前加入如下判断代码:

Cstring sOperatingSystem = JudgeOperatingSystem();

if( sOperatingSystem == “Windows98”)

{

//假如本软件需要在WindowsNT下运行

MessageBox(

“本软件在WindowsNT4.0或更高的版本下运行,您的操作系统是Windows98 ”

“请安装WindowsNT4.0以上的版本或使用Windows98版!”,

“警告”,

MB_OK

);

}

else if( sOperatingSystem == “WindowsNT”)

{

//假如软件需要在Windows98下运行,我们可在此添加警告对话框

}

else return -1;

至此,操作系统判断功能已经实现,在软件启动时会自动判断软件当前运行的操作系统并提示用户是否在正确的操作系统环境,从而保证了软件运行的正常性。

本程序在VC++ 6.0,Windows 98下调试通过。

原文转自:www.ltesting.net

相关文章: