如何使用LoadRunner9.0動態訪問Oracle數據庫
最近在公司搞loadrunner腳本,需要訪問數據庫取一個動態值,在網上看到的一個是通過loadrunner的parameters自動生成一個表格,但這個東西是靜態的,不會隨著腳本的運行而變化,還有就是大神kernzhang流傳的getdata.dll,但是執行sql無法獲得結果,他的個人主頁也打不開了-_-!!!無法得到源碼,根本不知道咋用。
#include
static LRD_INIT_INFO InitInfo={LRD_INIT_INFO_EYECAT};
static LRD_DEFAULT_DB_VERSION DBTypeVersion[]={{LRD_DBTYPE_NONE,LRD_DBVERSION_NONE}};
//這里的LRD_VAR_DESC數據結構聲明是很重要的,他是用來存儲sql結果數據集的結構體,第一個參數頭文件中就是這么寫的,第二個參數是最大行數,第三個參數是每一行的最大長度,如果獲得的查詢結果比定義的長,運行時就會報錯,提示列被截斷,最后一個參數是查詢結果的類型,可以再幫助中的索引輸入data types, database,列出的表格中是各種變量類型的名稱
static LRD_VAR_DESC NUM ={LRD_VAR_DESC_EYECAT, 10, 32, LRD_DBTYPE_ORACLE, {1, 1, 0},DT_LONG_VARCHAR};
//下面這些句柄等變量的申請都可以照著幫助中的例子寫
static void FAR * OraEnv1;
static void FAR * OraSvc1;
static void FAR * OraSrv1;
static void FAR * OraSes1;
static void FAR * OraStm1;
static void FAR * OraDef1;
unsigned long rownum;
vuser_init()
{
//初始化數據庫
lrd_init(&InitInfo,DBTypeVersion);
lrd_initialize_db(LRD_DBTYPE_ORACLE,3,0);
lrd_env_init(LRD_DBTYPE_ORACLE,&OraEnv1,0,0);
lrd_ora8_handle_alloc(OraEnv1,SVCCTX,&OraSvc1,0);
lrd_ora8_handle_alloc(OraEnv1,SERVER,&OraSrv1,0);
lrd_ora8_handle_alloc(OraEnv1,SESSION,&OraSes1,0);
//設置數據庫名稱,我的是oracle,odbc中連接數據庫名稱就是這個
lrd_server_attach(OraSrv1,"db_192.168.0.101",-1,0,0);
lrd_ora8_attr_set_from_handle(OraSvc1,SERVER,OraSrv1,0,0);
//用戶名和密碼
lrd_ora8_attr_set(OraSes1,USERNAME,"eeim2",-1,0);
lrd_ora8_attr_set(OraSes1,PASSWORD,"eeim2",-1,0);
lrd_ora8_attr_set_from_handle(OraSvc1,SESSION,OraSes1,0,0);
lrd_session_begin(OraSvc1,OraSes1,1,0,0);
lrd_ora8_handle_alloc(OraEnv1,STMT,&OraStm1,0);
return 0;
}
Action()
{
//這里寫上你的sql語句(我主要是需要查詢的結果,如果你是插入或修改記錄就不用往后看了)
lrd_ora8_stmt(OraStm1,"select R_V from ce_receviablecharge where user_no = 2009070901",1,0,0);
//執行定義的sql,并且將結果行數返回到rownum中
lrd_ora8_exec(OraSvc1,OraStm1,0,0,&rownum,0,0,0,0,1);
//綁定該列
lrd_ora8_bind_col(OraStm1,&OraDef1,1,&NUM,0,0);
//設定保存列中的某個數據到row中,第二個參數為第幾列,第三個參數為第幾行(只能保存一個值),最后一個參數就是你想要保存到的parameter名稱
lrd_ora8_save_col(OraStm1, 1, 1, 0, "result");
//這個遍歷剛才查詢的結果,第二個參數0表示就1行,負號表示遍歷所有結果,絕對值表示實際有多少行,第三個參數表示一次遍歷最大進行多少行(不能大于LRD_VAR_DESC中定義的第二個參數,即最大行數)
lrd_ora8_fetch(OraStm1, -2, 2 &rownum, 0, 2, 0, 0);
//這里我用error是為了看得醒目,不要認為是出錯了
lr_error_message("sql result: %s", lr_eval_string("{result}"));
return 0;
}
vuser_end()
{
lrd_session_end(OraSvc1, OraSes1, 0, 0);
lrd_server_detach(OraSrv1, 0, 0);
lrd_handle_free(&OraEnv1, 0);
return 0;
}
最后通過lrd系列的函數解決了這個問題,現在跟大家分享一下!!!它是基于odbc訪問數據庫的原理,主要的東西除了在幫助中,還有就是看看lrd.h中的定義說明。
到此就結束了,但是這個東西目前我只是支持取出一個結果放到parameter中,還搞不懂如和將所有數據放入parameter中,來作為自動化時多用戶使用的參數。在此拋磚引玉,希望有達人能夠解決!!!
另外要注意的是,如果你是錄制了一個http協議的腳本,那么編譯時無法通過的,需要創建一個odbc和http協議的混合腳本寫入這些代碼,然后再創建一個http腳本進行錄制,然后將http中錄制的腳本內容拷貝過來。俺也不知道為什么,如果我先錄制腳本再插入這些代碼總是提示lrd_init()未知錯誤:
vuser_init.c(19): Error: C interpreter run time error: vuser_init.c (19): Error -- Unresolved symbol : lrdfnc_init.
vuser_init.c(19): Notify: CCI trace: Compiled_code(0): vuser_init()
這個東西后來我將sql語句進行了參數化,這樣可以保證每個模擬的用戶得到不同的值(別忘了在參數中選擇Unique)。關聯也可以取得這些參數,但是我那個錄制的腳本中無法自動關聯,手動關聯只有調出所有日志,才能找到服務器發送的參數,一次20分鐘……而且長時間運行有時候會偶爾出現找不到參數信息,懷疑是由于發送消息超時的原因。
使用數據庫會造成數據庫服務器的負荷,如果進行數據庫測試,建議使用關聯,否則可能影響服務器性能。
原文轉自:http://www.anti-gravitydesign.com