----------------------------------------------------------------
數據庫畫板:
一張表定義了主鍵或者唯一索引,則能夠在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依據一定的機制對數據庫中的數據加鎖。假設一個事務的持續時間過長,就會導致很多的問題。比如,對于一個典型的生產系統,每天將自己主動或者人工進行事務日志轉儲。假設該系統的某類client應用程序整天運行而且僅僅進行僅僅讀查詢,那么在使用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常常顯示在用戶界面中。
----------------------------------------------------------------
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
