如何使用LoadRunner9.0動態訪問Oracle數據庫

發表于:2009-09-14來源:作者:點擊數: 標簽:數據庫oracleOracleORACLE訪問
如何使用 LoadRunner 9.0動態訪問 Oracle 數據庫 最近在公司搞 loadrunner 腳本,需要訪問數據庫取一個動態值,在網上看到的一個是通過loadrunner的parameters自動生成一個表格,但這個東西是靜態的,不會隨著腳本的運行而變化,還有就是大神kernzhang流傳的

如何使用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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97