----------------------------------------------------------------
數(shù)據(jù)庫(kù)畫(huà)板:
一張表定義了主鍵或者唯一索引,則能夠在Results視窗中改動(dòng)、添加、刪除數(shù)據(jù)。
使用SQL語(yǔ)句創(chuàng)建數(shù)據(jù)表是最快捷的方式。可是,PB在創(chuàng)建數(shù)據(jù)表的同一時(shí)候,要在系統(tǒng)數(shù)據(jù)表中加入關(guān)于數(shù)據(jù)表的信息,表和字段的擴(kuò)展屬性都保存在系統(tǒng)表中。所以,直接使用SQL語(yǔ)句創(chuàng)建系統(tǒng)表將使系統(tǒng)表中的信息不完整。使用窗體菜單Design下的Synch Extended Attributes命令能夠糾正這些不完整。實(shí)際上,系統(tǒng)表的不完整沒(méi)有太多的副作用,尤其在不使用系統(tǒng)表編敲代碼時(shí)。
表的擴(kuò)展屬性:
在相關(guān)的屬性頁(yè)中設(shè)置相關(guān)的屬性。在General屬性頁(yè)中能夠設(shè)置表的凝視信息,能夠使用漢字。Data Font屬性頁(yè)用來(lái)定義從數(shù)據(jù)庫(kù)中檢索出來(lái)的數(shù)據(jù)的顯示屬性,在Database畫(huà)板中操作數(shù)據(jù)或在數(shù)據(jù)窗體執(zhí)行檢索數(shù)據(jù)時(shí)。Heading Font屬性頁(yè)用來(lái)設(shè)置grid、tabular和n-up顯示樣式的數(shù)據(jù)窗體中Header的顯示樣式。Label Font屬性頁(yè)用來(lái)設(shè)置freeform顯示樣式的數(shù)據(jù)窗體中Label的顯示樣式。
字段的擴(kuò)展屬性:
在對(duì)應(yīng)的屬性頁(yè)中設(shè)置相關(guān)的屬性。General屬性頁(yè)用來(lái)設(shè)置字段的凝視信息(出如今表的字段說(shuō)明處,數(shù)據(jù)窗體對(duì)象的tag處)。Headers屬性頁(yè)用來(lái)設(shè)置freeform,顯示樣式的數(shù)據(jù)窗體中的Label,tabular,grid和n-up顯示樣式的數(shù)據(jù)窗體中的Header(在設(shè)置好label和heading兩處的內(nèi)容后,如填寫(xiě)字段的中文信息,在制作數(shù)據(jù)窗體對(duì)象后在對(duì)應(yīng)的label或header中顯示中文信息)。Display屬性頁(yè)用來(lái)設(shè)置字段的顯示樣式,包含字段中數(shù)據(jù)顯示的寬度、高度、是否顯示為圖片、是否加入一定的標(biāo)記(比方,是否加入¥表示當(dāng)前數(shù)據(jù)為人民幣)。Validation屬性頁(yè)用來(lái)設(shè)置校驗(yàn)規(guī)則,在數(shù)據(jù)窗體中錄入的數(shù)據(jù)必須能夠通過(guò)該校驗(yàn)規(guī)則才干被接收。比方,能夠規(guī)定用戶(hù)在Salary(工資)字段上輸入的數(shù)據(jù)應(yīng)該在某個(gè)范圍內(nèi),假設(shè)不在該范圍內(nèi),則不被接收。EditStyle屬性頁(yè)用來(lái)設(shè)置數(shù)據(jù)窗體中編輯該字段時(shí)的編輯風(fēng)格,比方能夠使用Radio button讓用戶(hù)編輯該字段的數(shù)據(jù)。
能夠同一時(shí)候打開(kāi)兩個(gè)Columns(View->Columns),在不同的數(shù)據(jù)之間拷貝、粘貼字段的定義。
打印數(shù)據(jù)表的定義:Print Definition
輸出數(shù)據(jù)表的定義語(yǔ)法:Export Syntax
查看數(shù)據(jù)表操作的SQL語(yǔ)法:Pending Syntax
打開(kāi)相關(guān)表
在包括鍵的數(shù)據(jù)表中,常常須要打開(kāi)全部和該鍵有依賴(lài)關(guān)系的數(shù)據(jù)表,在Objects Layout視窗中、數(shù)據(jù)表的鍵(主鍵或者外部鍵)圖標(biāo)上單擊鼠標(biāo)右鍵,使用彈出菜單中的Open Dependant Table(s)命令就可以顯示全部和該鍵有依賴(lài)關(guān)系的數(shù)據(jù)表。有依賴(lài)關(guān)系的數(shù)據(jù)窗體打開(kāi)后,有依賴(lài)關(guān)系的鍵之間有線(xiàn)段聯(lián)接,表示它們之間的依賴(lài)關(guān)系。當(dāng)打開(kāi)的數(shù)據(jù)表比較多時(shí),能夠在該視窗空白處單擊鼠標(biāo)右鍵,使用彈出菜單中的Arrange Tables來(lái)排列數(shù)據(jù)窗體的布局。
定義外部鍵時(shí),注意在Ruels屬性頁(yè)選擇刪除策略
Results頁(yè)面中右鍵Save Rows As...保存數(shù)據(jù)到外部
Rows->Import從外部導(dǎo)入數(shù)據(jù)
----------------------------------------------------------------
一個(gè)事務(wù)對(duì)象一次僅僅能連接一個(gè)數(shù)據(jù)庫(kù),定義多個(gè)事務(wù)對(duì)象能夠同一時(shí)候和對(duì)個(gè)數(shù)據(jù)庫(kù)建立連接。
Transaction gt_sqlca
gt_sqlca = create transaction
----------------------------------------------------------------
事務(wù)
在PB中,對(duì)事務(wù)的操作是這樣進(jìn)行的:先定義開(kāi)始一個(gè)事務(wù)(默覺(jué)得SQLCA),然后對(duì)數(shù)據(jù)進(jìn)行改動(dòng)操作,這時(shí)假設(shè)提交(commit),這些改動(dòng)就永久地保存下來(lái);假設(shè)回退(rollback),數(shù)據(jù)庫(kù)管理系統(tǒng)將放棄全部改動(dòng),回到開(kāi)始事務(wù)時(shí)的狀態(tài)。
----------------------------------------------------------------
事務(wù)對(duì)象包含15個(gè)參數(shù):(5個(gè)用來(lái)返回操作的狀態(tài)信息,其它10個(gè)用于設(shè)置和數(shù)據(jù)庫(kù)連接時(shí)的參數(shù))
SQLCode 是否成功標(biāo)志,有三個(gè)可能的取值:0-成功,100-無(wú)數(shù)據(jù),-1-錯(cuò)誤(long)
SQLDBCode 數(shù)據(jù)庫(kù)的錯(cuò)誤代碼(long)
SQLErrText 數(shù)據(jù)庫(kù)的錯(cuò)誤信息(string)
SQLNRows 涉及到的行數(shù)-不同的DBMS有所不同(long)
SQLReturnData DBMS指定的信息(string)
DBMS
Database
LogID
LogPass
ServerName
UserID
DBPass
Lock
DBParm
connect {using sqlca}; //連接數(shù)據(jù)庫(kù),連接后,能夠依據(jù)sqlca.sqlcode的返回值推斷是否正確連接了數(shù)據(jù)庫(kù)
----------------------------------------------------------------
數(shù)據(jù)庫(kù)操作:
選取:
select 字段名集合 into :變量集合 from 表名 where 條件表達(dá)式 {using 事務(wù)對(duì)象名};
select salary,name into :li_salary,:ls_name from salarys where name = :ls_nameusing sqlca;
插入:
insert into 表名(字段列表) values (值列表) {using 事務(wù)對(duì)象};
insert into dept(deptno,deptname,workers) values (:ls_deptno,"銷(xiāo)售部",10);
刪除:
delete from 表名 where 條件表達(dá)式{using 事務(wù)對(duì)象};
delete from 表名 where current of 游標(biāo)名稱(chēng);
delete from dept where workers = 10;
delete form dept where current of dept_cur;
改動(dòng):
update 表名 set 字段名 = :變量名(或常數(shù))[,字段名 = :變量名(或常數(shù))] where 條件{using 事務(wù)對(duì)象};
update 表名 set 字段名 = :變量名(或常數(shù))[,字段名 = :變量名(或常數(shù))] where current of 游標(biāo);
----------------------------------------------------------------
能夠用execute immediate指令來(lái)運(yùn)行隨意的數(shù)據(jù)庫(kù)操作。——?jiǎng)討B(tài)SQL語(yǔ)句
將數(shù)據(jù)庫(kù)指令編輯成一個(gè)字符串,您能夠運(yùn)行不論什么的數(shù)據(jù)定義語(yǔ)句如建表、建主鍵、存儲(chǔ)過(guò)程等
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語(yǔ)句就可以
注意:若,sqlca.autocommit = true,即自己主動(dòng)提交事務(wù),則不須要后面的if……
----------------------------------------------------------------
動(dòng)態(tài)SQL語(yǔ)句有四種類(lèi)型:
既無(wú)輸入?yún)?shù),也無(wú)結(jié)果集;
有輸入?yún)?shù),但沒(méi)有結(jié)果集;
編譯時(shí)已經(jīng)知道參數(shù)和結(jié)果集;
開(kāi)發(fā)程序時(shí)尚不知道參數(shù)和結(jié)果集。
類(lèi)型一
這樣的類(lèi)型的動(dòng)態(tài)SQL語(yǔ)句經(jīng)經(jīng)常使用來(lái)運(yùn)行DLL或者數(shù)據(jù)庫(kù)專(zhuān)用的其它SQL語(yǔ)句。語(yǔ)法格式是:
EXECUTE IMMEDIATE SQLStatement {USING TransactionObject};
當(dāng)中SQLStatement是個(gè)字符串,其內(nèi)容是有效的SQL語(yǔ)句;TransactionObject是事務(wù)對(duì)象名,大括號(hào)表示該子句能夠省略,省略時(shí)使用SQLCA。以下是個(gè)創(chuàng)建刪除數(shù)據(jù)表的樣例:
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
類(lèi)型二
執(zhí)行之前已知參數(shù)個(gè)數(shù)而且沒(méi)有返回值時(shí)使用這樣的類(lèi)型的動(dòng)態(tài)SQL語(yǔ)句。這樣的類(lèi)型的動(dòng)態(tài)SQL語(yǔ)句也可以處理須要在執(zhí)行時(shí)定義參數(shù)的數(shù)據(jù)操作語(yǔ)句。其語(yǔ)法格式是:
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECUTE DynamicStagingArea USING {ParameterList};
當(dāng)中DynamicStagingArea是個(gè)DynamicStagingArea類(lèi)型的變量,該類(lèi)型的缺省全局變量是SQLSA;SQLStatement是個(gè)String類(lèi)型的常量或者變量,其內(nèi)容是有效的SQL語(yǔ)句,SQL語(yǔ)句中使用問(wèn)號(hào)代表所需參數(shù),執(zhí)行時(shí)問(wèn)號(hào)被EXECUTE語(yǔ)句中的SQL語(yǔ)句中的USING子句所代表的值代替;TransactionObject是事務(wù)對(duì)象名,大括號(hào)表示該子句能夠省略,省略時(shí)使用SQLCA;ParamenterList是參數(shù)列表,能夠是變量、常量或者控件的屬性,各參數(shù)相應(yīng)于SQLStatement中的問(wèn)號(hào)。動(dòng)態(tài)策略區(qū)用于準(zhǔn)備SQL語(yǔ)句及所需參數(shù)個(gè)數(shù),它的屬性在執(zhí)行時(shí)應(yīng)用程序不能訪(fǎng)問(wèn),SQLSA是缺省的動(dòng)態(tài)策略區(qū)變量。
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;
類(lèi)型三
這樣的類(lèi)型的動(dòng)態(tài)SQL語(yǔ)句的使用頻率可能是僅次于第一種類(lèi)型,它經(jīng)常使用來(lái)處理參數(shù)個(gè)數(shù)和結(jié)果集在編譯時(shí)已知的情況,又分為游標(biāo)和存儲(chǔ)過(guò)程兩種情況。使用游標(biāo)形式的語(yǔ)法與程序中出現(xiàn)的次序?yàn)椋?
DECLARE Cursor DYNAMIC CURSOR FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
OPEN DYNAMIC Cursor{USING ParameterList};
FETCH Cursor INTO HostVaribaleList;
close Cursor;
使用存儲(chǔ)過(guò)程的第三類(lèi)動(dòng)態(tài)SQL語(yǔ)句的格式和次序與上面的語(yǔ)法形式類(lèi)似,僅僅是使用EXECUTE語(yǔ)句來(lái)取代上面的OPEN語(yǔ)句,其語(yǔ)法格式為:
DECLARE Procedure DYNAMIC PROCEDURE FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECTUE DYNAMIC Procedure{USING ParameterList};
FETCH Procedure INTO HostVariableList;
CLOSE Procedure;
當(dāng)中,Cursor和Procedure各自是游標(biāo)名和過(guò)程名;DynamicStagingArea是動(dòng)態(tài)策略區(qū)變量,通常使用系統(tǒng)提前定義的全局變量SQLSA;SQLStatement是個(gè)字符串(常量或變量均可,變量時(shí)變量名前面加上冒號(hào)),起內(nèi)容是有效的SQL語(yǔ)句,并使用問(wèn)號(hào)代表參數(shù);ParameterList是相應(yīng)于SQLStatement中問(wèn)號(hào)的參數(shù)列表;HostVariableList是PowerScript主變量(即在其前面加上冒號(hào)的PowerScript變量);TransactionObject是事務(wù)對(duì)象名,缺省時(shí)使用SQLCA。
DECLARE語(yǔ)句說(shuō)明動(dòng)態(tài)游標(biāo)或動(dòng)態(tài)過(guò)程,PREPARE語(yǔ)句準(zhǔn)備動(dòng)態(tài)策略區(qū),OPEN或EXECUTE語(yǔ)句打開(kāi)動(dòng)態(tài)游標(biāo)或運(yùn)行動(dòng)態(tài)過(guò)程,F(xiàn)ETCH語(yǔ)句讀取一行數(shù)據(jù),假設(shè)須要讀取多行數(shù)據(jù),那么須要重復(fù)運(yùn)行FETCH語(yǔ)句。最后,CLOSE語(yǔ)句關(guān)閉動(dòng)態(tài)游標(biāo)或動(dòng)態(tài)過(guò)程。FETCH語(yǔ)句和CLOSE語(yǔ)句的使用方法與上節(jié)介紹的方法同樣。以下是第三類(lèi)動(dòng)態(tài)SQL語(yǔ)句的一個(gè)應(yīng)用演示樣例,他得到籍貫是“北京”的雇員:
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語(yǔ)句運(yùn)行狀態(tài)檢查工作,在實(shí)際編敲代碼時(shí),除DECLARE語(yǔ)句外,運(yùn)行了其它SQL語(yǔ)句后,都應(yīng)該檢查事務(wù)對(duì)象的SQLCode屬性,以推斷SQL語(yǔ)句的運(yùn)行是否成功。
使用這樣的類(lèi)型的動(dòng)態(tài)SQL語(yǔ)句能夠創(chuàng)建比較通用的向列表框或者下拉列表框中加入數(shù)據(jù)的腳本。
//////////////////////////////////
//函數(shù)名:wf_addItem(dropdownlistbox fo_obj,string fs_sql)
//參數(shù):fo_obj為下拉列表框,fs_sql為SQL語(yǔ)句
//返回值:無(wú)
//功能:使用參數(shù)指定的SQL語(yǔ)句向指定的下拉列表框中加入數(shù)據(jù)
////////////////////////////////////
string ls_item
declare item_cur dynamic cursor for sqlsa; //定義動(dòng)態(tài)光標(biāo)
prepare sqlsa from :fs_sql using sqlca;
open dynamic item_cur; //打開(kāi)動(dòng)態(tài)光標(biāo)
fetch item_cur into :ls_item; //取數(shù)據(jù)
fo_obj.setredraw(false) //禁止下拉列表框刷新
do while sqlca.sqlcode = 0
fo_obj.additem(ls_item) //向下拉列表框中加入項(xiàng)目
fetch item_cur into :ls_item;
loop
fo_obj.setredraw(true) //刷新下拉列表框
close item_cur; //關(guān)閉動(dòng)態(tài)光標(biāo)
類(lèi)型四
第四類(lèi)動(dòng)態(tài)SQL語(yǔ)句最復(fù)雜,功能也最強(qiáng),它可以處理編程時(shí)尚不知道參數(shù)和結(jié)果集的SQL語(yǔ)句。與第三類(lèi)動(dòng)態(tài)SQL語(yǔ)句相似,第四類(lèi)動(dòng)態(tài)SQL語(yǔ)句也有兩種形式:一種針對(duì)游標(biāo)處理,還有一種則針對(duì)存儲(chǔ)過(guò)程而言,差別在于游標(biāo)處理時(shí)使用OPEN語(yǔ)句而不使用EXECUTE語(yǔ)句,而運(yùn)用存儲(chǔ)過(guò)程時(shí)則使用EXECUTE語(yǔ)句但不使用OPEN語(yǔ)句。以下給出第四類(lèi)動(dòng)態(tài)SQL語(yǔ)句的語(yǔ)法,當(dāng)中Cursor針對(duì)游標(biāo),Procedure針對(duì)存儲(chǔ)過(guò)程:
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;
當(dāng)中,Cursor和Procedure各自是游標(biāo)名和過(guò)程名;DynamicStagingArea是動(dòng)態(tài)策略區(qū)變量,通常使用系統(tǒng)提前定義的全局變量SQLSA;SQLStatement是個(gè)字符串(常量或變量均可,變量時(shí)變量名前面加上冒號(hào)),其內(nèi)容是有效的SQL語(yǔ)句,并使用問(wèn)號(hào)代表參數(shù);DynamicDescriptionArea是動(dòng)態(tài)描寫(xiě)敘述區(qū)變量,這樣的類(lèi)型的變量專(zhuān)門(mén)用來(lái)描寫(xiě)敘述第四類(lèi)動(dòng)態(tài)SQL語(yǔ)句中的輸入和輸出參數(shù),通常使用系統(tǒng)提前定義的全局變量SQLDA;TransactionObject是事務(wù)對(duì)象名,缺省時(shí)使用SQLCA。第四類(lèi)動(dòng)態(tài)SQL語(yǔ)句使用了動(dòng)態(tài)描寫(xiě)敘述區(qū)對(duì)象變量,通過(guò)該變量的四個(gè)屬性NumInputs,InParmType、NumOutputs和OutParmType可以得到輸入?yún)?shù)個(gè)數(shù)、輸入?yún)?shù)類(lèi)型、輸出參數(shù)個(gè)數(shù)和輸出參數(shù)類(lèi)型的信息,當(dāng)中InParmType是個(gè)數(shù)組,每一個(gè)元素依次相應(yīng)于SQL語(yǔ)句中的一個(gè)問(wèn)號(hào);OutParmType也是個(gè)數(shù)組,每一個(gè)元素相應(yīng)于一個(gè)輸出參數(shù)。InParmType和OutParmType的數(shù)據(jù)類(lèi)型是枚舉類(lèi)型ParmType,其取值范圍為以下“適用的參數(shù)類(lèi)型”欄列出的各個(gè)值:
函數(shù)名 適用的參數(shù)類(lèi)型
GetDynamicNumber() TypeInteger!、TypeDecimal!、TypeDouble!、
TypeLong!、TypeTeal!、TypeBoolean!、
TypeUnsingedInteger!、TypeUnsignedLong!
GetDynamicString() TypeString!
GetDynamicDate() TypeDate!
GetDynamicTime() TypeTime!
GetDynamicDateTime() TypeDateTime!
通過(guò)使用該對(duì)象變量的函數(shù)SetDynamicParm()設(shè)置詳細(xì)的輸入?yún)?shù)值。通過(guò)上面的對(duì)象函數(shù)得到輸出參數(shù)(實(shí)際上就是SQL語(yǔ)句的返回?cái)?shù)據(jù))的值,每一個(gè)函數(shù)都針對(duì)特定的數(shù)據(jù)類(lèi)型。
第四類(lèi)動(dòng)態(tài)SQL語(yǔ)句語(yǔ)法格式中各語(yǔ)句的運(yùn)行次序十分重要,僅僅有在前一條語(yǔ)句運(yùn)行成功時(shí),后一條語(yǔ)句的運(yùn)行才有意義,因此,除DECLARE語(yǔ)句外,其它語(yǔ)句運(yùn)行后都應(yīng)該檢查事務(wù)對(duì)象的SQLCode屬性,以推斷當(dāng)前SQL語(yǔ)句的運(yùn)行是否成功。通過(guò)對(duì)次調(diào)用FETCH語(yǔ)句,可以讀取多條數(shù)據(jù),每讀出一條數(shù)據(jù)后,通常在循環(huán)語(yǔ)句中使用CHOOSE CASE確定輸出參數(shù)的類(lèi)型后再用上面的相應(yīng)函數(shù)得到其值。以下是第四類(lèi)動(dòng)態(tài)SQL語(yǔ)句的一個(gè)應(yīng)用演示樣例,當(dāng)中省略了實(shí)際編程中必須具備的檢查事務(wù)對(duì)象SQLCode屬性的過(guò)程(即檢查SQL語(yǔ)句運(yùn)行是否成功):
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("提示","沒(méi)有找到指定的數(shù)據(jù)!")
close my_cursor;
return
end if
do
li_count ++
//當(dāng)FETCH語(yǔ)句運(yùn)行成功時(shí),動(dòng)態(tài)描寫(xiě)敘述區(qū)SQLDA中包括了結(jié)果集的第一行數(shù)據(jù)
//,重復(fù)運(yùn)行FETCH語(yǔ)句就可以得到其余數(shù)據(jù)。
//SQLDA.NumOutputs中包括了輸出參數(shù)的個(gè)數(shù)。
//SQLDA.OutParmType數(shù)組中包括了各參數(shù)的數(shù)據(jù)類(lèi)型,如TypeInteger!等
//使用choose case語(yǔ)句針對(duì)不同的輸出參數(shù)類(lèi)型調(diào)用不同的對(duì)象函數(shù)得到
//對(duì)應(yīng)參數(shù)的值。
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;
*詳細(xì)見(jiàn)幫助
----------------------------------------------------------------
使用游標(biāo)步驟:
1)定義游標(biāo)
declare cursor 游標(biāo)名 for
select 字段名 from 表名
where 條件表達(dá)式 {using 事務(wù)對(duì)象};
2)打開(kāi)游標(biāo)
open 游標(biāo)名稱(chēng);
打開(kāi)游標(biāo)后游標(biāo)中就保存了對(duì)應(yīng)的返回結(jié)果
3)讀取數(shù)據(jù)
fetch 游標(biāo)名稱(chēng) into :變量列表;
4)關(guān)閉游標(biāo)
close 游標(biāo)名稱(chēng);
循環(huán)處理游標(biāo)時(shí),通過(guò)推斷事務(wù)對(duì)象的參數(shù)能夠知道是否處理全然部的數(shù)據(jù)。即通過(guò)事務(wù)對(duì)象的參數(shù)SQLcode來(lái)推斷是否處理全然部的數(shù)據(jù)。
fetch……;
do while salca.sqlcode = 0
//
fetch……;
loop
for li_index = 1 to sqlca.sqlnrows
//
fetch……;
next
----------------------------------------------------------------
事務(wù)對(duì)象相當(dāng)于一個(gè)聯(lián)絡(luò)員,專(zhuān)門(mén)用于PowerBuilder應(yīng)用程序和數(shù)據(jù)庫(kù)之間的通信。在訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)之前,必須首先建立一個(gè)事務(wù)對(duì)象,通過(guò)事務(wù)對(duì)象和數(shù)據(jù)庫(kù)建立聯(lián)結(jié),之后才干和數(shù)據(jù)庫(kù)打交道,全部和數(shù)據(jù)的相關(guān)操作都是通過(guò)這個(gè)聯(lián)絡(luò)員進(jìn)行的。事務(wù)是和事務(wù)對(duì)象緊密相關(guān)的一個(gè)概念,是事務(wù)對(duì)象進(jìn)行工作時(shí)的最小單位,由一個(gè)或者多個(gè)SQL語(yǔ)句組成的。一個(gè)事務(wù)中的全部SQL語(yǔ)句都正確運(yùn)行,整個(gè)事務(wù)才干順利提交,僅僅要有一個(gè)SQL語(yǔ)句失敗,該事務(wù)中前面已經(jīng)做的操作都要被撤消,又一次回到該事務(wù)開(kāi)始的狀態(tài)。事務(wù)處理就是通過(guò)事務(wù)對(duì)象和相關(guān)SQL語(yǔ)句進(jìn)行的。
PowerBuilder中,有4個(gè)SQL語(yǔ)句專(zhuān)門(mén)進(jìn)行事務(wù)處理,它們是connect,disconnect,commit和rollback,分別負(fù)責(zé)和數(shù)據(jù)庫(kù)建立聯(lián)接、斷開(kāi)聯(lián)接、提交事務(wù)和回退事務(wù)等。在進(jìn)行數(shù)據(jù)窗體檢索或者運(yùn)行SQL語(yǔ)句之前,首先應(yīng)該使用connect語(yǔ)句和數(shù)據(jù)庫(kù)建立正確的聯(lián)接;當(dāng)全部和數(shù)據(jù)庫(kù)相關(guān)的操作完畢后,能夠使用disconnect語(yǔ)句和數(shù)據(jù)庫(kù)斷開(kāi)聯(lián)接。commit用來(lái)提交一個(gè)事務(wù),rollback用來(lái)回退一個(gè)事務(wù)。這四個(gè)事務(wù)管理語(yǔ)句的格式相類(lèi)似,例如以下所看到的:
statement {using transaction};
當(dāng)中,statement代表四個(gè)單詞中的隨意一個(gè),transaction是事務(wù)對(duì)象的名稱(chēng),假設(shè)省略,則使用缺省的全局事務(wù)對(duì)象SQLCA。程序猿也能夠聲明自己的事務(wù)對(duì)象類(lèi)型的變量。若使用自己聲明的事務(wù)對(duì)象,應(yīng)該在聲明之后使用create語(yǔ)句創(chuàng)建對(duì)象,使用完成后運(yùn)行destroy語(yǔ)句銷(xiāo)毀自己定義的事務(wù)對(duì)象。而且在涉及事務(wù)對(duì)象的SQL語(yǔ)句中都要加上using transaction子句。以下是一個(gè)使用自己定義事務(wù)對(duì)象的完整樣例:
(1)聲明全局變量:transaction my_SQLCA。
(2)在應(yīng)用對(duì)象的Open事件中編寫(xiě)例如以下腳本:
my_Sqlca = Create transaction //創(chuàng)建事務(wù)對(duì)象
//以下語(yǔ)句給事務(wù)對(duì)象中的成員變量賦值
my_Sqlca.DBMS =ProfileString("PB.INI","Database","DBMS", "")
my_Sqlca.Database =ProfileString("PB.INI","Database","DataBase"," ")
…………. //設(shè)置事務(wù)對(duì)象my_SQLCA的其它參數(shù)
connect using my_Sqlca; //聯(lián)接數(shù)據(jù)庫(kù)
If my_Sqlca.Sqlcode=0 Then //推斷是否正確聯(lián)接
Open(w_main) //正確聯(lián)接則打開(kāi)主窗體
Else //否則
MessageBox(String(my_Sqlca.Sqlcode),"不能和數(shù)據(jù)庫(kù)聯(lián)接!")//顯示錯(cuò)誤信息
Halt Close; //關(guān)閉應(yīng)用
End If
(3)在應(yīng)用對(duì)象的Close事件中釋放事務(wù)對(duì)象,編寫(xiě)例如以下腳本:
Disconnect Using my_Sqlca; //斷開(kāi)和數(shù)據(jù)庫(kù)的聯(lián)結(jié)
destroy my_Sqlca; //釋放事務(wù)對(duì)象
和數(shù)據(jù)庫(kù)建立聯(lián)接后,能夠完畢操作數(shù)據(jù)庫(kù)的工作并運(yùn)行commit或rollback。在每一個(gè)commit或rollback之后關(guān)閉舊的事務(wù)處理,并開(kāi)始新的事務(wù)處理。在一個(gè)事務(wù)處理過(guò)程中,應(yīng)用程序控制著數(shù)據(jù)庫(kù),并由DBMS依據(jù)一定的機(jī)制對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)加鎖。假設(shè)一個(gè)事務(wù)的持續(xù)時(shí)間過(guò)長(zhǎng),就會(huì)導(dǎo)致很多的問(wèn)題。比如,對(duì)于一個(gè)典型的生產(chǎn)系統(tǒng),每天將自己主動(dòng)或者人工進(jìn)行事務(wù)日志轉(zhuǎn)儲(chǔ)。假設(shè)該系統(tǒng)的某類(lèi)client應(yīng)用程序整天運(yùn)行而且僅僅進(jìn)行僅僅讀查詢(xún),那么在使用connect語(yǔ)句啟動(dòng)事務(wù)之后事務(wù)總是處于激活狀態(tài),不論什么轉(zhuǎn)儲(chǔ)或者截?cái)嗳罩镜钠髨D都不會(huì)生效,終于將導(dǎo)致日志爆滿(mǎn)而引起整個(gè)數(shù)據(jù)庫(kù)的問(wèn)題。所以,PowerBuilder給事務(wù)對(duì)象提供了一個(gè)能夠選擇自己主動(dòng)提交事務(wù)的成員變量,即AuToCommit,將該參數(shù)設(shè)置為T(mén)rue能夠在事務(wù)對(duì)象所包括的每一個(gè)語(yǔ)句運(yùn)行完后自己主動(dòng)運(yùn)行commit,從而結(jié)束一個(gè)事務(wù)。第二種解決方法是由開(kāi)發(fā)者在腳本中使用事務(wù)管理語(yǔ)句顯式地管理事務(wù),這須要更好地理解事務(wù)。
數(shù)據(jù)窗體是和數(shù)據(jù)庫(kù)打交道的一個(gè)主要控件,在運(yùn)行數(shù)據(jù)窗體的功能之前必須首先給數(shù)據(jù)窗體控件正確設(shè)置事務(wù)對(duì)象。一般在數(shù)據(jù)檢索之前使用函數(shù)SetTrans或SetTransObject設(shè)置事務(wù)對(duì)象。使用不同的函數(shù),數(shù)據(jù)窗體的事務(wù)處理方式就不同。函數(shù)SetTrans的語(yǔ)法格式例如以下所看到的:
dwcontrol.SetTrans( transaction )
當(dāng)中,dwcontrol是要設(shè)置的事務(wù)對(duì)象的數(shù)據(jù)窗體控件名稱(chēng),transaction是事務(wù)對(duì)象名稱(chēng)。若函數(shù)正確運(yùn)行,則返回1,否則返回-1;隨意參數(shù)為NULL則返回NULL。函數(shù)SetTransObject和該函數(shù)的格式、參數(shù)與返回值全然同樣。
函數(shù)SetTrans設(shè)置事務(wù)對(duì)象后,數(shù)據(jù)窗體能夠自己主動(dòng)管理事務(wù)的處理,事務(wù)中所包括的每一個(gè)功能或者語(yǔ)句運(yùn)行完后都自己主動(dòng)進(jìn)行事務(wù)管理。而函數(shù) SetTransObject設(shè)置事務(wù)對(duì)象后,數(shù)據(jù)窗體的事務(wù)處理得由腳本控制,除非在和數(shù)據(jù)庫(kù)建立聯(lián)接之前將事務(wù)對(duì)象的AuToCommit成員變量設(shè)置成了True。盡管數(shù)據(jù)窗體自己主動(dòng)進(jìn)行事務(wù)處理能夠省去一些關(guān)于事務(wù)處理的腳本,可是也帶來(lái)了非常多的潛在危急。每次運(yùn)行檢索或改動(dòng)等操作之前自己主動(dòng)聯(lián)接數(shù)據(jù)庫(kù),運(yùn)行完后自己主動(dòng)運(yùn)行disconnect,無(wú)需再運(yùn)行connect,commit,rollback或disconnect了。運(yùn)行過(guò)程中的不論什么錯(cuò)誤都會(huì)導(dǎo)致自己主動(dòng)運(yùn)行rollback,腳本對(duì)事務(wù)處理別無(wú)選擇,無(wú)法控制事務(wù)的處理。在應(yīng)用系統(tǒng)中和數(shù)據(jù)庫(kù)的聯(lián)接非常少時(shí),能夠由系統(tǒng)自己主動(dòng)進(jìn)行事務(wù)處理,這時(shí)使用函數(shù)SetTrans給數(shù)據(jù)窗體控件設(shè)置事務(wù)對(duì)象。通常情況下,使用SetTransObject設(shè)置事務(wù)對(duì)象能夠使數(shù)據(jù)窗體有更高的運(yùn)行效率。建議使用SetTransObject給數(shù)據(jù)窗體控件設(shè)置事務(wù)對(duì)象。
另外,函數(shù)SetTransPool能夠設(shè)置事務(wù)對(duì)象共享,也影響著事務(wù)的處理。使用該函數(shù)不僅能夠?qū)?shù)據(jù)庫(kù)的吞吐量最大化,還能夠控制同一時(shí)候打開(kāi)的數(shù)據(jù)庫(kù)聯(lián)接的最大個(gè)數(shù)。假設(shè)在應(yīng)用程序中設(shè)置了事務(wù)對(duì)象共享,當(dāng)使用一個(gè)事務(wù)對(duì)象進(jìn)行數(shù)據(jù)庫(kù)聯(lián)接時(shí),系統(tǒng)首先檢查是否存在和要使用的事務(wù)對(duì)象成員變量取值全然同樣的事務(wù)對(duì)象。假設(shè)存在,就沒(méi)有必要再又一次創(chuàng)建事務(wù)對(duì)象,利用已經(jīng)存在的事務(wù)對(duì)象就可以,而且在有事務(wù)對(duì)象共享時(shí),運(yùn)行commit語(yǔ)句也不會(huì)真正從物理上終止一個(gè)事務(wù),而僅僅是在邏輯上終止該事務(wù)。當(dāng)有新的同樣取值的事務(wù)建立時(shí),又一次啟用該事務(wù)對(duì)象。該函數(shù)的語(yǔ)法格式是:
applicationname.SetTransPool ( minimum, maximum, timeout )
當(dāng)中,applicationname是應(yīng)用對(duì)象名稱(chēng);minimum和maximum是在事務(wù)對(duì)象池中要保證打開(kāi)的事務(wù)對(duì)象的最少個(gè)數(shù)和最多個(gè)數(shù),minimum必須小于或者等于maximum;timeout是建立數(shù)據(jù)庫(kù)聯(lián)接時(shí)的最長(zhǎng)等待時(shí)間,超過(guò)該時(shí)間還不能成功建立聯(lián)接就返回錯(cuò)誤信息。若函數(shù)正確運(yùn)行,則返回1,否則返回-1。以下是該函數(shù)的一個(gè)實(shí)例:
GetApplication().SetTransPool(12,16,10)
上面的語(yǔ)句首先使用函數(shù)GetApplication獲取當(dāng)前的應(yīng)用對(duì)象,然后給該應(yīng)用對(duì)象設(shè)置事務(wù)對(duì)象共享,最少打開(kāi)事務(wù)對(duì)象12個(gè),最多16個(gè),聯(lián)接時(shí)最長(zhǎng)等待時(shí)間是10秒。
建議在進(jìn)行數(shù)據(jù)庫(kù)聯(lián)接之前使用該函數(shù),一般是在應(yīng)用對(duì)象的Open事件中首先使用該函數(shù)建立事務(wù)對(duì)象共享,然后再創(chuàng)建要使用的事務(wù)對(duì)象,進(jìn)行和數(shù)據(jù)庫(kù)的聯(lián)接。當(dāng)在應(yīng)用中須要維護(hù)多個(gè)聯(lián)接,而且包括大量訪(fǎng)問(wèn)同樣數(shù)據(jù)源的簡(jiǎn)短事務(wù)時(shí),使用該函數(shù)創(chuàng)建事務(wù)對(duì)象共享能夠提高應(yīng)用程序的運(yùn)行效率。以下是一個(gè)在應(yīng)用對(duì)象的Open事件中創(chuàng)建事務(wù)對(duì)象共享的腳本:
If GetApplication().SetTransPool(12,16,10) <> 1 Then
MessageBox("提示","錯(cuò)誤!")
Halt Close;
Else
SQLCA.DBMS=ProfileString("PB.INI","Database","DBMS", "")
SQLCA.Database=ProfileString("PB.INI","Database","DataBase"," ")
… //設(shè)置其它的SQLCA成員變量取值
Connect; //使用SQLCA事務(wù)對(duì)象進(jìn)行聯(lián)接
If SQLCA.SQLcode = 0 Then //聯(lián)接成功則
Open(w_main) //打開(kāi)主操作窗體
Else //聯(lián)結(jié)不成功則顯示錯(cuò)誤信息
Messagebox("錯(cuò)誤!",String(SQLCA.SQLDBCode) +"~r~n" + SQLCA.SQLErrText)
Halt Close; //關(guān)閉應(yīng)用軟件
End If
End If
在上面的腳本中,假設(shè)正確建立了事務(wù)對(duì)象共享,而且運(yùn)行connect也正確,則系統(tǒng)自己主動(dòng)打開(kāi)12個(gè)事務(wù)對(duì)象。
----------------------------------------------------------------
在PowerBuilder的數(shù)據(jù)庫(kù)中有5個(gè)表,用來(lái)記錄數(shù)據(jù)庫(kù)中其它表的有關(guān)信息,而且這5
個(gè)表由PowerBuilder自己主動(dòng)維護(hù),通常把這5個(gè)表稱(chēng)為PowerBuilder的倉(cāng)庫(kù)。這個(gè)倉(cāng)庫(kù)同意收
集和維護(hù)擴(kuò)展列屬性。
PBCatTbl 記錄當(dāng)前數(shù)據(jù)庫(kù)中表的信息
PBCatCol 記錄各個(gè)表中的列的相關(guān)信息
PBCatEdt 編輯樣式
PBCatFmt 顯示樣式
PBCatVld 有效性驗(yàn)證規(guī)則
當(dāng)使用PowerBuilder創(chuàng)建數(shù)據(jù)表時(shí),PowerBuilder能夠自己主動(dòng)維護(hù)這5個(gè)表。當(dāng)使用PB以外的工具創(chuàng)建數(shù)據(jù)表時(shí),新建數(shù)據(jù)表的信息不會(huì)自己主動(dòng)加入到倉(cāng)庫(kù)中,這時(shí)非常多開(kāi)發(fā)者的錯(cuò)誤是將信息手工輸入到倉(cāng)庫(kù)中。正確的操作應(yīng)該是運(yùn)行database畫(huà)板的Design菜單下的Synch Extended Attributes菜單項(xiàng)的功能,這樣倉(cāng)庫(kù)能夠自己主動(dòng)更新。在編程時(shí)常常使用的有兩個(gè)表,即存放表信息的PBCatTbl和存放字段信息的PBCatCol。
PBCatTbl:當(dāng)中pbt_tname用來(lái)存放其它表名,pbt_ownr用來(lái)存放表的擁有者,pbt_cmnt用來(lái)存放表的凝視,這三個(gè)字段在編程時(shí)常常使用,其它字段非常少使用。使用這三個(gè)字段能夠提取系統(tǒng)中的全部表,為了構(gòu)造比較友好的界面,顯示給用戶(hù)的通常是字段pbt_cmnt中的內(nèi)容,該表的索引基于字段pbt_tnam和pbt_ownr。
PBCatCol:當(dāng)中,pbc_tnam用來(lái)存放表名,pbc_ownr用來(lái)存放表的擁有者,pbc_cid是記錄字段創(chuàng)建順序的,pbc_cnam用來(lái)存放字段名稱(chēng),pbc_labl用來(lái)存放字段的標(biāo)號(hào),pbc_cmnt用來(lái)存放字段的凝視。這些字段在編程時(shí)常常使用,當(dāng)中pbc_cmnt常常顯示在用戶(hù)界面中。
----------------------------------------------------------------
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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