PB与各种数据库连接(二)

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: PB与各种数据库连接

一般情况下,方法一能得到较好的运行效率和更完善的功能。因此推荐使用方法一。但是某些类型的存储过程只能使用其他方法。以下重点介绍方法一和方法二。

 两种方法比较起来,有以下几点主要区别:

 1)方法一适用于具有IN、OUT和IN OUT参数的存储过程,而方法二仅支持IN和OUT参数,不支持IN OUT参数;

 2)方法一对参数的数目无限制,方法二最多支持255个参数;

 3)方法一不支持记录(Recorder)的传递,方法二可传递和接收记录。

 方法一操作步骤:

 1)在用户对象画笔中创建一个Class-Standard类型的,从Transaction继承的用户对象。

 2)在此用户对象中,声明Local External

Functions,将存储过程以RPCFUNC关键字声明为外部函数。在Declare Local External

Functions对话框中按Procedures按钮选择要调用的后台存储过程,或直接输入类似subroutine TEST(long

id,ref string name)RPCFUNC ALIAS FOR “DEV TEST”的语句。例如中DEV

TEST的参数为(id IN

NUMBER,name IN OUT VARCHAR2)。

 3)保存该用户对象。

 4)在Application画笔中,进入应用属性对话框,在Variable

Types页,将上Transaction用户对象设置为缺省的全局变量SQLCA。

 5)脚本中,编码调用相应的外部函数。形式:SQLCA 函数名(参数)。如可用“SQLCA

TEST(ln—id,ls—name);”调用例子中定义的DEV TEST存储过程。其中ln—id,ls—name为调用参数。

 方法一注意事项:

 1)由于PB中String类型的数据长度是动态分配的,因此对Ref

String类型的参数,每次调用前需要申请足够的空间。例如上例从输入的id值检索name,后台声明的NAME数据类型为VARCHAR2(30),每次调用SQLCA

TEST前需要用ls—name=SPACE(30)置ls—name为足够长度的空串。

 2)类似地当传递的参数为数组(后台称PL/SQL

Table)时,声明参数为相应类型的动态数组,并在每次调用前设置数组上界为足够大的值。例如:DEV用户的DEPT包中声明了TYPE

tbl—name IS TABLE OF VARCHAR2(30) INDEX BY

BINARY—INTEGER;存储过程EMP—OF—DEPT(dept—id IN NUMBER,name OUT

DEPT.tbl—name)返回部门编写为dept—id的部门的所有员工,置name数组中。假定所有部门

的员工数目不超过100,则可用以下语句声明和调用DEV.EMP—OF—DEPT:

 Declare External Functions对话框中:

Subroutine EMP—OF—DEPT(long dept—id,ref string name[]) RPCFUNC 
ALIAS FOR ″DEV.EMP—OF—DEPT″
  PowerScript脚本中:
  long ln=dept—id
  string lsa—name[]
  ……
  lsa—name[100]=″ //置动态数组lsa—name上界为100
  ln—dept—id=2
  SQLCA.EMP—OF—DEPT(ln—dept—id,lsa—name) //检索部门2的所有员工的名字

 方法二使用方法:

 在脚本中加入如下编码(以DEV TEST为例):

long ln—id
  string ls—name
  ln—id=100
  DECLARE test PROCEDURE FOR DEV.TEST(:ln—id); //test有一个IN参数,一个OUT参数
  EXECUTE test;
  FETCH test INTO:ls—name;

 方法三使用方法:

 根据输入输出参数的不同,PB中的动态SQL语句有四种格式:1)无输入输出参数;2)只有输入参数,无输出参数;3)有确定数目输入输出参数;4)输出结果列的数目不定。其中第1)、第2)中格式的动态SQL语句也可用来调用简单的存储过程。

 1)没有输入输出参数的存储过程。例如DEV DEMO1存储过程没有输入输出参数,可用下列语句调用:

sqlstring=″EXECUTE DEMO1()″
  EXECUTE IMMEDIATE:sqlstring;

 2)只有输入参数的存储过程。例如DEV.DEMO2(name IN VARCHAR2,birthday IN DATE)

PREPARE SQLSA FROM ″EXECUTE DEMO2(?,?);″
  EXECUTE SQLSA USING:ls—name,:ldt—birthday;

如果是7.2以下版本的Oracle,可用方法四PBDMBS.Put—Line()函数调用建立存储过程。此时需选上Database

Profile中的PBDBMS复选框。

 存储过程作为数据窗口的数据源

 以一个简单数据窗口(显示服务器的系统时间)为例说明怎样创建存储过程作为数据源的数据窗口。

 1)在某个包(如PACK—TYPE)中定义日期类型的Recorder自定义数据类型datarec;

 2)创建返回系统时间的存储过程:

 

PROCEDURE get—sysdata(sysdt IN OUT PACK-TYPE.datarec)IS
  BEGIN
  open sysdt for select sysdate from dual;
  END;

 3)新建数据窗口,数据源选择Stored Procedure;

 4)在随后的Select Stored Procedure对话框中选择get—sysdate即可。

 如果作为数据源的存储过程有IN参数,则这些参数就是数据窗口的检索参数(Retrieve Argument)。

Support for Using PowerBuilder and Oracle 8.x and 9.x and 10g

Oracle 8.x and 9.x and 10g 的 pb 支持情况

http://www.sybase.com/detail?id=1011566



PB10连接SQL Server的配置


可能初次使用pb10的朋友无法顺利连接到sql server,一方面没有了mssql

server专用接口了,另一方面数据库管理系统(DBMS)换成了“OLE DB”,配置起来有点不顺手!下面就来介绍pb10中用OLE

DB连接sql 2000数据库。

在安装pb10的时候选择custom/full方式安装(默认的安装方式不会安装ole

db接口),next-》如果你没有安装.net则不要选择列表中的ADO.net....项。一路next完成安装。

在数据库画板中找到OLE microsoft OLE DB项,在其上右键新建一个配置,在弹出的配置窗口中:

profile name:填写配置文件名 //任意即可

provider:选择数据库管理系统类型,这里选择“SQLOLEDB”项

data

source:服务器名(和之前的版本不太一样)。可以在下拉列表中选择,也可以填入服务器名或IP地址如:127.0.0.1等。如果上面的provider不是“SQLOLEDB”则此下拉列表中可能没有选项。

user ID:用户名。我的用户名是默认的sa

password:对应上面user ID的密码,我的密码是空的,所以不填。

到这里你就可以顺利的连接到sql

server了。但是连接到哪个数据库呢?上面的参数都没有指明,我也找了半天:P。不要着急,在Extended里填入

“database=数据库名” 就可以了。(不要引号)

最后的配置文件内容为:

// Profile his
SQLCA.DBMS = "OLE DB"
SQLCA.LogId = "sa" //我的用户名是sa
SQLCA.AutoCommit = False
SQLCA.DBParm = 
"PROVIDER='SQLOLEDB',DATASOURCE='NETMANAGER',PROVIDERSTRING='database=zs'" 
//我的数据库名是:zs;datasource后面也可以是IP地址:DATASOURCE='127.0.0.1'

至此就完成了pb10下用OLE DB连接sql server的配置!


是十分优秀的用于客户/服务器环境信息管理系统开发工具,其优秀之处不仅是因为可以开发基于客户/服务器模式的系统,而且简单、易学,Power

Builder

自身是没有数据库管理系统(DBMS)的,它是首先通过不同的驱动程序联接不同的数据库,再通过这种联接,实现对数据的管理。Power

Builder同时随盘附带有一个小型的数据库管理系统:SQL Anywhere,所以用户也可以直接开发用于单机的完整的信息管理系统。

----

本人以前曾开发过基于FoxPro环境下的数据库系统,但FoxPro的编程太麻烦,不但要处理数据的管理,而且还要花大量的精力处理输入、输出的格式等。但有着可视化编程环境的Power

Builder却不同,处理输入、输出是件相当简单的事情,于是,本人偿试用Power Builder来管理以前的数据库。 c在Power

Builder系统中,使用FoxPro的数据库有两种方法:一是利用ODBC联接FoxPro数据库;另一种方法是将FoxPro的数据库转换到SQL

Anywhere的数据格式。

---- 一、 利用ODBC联接FoxPro数据库

---- 在Power Builder中,直接访问FoxPro数据库只能通过ODBC方式。

---- 在开发环境下,可以直接在PowerBar画板上配置ODBC,联接FoxPro数据库,方法如下:

单击Configure ODBC工具钮

在Installed Drivers目录框中选择:Microsoft Foxpro Driver (*.dbf)

单击“Create”按钮

命名数据源名、选择版本

取消“使用当前工作目录”选项

单击选定目录,选择被联接数据库所在的目录

确定退出

----

通过ODBC方式联接的FoxPro的数据库,一定要满足FoxPro的数据库格式,即数据库文件结构必须是:“32字节文件描述若干个32字节的字段描述

结构描述结束符(0D) 记录1,记录2,…… 文件结束符(1A)”。由此看来,传统的DBF数据库文件均可通过该方式联接。对于Visual

FoxPro环境下建立的表(Table),其结构与传统的数据库结构是不同的,它在字段描述结束符(0D)与记录之间加上了二百多个字节的内容,但在未纳入VFP的数据库(Dbc)之前,其内容为“00”,此时仍可以通过这种方式联接,一旦纳入数据库中,该段字节已被填上了其它内容,无法再联接。


---- 在Power

Builder应用程序中,使用事务处理对象来联接数据库,这种事务处理对象,即有默认的SQLCA,用户也可以自己生成,以方便访问多个数据库。在程序中使用事务处理对象时,一般必须先指明DBMS、DbParm两个属性,对于FoxPro数据库,还必须指明

Database、 userid、servername、几个属性,这一点是与访问其他类型的数据库不同的地方。

sqlca.dbms="ODBC" // 指定联接方式ODBC
sqlca.database="D:\prg\pubdata" // 指定被联接数据库所在目录
sqlca.userid="public" // 用户识别号,都为 public
sqlca.servername="FOXPRO" // 服务器名:均为FOXPRO
sqlca.dbparm="Connectstring='DSN=tscxs'" //数据源名
connect using sqlca; // 实施联接
……

---- 通过对FoxPro数据库的联接,用户便可以在Power

Builder开发环境下、应用程序中使用这些数据库,快速地开发出自己的信息管理系统,实现对这些数据库的维护与管理。

---- 二、 将DBF文件转换为SQL Anywhere 的DB文件格式

---- 在Power Builder环境下,附带有一个数据库系统——SQL Anywhere,在Power

Builder中利用它,用户可以直接建立、维护数据库。在SQL

Anywhere中,数据库结构虽然与VFP不同,但概念是一致的,即:数据库是系统中相关的各种数据,这些数据又因不同用途组织成不同的表,这些表共同构成数据库,与传统的数据库(DBF)相类比,PB、VFP中的表即是传统意义的数据库,PB、VFP中的数据库类似于传统的数据库(DBF)文件所在的目录。SQL

Anywhere中提供了将传统的DBF文件转换为该系统下的数据库文件(DB)中的表的工具。为了实现这一转换,用户必须先建立一个新的表,再将DBF格式的文件内容导入该表中。


----

对于DBF文件,必须是传统意义上的数据库,如FoxPro、dBase、FoxBASE环境下的数据库文件。该种数据库文件严格遵循“数据文件==数据库结构+数据库记录”这一格式。其结构如下:“32字节文件描述若干个32字节的字段描述

结构描述结束符(0D) 记录1,记录2,…… 文件结束符(1A)”

03 62 0A 07 02 00 00 00 - 81 00 4C
00 00 00 00 00 // 文件描述:时间、长
00 00 00 00 00 00 00 00 - 00 00 00
00 00 00 00 00 度、记录长、记录数
4E 41 4D 45 00 00 00 00 - 00 00 00
43 01 00 00 00 // 第一个字段:名、类
28 00 00 00 00 00 00 00 - 00 00 00
00 00 00 00 00 型、长、起始位
41 55 54 48 4F 52 00 00 - 00 00 00
43 29 00 00 00 // 第二个字段
0F 00 00 00 00 00 00 00 - 00 00 00
00 00 00 00 00 ……
0D 20 50 6F 77 65 72 42 - 75 69 6C
64 65 72 20 50 // 结构结束符(0D)、
72 6F 67 72 61 6D 6D 69 - 6E 67 20
20 20 20 20 20 记录1
20 20 20 20 20 20 20 20 - 20 20 4A
6F 68 6E 20 53 ……
6D 69 74 68 20 20 20 20 - 20 1A
// 文件结束符(1A)

---- 将DBF文件直接转换为PB(SQL Anywhere)中的表,操作步骤如下:

在PB 中建立新表

打开新建的表

单击数据库画板中的“数据操作(Data manipulation)”按钮

选择菜单:Rows ? Import

从“文件类型”下拉框中选择dbaseII & III(*.dbf)

选择被导入文件所在的目录及文件名

单击“打开”按钮

系统将打开指定的文件,将该文件中的所有记录导入新建的表中。

---- 但系统不提供直接将导入数据保存在本数据库(表)中。如果要将导入的记录保存为SQL Anywhere

环境下的数据库(表)中,可以先将导入数据行以SQL格式保存在 .sql 类型文件中,在利用SQL语句将这些数据行插入新表中。步骤如下:

按上面所列的步骤导入数据库(DBF)文件中的数据

选择菜单:File ? Save Row As …

在“存为类型”列表框中选择:SQL

选择保存路径,输入保存文件名,单击保存

关闭“Data manipulation”窗口,回到数据库画板

单击“DB Administration”(数据库管理器)

选择菜单:File ? Open

确信文件类型为:SQL (*.sql)

选择第4步中所保存的文件,单击“打开”按钮

删除文件起始部分的第一条SQL语句:CREATE TABLE

单击“Execute”(执行)按钮,系统将把原数据库中的所有行插入到新表中。

---- 需要注意的是,新建的表在字段设置上必须与原DBF文件中的字段保持一致,即:

新表中的字段数必须等于或大于原DBF文件中的字段数

新表中的字段顺序要与原文件中的字段顺序一样,即使新表中字段数更多,但新的字段必须放在最后

新表与旧文件中字段名可以不一样

新表中的数据类型必须与旧表中的数据类型兼容:字符 ? 字符, 数值 ? 数字,数字 ? 字符……

数据格式相一致,如两个文件中的日期格式必须一致

新表中字段长度必须能容纳旧数据库文件中的对应字段中的数据,如:旧数据库某一字段宽度为C20,但库中所有记录在该字段的实际最长为14,那么,新表中的字段宽度至少应为C14  


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7月前
|
SQL Java 关系型数据库
JDBC Connection详解:连接到数据库的关键
在Java中,要与数据库进行交互,需要使用Java数据库连接(JDBC)。JDBC允许您连接到不同类型的数据库,并执行SQL查询、插入、更新和删除操作。在JDBC中,连接数据库是一个重要的步骤,而Connection对象是实现这一目标的关键。本篇博客将详细解释Connection对象的作用、创建和使用方法,以及与数据库连接相关的注意事项。
100 0
|
15天前
|
弹性计算 关系型数据库 MySQL
检测 MySQL 数据库连接数量
【4月更文挑战第28天】
10 0
|
1月前
|
网络协议 数据库连接 网络安全
DM数据库连接数据库时报:创建sokect连接失败
DM数据库连接数据库时报:创建sokect连接失败
48 0
|
7月前
|
SQL 关系型数据库 Java
聊聊 JDBC 的 executeBatch || 对比下不同数据库对 JDBC batch 的实现细节
聊聊 JDBC 的 executeBatch || 对比下不同数据库对 JDBC batch 的实现细节
|
8月前
|
SQL Java 关系型数据库
[Mysql]JDBC篇, DAO, DBUtils, 批处理, 数据库池
面向接口编程是一种抽象的, 高效的编程思想 (就像Java里面的多态的思想. 解耦合) 解耦合 : 降低程序的耦合度(乐高坏了只需要换一个零件, 不香?), 提高程序的扩展力(比如多态) SUN公司写了一个接口 各大厂商对这个接口进行实现 这个接口实现了"多态"的编程思想 面向接口编程的程序员只需要调用JDBC即可 底层的实现是厂商写的代码, 程序员也不用去关心 厂商写的实现接口的.class文件, 也是驱动(Driver) 数据库驱动都是以.jar包的形式存在, .jar包当中有很多.class文件, 它们实现了JDBC接口
|
9月前
|
Java 数据库连接
jdbc获取数据库连接的四种方式
jdbc获取数据库连接的四种方式
51 0
|
9月前
|
数据库连接 C# 数据库
|
11月前
|
Java 数据库
数据库的五种Driver连接方式
数据库的五种Driver连接方式
132 0
|
SQL 存储 Oracle
PB与各种数据库连接(一)
PB与各种数据库连接
617 0
|
SQL 存储 移动开发
PB与各种数据库连接(三)
PB与各种数据库连接
760 0