分享
 
 
 

浅谈在PB中创建数据库的方法

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

浅谈在PB中创建数据库的方法

大连理工大学 李宏

01-6-5 下午 02:49:57

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

当我们把用PowerBuilder(以下简称PB)开发的数据库客户端应用程序交给用户后,还需要在用户的服务器端的数据库系统上进行一系列配置工作,如建立业务数据库和建表、视图、主键、索引等数据对象。只有正确配置了数据库服务器上的数据结构,应用程序才能正常运行。通常由经验丰富的数据库管理员,使用数据库系统提供的工具,手工或通过其他辅助工具,来完成数据库端的配置工作。本文以微软的SQL Server 2000为例,介绍用PB开发一个生成业务数据库及各种业务数据对象的程序,用户只要运行这个程序,就可以建立数据库端的数据结构。

程序功能及结构

程序的主要功能是建立客户应用程序运行时需要的业务数据库和在新建立的业务数据库上建立数据对象。

程序的输入信息通过4个单行编辑文本框获得:

●sle_database:新建立的数据库名称;

●sle_datafile:新建数据库所用的数据文件;

●sle_logfile:新建数据库所用的日志文件;

●sle_script:建立数据库中的数据对象所用的脚本文件。

完成程序功能的两个按钮分别为:cb_create 用于建立数据库;cb_table用于在新建的数据库中建立表、主键等数据对象。

在两个输出窗口中输出结果:dw_database 用于显示新建的数据库名称及数据文件;dw_objects用于显示通过cb_table按钮建立的数据对象。

具体实现

考虑到对于一个特定的应用,在系统分析阶段就已经确定数据库所需要的数据空间、日志空间的大小等一些系统物理信息,不会等到程序运行时由用户确定,所以这些信息不需要用户输入。数据库的名称一般来说也是固定的,用户输入的数据库名称(sle_database),可用来检查数据库系统中是否已经有同名的数据库。数据文件和逻辑文件的物理位置和名称,由用户根据服务器上的磁盘空间空闲情况输入(sle_datafile、sle_logfile),程序中给出了初始值,指定的文件位置是SQL Server通常的数据文件存放位置。

1.建立数据对象的脚本文件(sle_script)

该文件是普通的文本文件类型,其内容由建立表、主键等数据对象的数据定义语言(DDL)组成,其语法符合数据库系统的规则。例如,脚本test.sql内容为建立两个带有主键的表:

create table xz_tj_all

( gxjg char(4) not null,

nian smallint not null,

yue tinyint not null,

bz1 tinyint not null,

bz2 tinyint not null,

a1 integer ,

a2 integer ,

a3 integer ,

primary key (gxjg, nian, yue, bz1, bz2)

)

create table xz_tj_4_1

( gxjg char(4) not null,

nian smallint not null,

yue tinyint not null,

bz1 tinyint not null,

bz2 tinyint not null,

a1 integer ,

primary key (gxjg, nian, yue, bz1, bz2)

)

2.窗口的Open事件

应用程序只用到一个窗口(w_create_database),在其Open事件中,对两个全局事务对象进行创建,并利用其中的一个事务对象(tr_sql)与系统数据库(Master)进行连接。此时还没有进行业务数据库的创建工作,业务数据库不存在,所以不能在这里进行与新建业务数据库的连接。w_create_database 的Open事件脚本如下:

//创建与Master系统数据库相连接的事务对象

tr_sql = create transaction

tr_sql.DBMS =“MSS Microsoft SQL Server 6.x”

tr_sql.DataBase = “Master”

//数据库系统管理员

tr_sql.LogPass = “sa”

//服务器名

tr_sql.ServerName = “station4”

//系统管理员口令

tr_sql.LogId = “sa”

tr_sql.AutoCommit = False

tr_sql.DBParm = “”

//连接到Master系统数据库

connect using tr_sql;

if tr_sql.sqlcode <> 0 then

MessageBox (“数据库连接错误”,“不能连接到SQL Server数据库Master。请确认SQL Server数据库是否启动。~n~r” + “错误信息:” + tr_sql.sqlerrtext)

return

end if

//从系统表sysdatabases中检索数据库信息

dw_database.SetTransObject(tr_sql);

//创建与新建业务数据库相连接的事务对象

tr_newBase = create transaction

tr_newBase.DBMS =“MSS Microsoft SQL Server 6.x”

tr_newBase.LogPass =“sa”

tr_newBase.ServerName =“station4”

tr_newBase.LogId =“sa”

tr_newBase.AutoCommit = False

tr_newBase.DBParm =“”

3.cb_create按钮的单击事件

根据业务需要,这里创建的数据文件和日志文件的初始大小为100MB,最大值为200MB,增量为20MB。按钮cb_create根据输入参数构造动态SQL语句,创建数据库。cb_create的clicked事件脚本如下:

//数据库名

string ls_database

//数据文件路径及文件名

string ls_dataFile

//日志文件路径及文件名

string ls_logFile

//创建数据库的SQL语句

string ls_mySql

//逻辑数据文件名

string ls_logicalFileName

//逻辑日志文件名

string ls_logicalLogName

SetPointer(Hourglass!)

//取得用户输入的数据库名称

ls_database = trim(sle_database.text)

//取得数据文件位置和名称

ls_dataFile = trim(sle_dataFile.text)

//取得日志文件位置和名称

ls_logFile = trim(sle_logFile.text)

ls_logicalFileName = ls_database + “Arch1”

ls_logicalLogName = ls_database + “Archlog1”

tr_sql.AutoCommit = True

//建立数据库的语句

ls_mySql=“CREATE DATABASE ”+ls_database+“ON”&

+“( NAME =”+ls_logicalFileName+“,”&

+“FILENAME = ‘”+ls_dataFile+“',”&

+“SIZE = 100MB,”&

+“MAXSIZE = 200,”&

+“FILEGROWTH = 20)”&

+“LOG ON ”&

+“( NAME = ”+ls_logicalLogName+“,”&

+“FILENAME = ‘”+ls_logFile+“',”&

+“SIZE = 100MB,”&

+“MAXSIZE = 200,”&

+“FILEGROWTH = 20)”

EXECUTE IMMEDIATE :ls_mySql Using tr_sql;

tr_sql.AutoCommit = False

//检索出刚刚建立的数据库

dw_database.Retrieve(ls_database)

cb_table.Enabled = True

SetPointer(Arrow!)

4.cb_table按钮的单击事件

按钮cb_table从指定的脚本文件(sle_script.text)中读取内容,构造动态的SQL语句,创建数据对象。为简化程序,对于脚本文件大于32765字节的情况,本文没做处理,读者可用多次读文件等技术自行处理。

cb_table的clicked事件脚本如下:

//创建数据对象前的时间

datetime ldt_create

//数据库名

string ls_database

//创建数据对象的SQL语句

string ls_sql

//存储脚本文件名

string ls_fileName

//打开文件的文件号

int li_fileNo

//文件长度,读取的文件字节数

long ll_fileLength, ll_number

//取得新建的数据库名称

ls_database = trim(sle_database.text)

if MessageBox(“请确认”,“将要在”+ls_database+“数据库中生成表结构?”, Question!,YesNO!,2) = 2 then

return

end if

SetPointer(HourGlass!)

//为连接业务数据库的事务对象设置数据库值

tr_newBase.DataBase = ls_database

connect using tr_newBase;

if tr_newBase.sqlcode <> 0 then

MessageBox (“数据库连接错误”,“不能连接到SQL Server数据库:” +ls_database + “ 。~n~r”+“错误信息:”+ tr_newBase.sqlerrtext)

return

end if

//取得建立数据对象的时间,并从系统表sysobjects中提取建立的数据对象

Select distinct getDate()

into :ldt_create

from sysobjects

using tr_newBase;

//此数据窗口将显示新建事务对象

dw_objects.SetTransObject(tr_newBase)

//从输入中取得脚本文件名

ls_fileName = trim(sle_script.text)

ll_fileLength = FileLength(ls_fileName)

//对大于32765字节的文件不做处理

if ll_fileLength > 32765 then

MessageBox(“”,“脚本文件太大”)

DISCONNECT USING tr_newBase;

return

elseif ll_fileLength > 0 then

//读取文件内容,执行动态SQL语句

li_fileNo = FileOpen(ls_fileName, StreamMode!)

ll_number = FileRead(li_fileNo, ls_sql)

if ll_number > 0 and ll_number <= 32765 then

tr_newBase.AutoCommit = True

EXECUTE IMMEDIATE :ls_sql

Usingtr_newBase;

tr_newBase.AutoCommit = False

end if

FileClose(li_fileNO)

else //不能正确读取文件信息

sle_script.setFocus()

sle_script.SelectText(1,len(sle_script.text))

MessageBox(“打开脚本文件出错”,“请输入正确的表结构脚本文件名称”)

DISCONNECT USING tr_newBase;

return

end if

//检索刚刚建立的数据对象

dw_objects.Retrieve(ldt_create)

DISCONNECT USING tr_newBase;

SetPointer(Arrow!)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有