首页 > 数据库技术 > 详细

PB数据库相关

时间:2014-07-12 21:21:55      阅读:487      评论:0      收藏:0      [点我收藏+]

----------------------------------------------------------------
数据库画板:
一张表定义了主键或者唯一索引,则可以在Results视窗中修改、增加、删除数据。

使用SQL语句创建数据表是最快捷的方式。但是,PB在创建数据表的同时,要在系统数据表中添加关于数据表的信息,表和字段的扩展属性都保存在系统表中。所以,直接使用SQL语句创建系统表将使系统表中的信息不完整。使用窗口菜单Design下的Synch Extended Attributes命令可以纠正这些不完整。实际上,系统表的不完整没有太多的副作用,尤其在不使用系统表编写程序时。

表的扩展属性:
在相关的属性页中设置相关的属性。在General属性页中可以设置表的注释信息,可以使用汉字。Data Font属性页用来定义从数据库中检索出来的数据的显示属性,在Database画板中操作数据或在数据窗口运行检索数据时。Heading Font属性页用来设置grid、tabular和n-up显示样式的数据窗口中Header的显示样式。Label Font属性页用来设置freeform显示样式的数据窗口中Label的显示样式。

字段的扩展属性:
在相应的属性页中设置相关的属性。General属性页用来设置字段的注释信息(出现在表的字段说明处,数据窗口对象的tag处)。Headers属性页用来设置freeform,显示样式的数据窗口中的Label,tabular,grid和n-up显示样式的数据窗口中的Header(在设置好label和heading两处的内容后,如填写字段的中文信息,在制作数据窗口对象后在相应的label或header中显示中文信息)。Display属性页用来设置字段的显示样式,包括字段中数据显示的宽度、高度、是否显示为图片、是否添加一定的标记(比如,是否添加¥表示当前数据为人民币)。Validation属性页用来设置校验规则,在数据窗口中录入的数据必须能够通过该校验规则才能被接收。比如,可以规定用户在Salary(工资)字段上输入的数据应该在某个范围内,如果不在该范围内,则不被接收。EditStyle属性页用来设置数据窗口中编辑该字段时的编辑风格,比如可以使用Radio button让用户编辑该字段的数据。

可以同时打开两个Columns(View->Columns),在不同的数据之间拷贝、粘贴字段的定义。

打印数据表的定义:Print Definition
输出数据表的定义语法:Export Syntax
查看数据表操作的SQL语法:Pending Syntax

打开相关表
在包含键的数据表中,经常需要打开所有和该键有依赖关系的数据表,在Objects Layout视窗中、数据表的键(主键或者外部键)图标上单击鼠标右键,使用弹出菜单中的Open Dependant Table(s)命令即可显示所有和该键有依赖关系的数据表。有依赖关系的数据窗口打开后,有依赖关系的键之间有线段联接,表示它们之间的依赖关系。当打开的数据表比较多时,可以在该视窗空白处单击鼠标右键,使用弹出菜单中的Arrange Tables来排列数据窗口的布局。

定义外部键时,注意在Ruels属性页选择删除策略

Results页面中右键Save Rows As...保存数据到外部
Rows->Import从外部导入数据

----------------------------------------------------------------
一个事务对象一次只能连接一个数据库,定义多个事务对象可以同时和对个数据库建立连接。
Transaction gt_sqlca
gt_sqlca = create transaction

----------------------------------------------------------------
事务
在PB中,对事务的操作是这样进行的:先定义开始一个事务(默认为SQLCA),然后对数据进行修改操作,这时如果提交(commit),这些修改就永久地保存下来;如果回退(rollback),数据库管理系统将放弃所有修改,回到开始事务时的状态。

----------------------------------------------------------------
事务对象包括15个参数:(5个用来返回操作的状态信息,其他10个用于设置和数据库连接时的参数)
SQLCode 是否成功标志,有三个可能的取值:0-成功,100-无数据,-1-错误(long)
SQLDBCode 数据库的错误代码(long)
SQLErrText 数据库的错误信息(string)
SQLNRows 涉及到的行数-不同的DBMS有所不同(long)
SQLReturnData DBMS指定的信息(string)

DBMS
Database
LogID
LogPass
ServerName
UserID
DBPass
Lock
DBParm

connect {using sqlca}; //连接数据库,连接后,可以根据sqlca.sqlcode的返回值判断是否正确连接了数据库

----------------------------------------------------------------
数据库操作:
选取:
select 字段名集合 into :变量集合 from 表名 where 条件表达式 {using 事务对象名};
select salary,name into :li_salary,:ls_name from salarys where name = :ls_nameusing sqlca;
插入:
insert into 表名(字段列表) values (值列表) {using 事务对象};
insert into dept(deptno,deptname,workers) values (:ls_deptno,"销售部",10);
删除:
delete from 表名 where 条件表达式{using 事务对象};
delete from 表名 where current of 游标名称;
delete from dept where workers = 10;
delete form dept where current of dept_cur;
修改:
update 表名 set 字段名 = :变量名(或常数)[,字段名 = :变量名(或常数)] where 条件{using 事务对象};
update 表名 set 字段名 = :变量名(或常数)[,字段名 = :变量名(或常数)] where current of 游标;

----------------------------------------------------------------
可以用execute immediate指令来执行任意的数据库操作。——动态SQL语句
将数据库指令编辑成一个字符串,您可以执行任何的数据定义语句如建表、建主键、存储过程等
eg.
string ls_sql
ls_sql = "delete from customers where customerid = ‘1‘"
execute immediate :ls_sql;
if sqlca.sqlcode = 0 then
commit;
else
rollback;
end if
注意:ls_sql可以包括变量等,只要最终是一条SQL语句即可
注意:若,sqlca.autocommit = true,即自动提交事务,则不需要后面的if……

----------------------------------------------------------------
动态SQL语句有四种类型:
既无输入参数,也无结果集;
有输入参数,但没有结果集;
编译时已经知道参数和结果集;
开发程序时尚不知道参数和结果集。


类型一

这种类型的动态SQL语句经常用来执行DLL或者数据库专用的其他SQL语句。语法格式是:
EXECUTE IMMEDIATE SQLStatement {USING TransactionObject};
其中SQLStatement是个字符串,其内容是有效的SQL语句;TransactionObject是事务对象名,大括号表示该子句可以省略,省略时使用SQLCA。下面是个创建删除数据表的例子:
string MySQL = "drop table employee"
EXECUTE IMMEDIATE :MySQL USING SQLCA;
*最好使用如下代码
string ls_sql = ‘drop table employee‘
execute immediate :ls_sql using sqlca;
if sqlca.sqlcode = 0 then
commit;
else
rollback;
end if


类型二

运行之前已知参数个数并且没有返回值时使用这种类型的动态SQL语句。这种类型的动态SQL语句也能够处理需要在运行时定义参数的数据操作语句。其语法格式是:
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECUTE DynamicStagingArea USING {ParameterList};
其中DynamicStagingArea是个DynamicStagingArea类型的变量,该类型的缺省全局变量是SQLSA;SQLStatement是个String类型的常量或者变量,其内容是有效的SQL语句,SQL语句中使用问号代表所需参数,执行时问号被EXECUTE语句中的SQL语句中的USING子句所代表的值取代;TransactionObject是事务对象名,大括号表示该子句可以省略,省略时使用SQLCA;ParamenterList是参数列表,可以是变量、常量或者控件的属性,各参数对应于SQLStatement中的问号。动态策略区用于准备SQL语句及所需参数个数,它的属性在运行时应用程序不能访问,SQLSA是缺省的动态策略区变量。
eg:
int emp_id_var = 56
PREPARE SQLSA FROM "DELETE FROM employee WHERE emp_id = ?";
EXECUTE SQLSA USING :emp_id_var;
eg:
prepare sqlsa from "insert into employee (emp_id,manager_id) value(?,?)";
execute SQLSA using :ls_empid,:sle_manager.text;


类型三

这种类型的动态SQL语句的使用频率可能是仅次于第一种类型,它常用来处理参数个数和结果集在编译时已知的情况,又分为游标和存储过程两种情况。使用游标形式的语法与程序中出现的次序为:
DECLARE Cursor DYNAMIC CURSOR FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
OPEN DYNAMIC Cursor{USING ParameterList};
FETCH Cursor INTO HostVaribaleList;
close Cursor;
使用存储过程的第三类动态SQL语句的格式和次序与上面的语法形式类似,只是使用EXECUTE语句来代替上面的OPEN语句,其语法格式为:
DECLARE Procedure DYNAMIC PROCEDURE FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECTUE DYNAMIC Procedure{USING ParameterList};
FETCH Procedure INTO HostVariableList;
CLOSE Procedure;
其中,Cursor和Procedure分别是游标名和过程名;DynamicStagingArea是动态策略区变量,通常使用系统预定义的全局变量SQLSA;SQLStatement是个字符串(常量或变量均可,变量时变量名前面加上冒号),起内容是有效的SQL语句,并使用问号代表参数;ParameterList是对应于SQLStatement中问号的参数列表;HostVariableList是PowerScript主变量(即在其前面加上冒号的PowerScript变量);TransactionObject是事务对象名,缺省时使用SQLCA。
DECLARE语句说明动态游标或动态过程,PREPARE语句准备动态策略区,OPEN或EXECUTE语句打开动态游标或执行动态过程,FETCH语句读取一行数据,如果需要读取多行数据,那么需要反复执行FETCH语句。最后,CLOSE语句关闭动态游标或动态过程。FETCH语句和CLOSE语句的用法与上节介绍的方法相同。下面是第三类动态SQL语句的一个应用示例,他得到籍贯是“北京”的雇员:
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA;
int emp_id_var
string sqlstatement,emp_state_var = "北京"
sqlstatement = "SELECT emp_id FROM employee WHERE emp_state = ?"
PREPARE SQLSA FROM :sqlstatement;
OPEN DYNAMIC my_cursor using :emp_state_var;
FETCH my_cursor INTO :emp_id_var;
CLOSE my_cursor;
该示例中省略了必要的SQL语句执行状态检查工作,在实际编写程序时,除DECLARE语句外,执行了其他SQL语句后,都应该检查事务对象的SQLCode属性,以判断SQL语句的执行是否成功。
使用这种类型的动态SQL语句可以创建比较通用的向列表框或者下拉列表框中添加数据的脚本。
//////////////////////////////////
//函数名:wf_addItem(dropdownlistbox fo_obj,string fs_sql)
//参数:fo_obj为下拉列表框,fs_sql为SQL语句
//返回值:无
//功能:使用参数指定的SQL语句向指定的下拉列表框中添加数据
////////////////////////////////////
string ls_item
declare item_cur dynamic cursor for sqlsa; //定义动态光标
prepare sqlsa from :fs_sql using sqlca;
open dynamic item_cur; //打开动态光标
fetch item_cur into :ls_item; //取数据
fo_obj.setredraw(false) //禁止下拉列表框刷新
do while sqlca.sqlcode = 0
fo_obj.additem(ls_item) //向下拉列表框中添加项目
fetch item_cur into :ls_item;
loop
fo_obj.setredraw(true) //刷新下拉列表框
close item_cur; //关闭动态光标


类型四

第四类动态SQL语句最复杂,功能也最强,它能够处理编程时尚不知道参数和结果集的SQL语句。与第三类动态SQL语句相似,第四类动态SQL语句也有两种形式:一种针对游标处理,另一种则针对存储过程而言,区别在于游标处理时使用OPEN语句而不使用EXECUTE语句,而运用存储过程时则使用EXECUTE语句但不使用OPEN语句。下面给出第四类动态SQL语句的语法,其中Cursor针对游标,Procedure针对存储过程:
DECLARE Cursor|Procedure DYNAMIC CURSOR|PROCEDURE FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea;
OPEN DYNAMIC Cursor USING DESCRIPTOR DynamicDescroptionArea;|
EXECUTE DYNAMIC Procedure USING DESCRIPTOR DynamicDescriptionArea;
FETCH Cursor|Procedure USING DESCRIPTOR DynamicDescriptionArea;
CLOSE Cursor|Procedure;
其中,Cursor和Procedure分别是游标名和过程名;DynamicStagingArea是动态策略区变量,通常使用系统预定义的全局变量SQLSA;SQLStatement是个字符串(常量或变量均可,变量时变量名前面加上冒号),其内容是有效的SQL语句,并使用问号代表参数;DynamicDescriptionArea是动态描述区变量,这种类型的变量专门用来描述第四类动态SQL语句中的输入和输出参数,通常使用系统预定义的全局变量SQLDA;TransactionObject是事务对象名,缺省时使用SQLCA。第四类动态SQL语句使用了动态描述区对象变量,通过该变量的四个属性NumInputs,InParmType、NumOutputs和OutParmType能够得到输入参数个数、输入参数类型、输出参数个数和输出参数类型的信息,其中InParmType是个数组,每个元素依次对应于SQL语句中的一个问号;OutParmType也是个数组,每个元素对应于一个输出参数。InParmType和OutParmType的数据类型是枚举类型ParmType,其取值范围为下面“适用的参数类型”栏列出的各个值:
函数名 适用的参数类型
GetDynamicNumber() TypeInteger!、TypeDecimal!、TypeDouble!、
TypeLong!、TypeTeal!、TypeBoolean!、
TypeUnsingedInteger!、TypeUnsignedLong!
GetDynamicString() TypeString!
GetDynamicDate() TypeDate!
GetDynamicTime() TypeTime!
GetDynamicDateTime() TypeDateTime!
通过使用该对象变量的函数SetDynamicParm()设置具体的输入参数值。通过上面的对象函数得到输出参数(实际上就是SQL语句的返回数据)的值,每个函数都针对特定的数据类型。
第四类动态SQL语句语法格式中各语句的执行次序十分重要,只有在前一条语句执行成功时,后一条语句的执行才有意义,因此,除DECLARE语句外,其他语句执行后都应该检查事务对象的SQLCode属性,以判断当前SQL语句的执行是否成功。通过对次调用FETCH语句,能够读取多条数据,每读出一条数据后,通常在循环语句中使用CHOOSE CASE确定输出参数的类型后再用上面的对应函数得到其值。下面是第四类动态SQL语句的一个应用示例,其中省略了实际编程中必须具备的检查事务对象SQLCode属性的过程(即检查SQL语句执行是否成功):
string ls_sqlstatement
integer li_count = 0
ls_sqlstatement = "select emp_id from employee"
prepare SQLSA from :ls_sqlstatement;
Descrobe SQLSA InTo SQLDA;
Declare my_cursor Dynamic Cursor For SQLSA;
Open Dynamic my_cursor Using Descriptor SQLDA;
Fetch my_cursor Using DescripTor SQLDA;
If SQLCA.sqlcode = 100 then
messagebox("提示","没有找到指定的数据!")
close my_cursor;
return
end if
do
li_count ++
//当FETCH语句执行成功时,动态描述区SQLDA中包含了结果集的第一行数据
//,反复执行FETCH语句即可得到其余数据。
//SQLDA.NumOutputs中包含了输出参数的个数。
//SQLDA.OutParmType数组中包含了各参数的数据类型,如TypeInteger!等
//使用choose case语句针对不同的输出参数类型调用不同的对象函数得到
//相应参数的值。
choose case SQLDA.OutParmType[1]
case TypeString!
stringvar = GetDynamicString(SQLDA,1)
case TypeInteger!
intvar = GetDynamicNumber(SQLDA,1)
end choose
loop while li_count <> SQLDA.NumOutPuts
close my_cursor;

*具体见帮助

----------------------------------------------------------------
使用游标步骤:
1)定义游标
declare cursor 游标名 for
select 字段名 from 表名
where 条件表达式 {using 事务对象};
2)打开游标
open 游标名称;
打开游标后游标中就保存了相应的返回结果
3)读取数据
fetch 游标名称 into :变量列表;
4)关闭游标
close 游标名称;
循环处理游标时,通过判断事务对象的参数可以知道是否处理完所有的数据。即通过事务对象的参数SQLcode来判断是否处理完所有的数据。
fetch……;
do while salca.sqlcode = 0
//
fetch……;
loop

for li_index = 1 to sqlca.sqlnrows
//
fetch……;
next

----------------------------------------------------------------
事务对象相当于一个联络员,专门用于PowerBuilder应用程序和数据库之间的通信。在访问数据库之前,必须首先建立一个事务对象,通过事务对象和数据库建立联结,之后才能和数据库打交道,所有和数据的相关操作都是通过这个联络员进行的。事务是和事务对象紧密相关的一个概念,是事务对象进行工作时的最小单位,由一个或者多个SQL语句组成的。一个事务中的所有SQL语句都正确执行,整个事务才能顺利提交,只要有一个SQL语句失败,该事务中前面已经做的操作都要被撤消,重新回到该事务开始的状态。事务处理就是通过事务对象和相关SQL语句进行的。

PowerBuilder中,有4个SQL语句专门进行事务处理,它们是connect,disconnect,commit和rollback,分别负责和数据库建立联接、断开联接、提交事务和回退事务等。在进行数据窗口检索或者执行SQL语句之前,首先应该使用connect语句和数据库建立正确的联接;当所有和数据库相关的操作完成后,可以使用disconnect语句和数据库断开联接。commit用来提交一个事务,rollback用来回退一个事务。这四个事务管理语句的格式相类似,如下所示:
statement {using transaction};
其中,statement代表四个单词中的任意一个,transaction是事务对象的名称,如果省略,则使用缺省的全局事务对象SQLCA。程序员也可以声明自己的事务对象类型的变量。若使用自己声明的事务对象,应该在声明之后使用create语句创建对象,使用完毕后执行destroy语句销毁自定义的事务对象。并且在涉及事务对象的SQL语句中都要加上using transaction子句。下面是一个使用自定义事务对象的完整例子:
(1)声明全局变量:transaction my_SQLCA。
(2)在应用对象的Open事件中编写如下脚本:
my_Sqlca = Create transaction //创建事务对象
//下面语句给事务对象中的成员变量赋值
my_Sqlca.DBMS =ProfileString("PB.INI","Database","DBMS", "")
my_Sqlca.Database =ProfileString("PB.INI","Database","DataBase"," ")
…………. //设置事务对象my_SQLCA的其他参数
connect using my_Sqlca; //联接数据库
If my_Sqlca.Sqlcode=0 Then //判断是否正确联接
Open(w_main) //正确联接则打开主窗口
Else //否则
MessageBox(String(my_Sqlca.Sqlcode),"不能和数据库联接!")//显示错误信息
Halt Close; //关闭应用
End If
(3)在应用对象的Close事件中释放事务对象,编写如下脚本:
Disconnect Using my_Sqlca; //断开和数据库的联结
destroy my_Sqlca; //释放事务对象
和数据库建立联接后,可以完成操作数据库的工作并执行commit或rollback。在每个commit或rollback之后关闭旧的事务处理,并开始新的事务处理。在一个事务处理过程中,应用程序控制着数据库,并由DBMS根据一定的机制对数据库中的数据加锁。如果一个事务的持续时间过长,就会导致许多的问题。例如,对于一个典型的生产系统,每天将自动或者人工进行事务日志转储。如果该系统的某类客户端应用程序整天运行并且只进行只读查询,那么在使用connect语句启动事务之后事务总是处于激活状态,任何转储或者截断日志的企图都不会生效,最终将导致日志爆满而引起整个数据库的问题。所以,PowerBuilder给事务对象提供了一个可以选择自动提交事务的成员变量,即AuToCommit,将该参数设置为True可以在事务对象所包含的每个语句执行完后自动执行commit,从而结束一个事务。另外一种解决方法是由开发人员在脚本中使用事务管理语句显式地管理事务,这需要更好地理解事务。

数据窗口是和数据库打交道的一个主要控件,在执行数据窗口的功能之前必须首先给数据窗口控件正确设置事务对象。一般在数据检索之前使用函数SetTrans或SetTransObject设置事务对象。使用不同的函数,数据窗口的事务处理方式就不同。函数SetTrans的语法格式如下所示:
dwcontrol.SetTrans( transaction )
其中,dwcontrol是要设置的事务对象的数据窗口控件名称,transaction是事务对象名称。若函数正确执行,则返回1,否则返回-1;任意参数为NULL则返回NULL。函数SetTransObject和该函数的格式、参数与返回值完全相同。
函数SetTrans设置事务对象后,数据窗口可以自动管理事务的处理,事务中所包含的每个功能或者语句执行完后都自动进行事务管理。而函数 SetTransObject设置事务对象后,数据窗口的事务处理得由脚本控制,除非在和数据库建立联接之前将事务对象的AuToCommit成员变量设置成了True。虽然数据窗口自动进行事务处理可以省去一些关于事务处理的脚本,但是也带来了很多的潜在危险。每次执行检索或修改等操作之前自动联接数据库,执行完后自动执行disconnect,无需再执行connect,commit,rollback或disconnect了。执行过程中的任何错误都会导致自动执行rollback,脚本对事务处理别无选择,无法控制事务的处理。在应用系统中和数据库的联接非常少时,可以由系统自动进行事务处理,这时使用函数SetTrans给数据窗口控件设置事务对象。通常情况下,使用SetTransObject设置事务对象可以使数据窗口有更高的执行效率。建议使用SetTransObject给数据窗口控件设置事务对象。
另外,函数SetTransPool可以设置事务对象共享,也影响着事务的处理。使用该函数不仅可以将数据库的吞吐量最大化,还可以控制同时打开的数据库联接的最大个数。如果在应用程序中设置了事务对象共享,当使用一个事务对象进行数据库联接时,系统首先检查是否存在和要使用的事务对象成员变量取值完全相同的事务对象。如果存在,就没有必要再重新创建事务对象,利用已经存在的事务对象即可,并且在有事务对象共享时,执行commit语句也不会真正从物理上终止一个事务,而只是在逻辑上终止该事务。当有新的相同取值的事务建立时,重新启用该事务对象。该函数的语法格式是:
applicationname.SetTransPool ( minimum, maximum, timeout )
其中,applicationname是应用对象名称;minimum和maximum是在事务对象池中要保证打开的事务对象的最少个数和最多个数,minimum必须小于或者等于maximum;timeout是建立数据库联接时的最长等待时间,超过该时间还不能成功建立联接就返回错误信息。若函数正确执行,则返回1,否则返回-1。下面是该函数的一个实例:
GetApplication().SetTransPool(12,16,10)
上面的语句首先使用函数GetApplication获取当前的应用对象,然后给该应用对象设置事务对象共享,最少打开事务对象12个,最多16个,联接时最长等待时间是10秒。
建议在进行数据库联接之前使用该函数,通常是在应用对象的Open事件中首先使用该函数建立事务对象共享,然后再创建要使用的事务对象,进行和数据库的联接。当在应用中需要维护多个联接,并且包含大量访问相同数据源的简短事务时,使用该函数创建事务对象共享可以提高应用程序的执行效率。下面是一个在应用对象的Open事件中创建事务对象共享的脚本:
If GetApplication().SetTransPool(12,16,10) <> 1 Then
MessageBox("提示","错误!")
Halt Close;
Else
SQLCA.DBMS=ProfileString("PB.INI","Database","DBMS", "")
SQLCA.Database=ProfileString("PB.INI","Database","DataBase"," ")
… //设置其他的SQLCA成员变量取值
Connect; //使用SQLCA事务对象进行联接
If SQLCA.SQLcode = 0 Then //联接成功则
Open(w_main) //打开主操作窗口
Else //联结不成功则显示错误信息
Messagebox("错误!",String(SQLCA.SQLDBCode) +"~r~n" + SQLCA.SQLErrText)
Halt Close; //关闭应用软件
End If
End If

在上面的脚本中,如果正确建立了事务对象共享,并且执行connect也正确,则系统自动打开12个事务对象。

----------------------------------------------------------------
在PowerBuilder的数据库中有5个表,用来记录数据库中其他表的有关信息,并且这5
个表由PowerBuilder自动维护,通常把这5个表称为PowerBuilder的仓库。这个仓库允许收
集和维护扩展列属性。
PBCatTbl 记录当前数据库中表的信息
PBCatCol 记录各个表中的列的相关信息
PBCatEdt 编辑样式
PBCatFmt 显示样式
PBCatVld 有效性验证规则

当使用PowerBuilder创建数据表时,PowerBuilder可以自动维护这5个表。当使用PB以外的工具创建数据表时,新建数据表的信息不会自动添加到仓库中,这时很多开发人员的错误是将信息手工输入到仓库中。正确的操作应该是执行database画板的Design菜单下的Synch Extended Attributes菜单项的功能,这样仓库可以自动更新。在编程时经常使用的有两个表,即存放表信息的PBCatTbl和存放字段信息的PBCatCol。
PBCatTbl:其中pbt_tname用来存放其他表名,pbt_ownr用来存放表的拥有者,pbt_cmnt用来存放表的注释,这三个字段在编程时经常使用,其他字段很少使用。使用这三个字段可以提取系统中的所有表,为了构造比较友好的界面,显示给用户的一般是字段pbt_cmnt中的内容,该表的索引基于字段pbt_tnam和pbt_ownr。
PBCatCol:其中,pbc_tnam用来存放表名,pbc_ownr用来存放表的拥有者,pbc_cid是记录字段创建顺序的,pbc_cnam用来存放字段名称,pbc_labl用来存放字段的标号,pbc_cmnt用来存放字段的注释。这些字段在编程时经常使用,其中pbc_cmnt经常显示在用户界面中。

----------------------------------------------------------------

 

PB数据库相关,布布扣,bubuko.com

PB数据库相关

原文:http://blog.csdn.net/u012369435/article/details/37698345

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!