otl之oracle開發總結---轉
關 於otl,網上介紹的也不少,但看來看去也只是官方的那些文件。otl很好用,結合官方提供的一些例子,多多嘗試才能領悟。經過乙個月左右的專案開發,對 otl也有些了解,在這裡總結一下,希望對剛接觸otl的新手有所幫助。其中有些地方,比如對網路異常的處理,可是費了我兩天的時間才解決的,我那個汗 哪。廢話少說,開始正題:
一、開始前的準備工作
在使用otl進行程式設計之前,要首先確定使用的oralce版本以及所選用的字符集。otl支援目前幾乎所有的主流資料庫,可以通過巨集啟用otlv4.h中對應的資料庫操作介面。
如:使用oracle 11g r2、字符集選擇utf8,則可在包含otlv4.h之前宣告以下兩個巨集:
#define otl_ora11g_r2
#define otl_ora_utf8
#include "otlv4.h"
二、常用類及其常用成員
1. otl_connect類
static int otl_initialize(const int threaded_mode=0):用於初始化otl環境的靜態函式,引數指定是用於多執行緒還是單執行緒。它不保證執行緒安全,也就是說,如果多個執行緒共享使 用乙個otl_connect物件,需要加鎖進行控制。有個同事因為在多執行緒環境下使用了預設的引數0,就導致了程式異常。但是單執行緒環境下,引數設1是 沒有問題的。所以,可以考慮將此引數直接設為1。
const char *connect_str:連線字串,格式為:"使用者名稱/密碼@資料庫服務名"
const int aauto_commit:自動提交模式。若此引數設為0(預設),則通過此連線物件執行的事務不會自動提交。如使用direct_exec執行刪除記錄 的操作時,需要手動呼叫commit()成員函式提交事務;若設為1則通過此otl_connect物件開啟的事務會自動提交。
long direct_exec(...):
const char *sqlstm: 指定所要執行的「靜態sql語句」,即不產生輸入或輸出的sql語句。如delete from book where name='c++『 。但是不能執行如select sysdate from dual或select * from book亦或delete from book where name=:f1之類的語句,因為它們會帶有輸入或輸出,此類sql語句可以通過otl_stream實現,下面會有介 紹。
int ignore_error:是否忽略異常。可以指定otl_exception::disable禁用異常,否則程式需要使用try...catch(otl_exception &e)...捕獲並處理異常。
int connected:此成員變數標識了連線物件是否連線成功,一旦連線成功其值即為1。即便後來網路斷掉了,此值仍舊保持不變,logoff()後此值變為0。所以此變數只能用於檢查rlogon是否連線成功,而不能判斷當前與資料庫的連線是否正常。
2. otl_stream類
void open(...):為流物件關聯乙個sql語句,可以是帶輸入或輸出的sql語句或pl/sql塊。
const int arr_size:指定流緩衝區的大小。作為輸出流使用時,若輸出緩衝區中的記錄數達到此值即緩衝區滿時,會自動重新整理緩衝區,若已設設定了自動提交則一併提交資料(預設);
const char *sqlstm:sql語句,可以指定繫結變數,如:delete from book where id = :f1and price = :f2;
otl_connect &db:流所使用的資料庫連線物件。
void set_commit(int auto_commit=0):設定流被重新整理時否自動提交事務。兩種條件下流會被重新整理:a.緩衝區滿 b.手動呼叫flush成員函式
void flush(...):執行和流關聯的sql語句。如執行:
otl_stream delstream;
delstream.open(100, delete from book where id = :f1and price = :f2, dbconnect); //正常情況下向流中加入100條記錄時才執行刪除
delstream << 1;
delsteam << 'c++';
long get_rpc():獲取流中sql語句執行後所影響到的記錄數,如插入100條記錄,則呼叫此函式返回的即為100
int good():判斷流物件是否已正常開啟,已開啟返回1。注意:若復用乙個流物件時,必須先呼叫close函式將其關閉,然後再呼叫open重新開啟。
int get_dirty_buf_len():獲取當前流物件緩衝區中的記錄數,其最大值為緩衝區size-1。每當緩衝區滿時會自動重新整理,重新整理後再呼叫此函式時返回0
3.otl_exception類
該類的幾個成員用於表示異常的資訊,如:
char stm_text[2048]:出錯的sql語句;
char var_info[256]:若在流中使用了與實際型別不符的繫結變數,此陣列的值為繫結變數的資訊;
unsigned char msg[1000]:這個我比較喜歡用,此陣列顯示出具體的異常資訊(包括oracle返回的錯誤碼),如連線超時等等。
二、對於網路異常的處理
現在專案對於程式的異常處理能力要求越來越高,比如網路中斷或資料庫出現異常等,要求在故障恢復後,程式能正常與資料庫保持連線,使業務盡可能的少受影響。可以通過以下方法解決此種情況。這也是折磨了我兩天的乙個問題:(
首先,程式要在提交資料的地方使用try...catch捕獲otl_exception異常,當提交失敗時,otl會丟擲此異常並攜帶異常資訊;
其次,要在捕獲到異常之後,關閉之前的連線物件(如果有流使用此連線物件,則一定要先關閉流物件,然後再斷開otl_connect物件);
最後,重新連線資料庫並再次初始化流物件。
如:void reconnect(otl_connect &otlconnect, const char *pconnstr, int iautocommit);
//宣告otl物件並初始化物件
otl_connect dbconn;
otl_stream outstream;
void init(void)
catch (otl_exception &e)
}//提交資料的函式
void submit(void)
}catch(otl_exception &e)
}//重新連線連線資料庫函式
void reconnect(otl_connect &otlconnect, const char *pconnstr, int iautocommit)
retry:
trycatch (otl_exception &e)
}這樣,呼叫submit函式提交資料時,就有了網路異常處理功能,若提交失敗則會一直嘗試重新連線,直到連線成功為止。
linux下使用otl開發oracle資料庫程式
include using namespace std include define otl stream read iterator on define otl ora9i compile otl 4.0 oci9i include include the otl 4.0 header file ...
測試開發過程總結 轉貼
很不錯的文章,所以轉貼之!最近公司的產品一直忙於測試,看著每天的bug不斷的增加和修正,真是痛並快樂著,痛苦是因為bug不斷的出現,快樂是看著bug乙個乙個的被消滅,把這些天的測試開發過程總結一下。1 測試要盡早 公司的產品已經修訂一段時間了,但是由於任務繁忙和人手不足,因此測試一直拖後,因此當進行...
用友二次開發之總賬自定義結轉
用友總賬的自定義結轉看起來比較複雜,如果你啟用了部門,專案核算的話。應客戶的要求,對g6 11.0版本寫了乙個自定義結轉工具。g6 11.0的專案核算裡相對t6,u8更為複雜,裡面增加了自定義輸助核算。所以現下這版本隻針反g6 系統。t6或u8下若想使用得修改原始碼了。提取資料後,按生成憑證,直接將...