PB中建立資料庫的方法

kaiyinkaiyin發表於2007-09-04
PB中建立資料庫的方法[@more@]

當我們把用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!)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10957369/viewspace-967893/,如需轉載,請註明出處,否則將追究法律責任。

相關文章