發(fā)文章
發(fā)文工具
撰寫(xiě)
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
為了測(cè)試這個(gè)存儲(chǔ)過(guò)程,我遙了一圈去做這個(gè)事情,這里說(shuō)一下我自己接受到任務(wù)和自己開(kāi)始是怎么想的。
方法一:
一開(kāi)始我想著可以使用C#直接去調(diào)用存儲(chǔ)過(guò)程,然后用Loadrunner調(diào)用C#的dll去測(cè)試,后來(lái)發(fā)現(xiàn)找不到LoadRunner怎樣直接調(diào)用C#寫(xiě)的dll;可是dll存儲(chǔ)過(guò)程都已經(jīng)寫(xiě)好,不可能推倒重新用其他的方式去做,由于任務(wù)時(shí)間比較緊,就山寨的用C#寫(xiě)了個(gè) .exe 去調(diào)用 dll,完成后執(zhí)行,印象是:數(shù)據(jù)庫(kù)跟本一點(diǎn)壓力都沒(méi)有,可是負(fù)載機(jī)都已經(jīng) 100%了,并且這種做法得需要在每臺(tái)負(fù)載機(jī)都安裝一個(gè)oracle 客戶端,要不訪問(wèn)不了,負(fù)載機(jī)有 30臺(tái),每臺(tái)都去安裝一編,我倒!
方法二:
最后想到一種方法,寫(xiě)一個(gè)WebService 去調(diào)用Dll,Loadrunner再去調(diào)用WebService去進(jìn)行測(cè)試。(這種做法是不是很笨?有沒(méi)有其他更好的方法,請(qǐng)留言給我!)
下面就把整個(gè)過(guò)程詳細(xì)列一下,其實(shí)這個(gè)之前也都有做過(guò),但由于沒(méi)有記錄到博客,全忘記了,重寫(xiě)是多么的痛苦,血的教訓(xùn)說(shuō)明:寫(xiě)博客還是有必需的!
Step1:編寫(xiě)訪問(wèn)存儲(chǔ)過(guò)程的dll
using System; using System.Collections.Generic; using System.Data; using System.Data.OracleClient; using System.Linq; using System.Text; namespace PaysysInterfaceTest { public class PaysysBase { public OracleConnection conn = null; public OracleCommand cmd = null; /// <summary> /// 數(shù)據(jù)庫(kù)初始化 /// </summary> /// <param name="DataSource">數(shù)據(jù)庫(kù)源(Orlacle Client下的tnsnames.ora配置</param> /// <param name="DataUserId">數(shù)據(jù)庫(kù)登錄名</param> /// <param name="DataPassword">數(shù)據(jù)庫(kù)登錄密碼</param> /// <returns></returns> public int PaysysInit(string DataSource, string DataUserId, string DataPassword) { var mConn = string.Format("Data Source={0};User Id={1};Password={2};", DataSource, DataUserId, DataPassword); conn = new OracleConnection(mConn); try { conn.Open(); cmd = new OracleCommand(); cmd.Connection = conn; } catch (Exception ex) { return 0; } return 1; } /// <summary> /// 調(diào)用的存儲(chǔ)過(guò)程 /// </summary> /// <param name="interfaceName">存儲(chǔ)過(guò)程名稱</param> /// <returns></returns> public int CallInterface(string interfaceName) { var nResult = 0; var queryString = interfaceName; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = queryString; try { cmd.ExecuteNonQuery(); Console.WriteLine("Query Success!!"); nResult = Convert.ToInt32(cmd.Parameters["result"].Value); } catch (Exception ex) { Console.WriteLine("Query Error!!\r\n" + ex.Message); nResult = Convert.ToInt32(cmd.Parameters["result"].Value); ; } finally { cmd.Clone(); conn.Close(); Console.WriteLine("Close Db"); } return nResult; } } public class PlayerLogin : PaysysBase { public string s_account = ""; public string s_password = ""; /// <summary> /// 存儲(chǔ)過(guò)程初始化參數(shù) /// </summary> /// <param name="account">用戶賬號(hào)</param> /// <param name="password">用戶密碼</param> public void LoginInit(string account, string password) { s_account = account; s_password = password; InitParam(); } /// <summary> /// 初始化信息 /// </summary> private void InitParam() { //反回值 cmd.Parameters.Add("result", OracleType.Float); cmd.Parameters["result"].Direction = ParameterDirection.ReturnValue; cmd.Parameters.Add("s_account", OracleType.VarChar); cmd.Parameters["s_account"].Direction = ParameterDirection.Input; cmd.Parameters["s_account"].Value = s_account; cmd.Parameters.Add("s_password", OracleType.VarChar); cmd.Parameters["s_password"].Direction = ParameterDirection.Input; cmd.Parameters["s_password"].Value = s_password; //==================out================== cmd.Parameters.Add("d_login_time", OracleType.DateTime); cmd.Parameters["d_login_time"].Direction = ParameterDirection.Output; cmd.Parameters.Add("d_last_login_time", OracleType.DateTime); cmd.Parameters["d_last_login_time"].Direction = ParameterDirection.Output; cmd.Parameters.Add("d_last_logout_time", OracleType.DateTime); cmd.Parameters["d_last_logout_time"].Direction = ParameterDirection.Output; } /// <summary> /// 調(diào)用執(zhí)行存儲(chǔ)過(guò)程 /// </summary> /// <returns></returns> public int LoginInterface() { return CallInterface("player.login"); } } public class PlayerLogout : PaysysBase { public string s_account = ""; public void LogoutInit(string account) { s_account = account; InitParam(); } private void InitParam() { //反回值 cmd.Parameters.Add("result", OracleType.Float); cmd.Parameters["result"].Direction = ParameterDirection.ReturnValue; cmd.Parameters.Add("s_account", OracleType.VarChar); cmd.Parameters["s_account"].Direction = ParameterDirection.Input; cmd.Parameters["s_account"].Value = s_account; } public int LogoutInterface() { return CallInterface("player.logout"); } } }
遇到問(wèn)題:
1、在編寫(xiě)login的接口時(shí),因?yàn)橹怀跏蓟薎nput的參數(shù),還以為不需要Output的參數(shù),所以導(dǎo)致調(diào)用的時(shí)候一直出現(xiàn)參數(shù)缺少的問(wèn)題。入?yún)⒑统鰠⒍夹枰睿?/a>
Setp2:WebServices調(diào)用dll
1、新建工程:
2、新建好工程后添加剛剛寫(xiě)好的dll
3、WebService調(diào)用代碼
[WebMethod] public string PaysysLogin(string dbName, string dbAccount, string dbPassword, string account, string password) { var nResult = 0; try { PlayerLogin login = new PlayerLogin(); login.PaysysInit(dbName, dbAccount, dbPassword); login.LoginInit(account, password); nResult = login.LoginInterface(); } catch (Exception ex) { return ex.Message; } return nResult.ToString(); } [WebMethod] public string PaysysLogout(string dbName, string dbAccount, string dbPassword, string account) { var nResult = 0; try { PlayerLogout logout = new PlayerLogout(); logout.PaysysInit(dbName, dbAccount, dbPassword); logout.LogoutInit(account); nResult = logout.LogoutInterface(); } catch (Exception ex) { return ex.Message; } return nResult.ToString(); }
之后就可以調(diào)試一下了!
Setp3:部署到IIS(可以查看我之前的一編博客,是一樣的)
http://www.cnblogs.com/Martin_Q/archive/2010/12/06/1897614.html
調(diào)試結(jié)果
這里遇到一個(gè)很糟糕的問(wèn)題,使用IIS在調(diào)用到:conn.Open() 的時(shí)候出現(xiàn)一個(gè)錯(cuò)誤:system.data.oracleclient 需要 oracle 客戶端軟件 8.1.7 或更高版本。
這個(gè)問(wèn)題一定要值得注意,開(kāi)始我以為是iis沒(méi)有權(quán)限訪問(wèn)oracle目錄,我為什么會(huì)這么認(rèn)為呢?因?yàn)槲覟榱瞬檫@個(gè)問(wèn)題,我專門(mén)寫(xiě)了一個(gè).exe 去執(zhí)行調(diào)用,exe應(yīng)用程序執(zhí)行成功,iis出錯(cuò)!
原來(lái)問(wèn)題是由于我安裝的oracle客戶端為簡(jiǎn)易版本,很多很多的dll都沒(méi)有??梢跃W(wǎng)上找一下:10201_client_win32.zip 些版本client,當(dāng)然還有其他的權(quán)限問(wèn)題!這里沒(méi)遇到就不談了
Setp4:使用LoadRunner調(diào)用WebServices
1、Loadrunner新建WebService
2、點(diǎn)ManageServices 添加你的WebService地址
3、添加WebService 調(diào)用接口
搭建的地址為:http://10.20.87.62:81/Service.asmx 為什么后面需要手工加一個(gè):?WSDL 呢?(知道的同學(xué)說(shuō)一下!)
4、添加成功
5、添加對(duì)應(yīng)的存儲(chǔ)過(guò)程
6、添加成功后Action代碼
Action() { lr_start_transaction("Login"); web_service_call( "StepName=PaysysLogin_101", "SOAPMethod=Service|ServiceSoap|PaysysLogin", "ResponseParam=response", "Service=Service", "ExpectedResponse=SoapResult", "Snapshot=t1386150115.inf", BEGIN_ARGUMENTS, // 參數(shù)傳入 "dbName=orcl_35", "dbAccount=root", "dbPassword=123456", "account={Account}", "password=a", END_ARGUMENTS, BEGIN_RESULT, // 獲取返回值 "PaysysLoginResult=LoginResult", END_RESULT, LAST); lr_message("All:%s\r\nLoginResult:%s\r\n",lr_eval_string("{response}"),lr_eval_string("{LoginResult}")); if(atoi(lr_eval_string("{LoginResult}")) == 1) { lr_end_sub_transaction("Login",LR_PASS); } else { lr_end_sub_transaction("Login",LR_FAIL); lr_error_message("Login Error:%s ---- %s",lr_eval_string("{LoginResult}"),lr_eval_string("{Account}")); } return 0; }
輸出結(jié)果:
All:<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas./soap/envelope/" xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:xsd="http://www./2001/XMLSchema"><soap:Body><PaysysLoginResponse xmlns="http:///"><PaysysLoginResult>1</PaysysLoginResult></PaysysLoginResponse></soap:Body></soap:Envelope>
LoginResult:1
這一步之后,大家應(yīng)該如何進(jìn)行下一步了!
來(lái)自: 昵稱10504424 > 《工作》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
C# oracle 參數(shù)傳遞的多種方式 留著復(fù)習(xí)
VarChar),new OracleParameter("BillBegin", OracleType.OracleParameter[] paras = new OracleParameter[] { new OracleParameter(":UserId", UserId) , new OracleParameter(&qu...
C#通過(guò)存儲(chǔ)過(guò)程新增數(shù)據(jù)
insert into T_Name(T_NameID,T_Name) values(@T_NameID,@T_Name)END--表USE [TEST]CREATE TABLE [dbo].[T_Name]( [T_NameID] [nchar](10) NOT NULL, [T_Name] [nchar](10) NULL, CONSTRAINT [PK_T_Nam...
C#調(diào)用Oracle存儲(chǔ)過(guò)程的方法
首先編寫(xiě)一個(gè)不帶參數(shù)的oracle存儲(chǔ)過(guò)程:OracleConnection conn = new OracleConnection("server=cw;uid=ls0019999;pwd=aaaaaa");OracleCommand cmd = conn.//指明是執(zhí)行存儲(chǔ)過(guò)程 ...
如何從 ASP 調(diào)用 SQL Server 存儲(chǔ)過(guò)程
[.NET]ADO.NET調(diào)用存儲(chǔ)過(guò)程
// 簡(jiǎn)寫(xiě)方式 cmd.Parameters.Add( param );輸入?yún)?shù)的存儲(chǔ)過(guò)程的示例: try { SqlCommand cmd = new SqlCommand(); cmd.Connection = con; cmd.CommandType = CommandType.Sto...
VB中訪問(wèn)存儲(chǔ)過(guò)程的幾種辦法 - 設(shè)計(jì)前沿
''這里用第三種方法使用連接對(duì)象來(lái)插入數(shù)據(jù)Private Sub Command4_Click() Dim strsql As String strsql = "insert_users ''" &Trim(txttruename.Text) &"'...
最新分享
C#接收存儲(chǔ)過(guò)程輸出參數(shù):根據(jù)返回值類型的不同,我們可以將存儲(chǔ)過(guò)程分為三類:返回記錄集的存儲(chǔ)過(guò)程,返回?cái)?shù)值的存儲(chǔ)過(guò)程(也可以稱為標(biāo)量存儲(chǔ)過(guò)程),以及行為存儲(chǔ)過(guò)程。想到在執(zhí)行沒(méi)有參數(shù)的存儲(chǔ)過(guò)程...
C#中用Oracle 執(zhí)行存儲(chǔ)過(guò)程返回DataSet報(bào)[ORA-08103: 對(duì)象不再存在]解決方案
步步為營(yíng) .NET三層架構(gòu)解析 三、SQLHelper設(shè)計(jì)-程序開(kāi)發(fā)-紅黑聯(lián)盟
public void RunProc(string procName, SqlParameter[] prams, string TableName, ref DataSet dataSet) { if (dataSet == null) { dataSet = new DataSe...
微信掃碼,在手機(jī)上查看選中內(nèi)容