最近剛好有空可以將之前VB6的程式碼翻成C#...
但是,原先舊有的VB6程式碼中,有去呼叫Oracle 的Stored procedure。
這地方嘗試許久總是百思不得其解,問周遭朋友也很少人會去呼叫 Stored procedure。
最後,還是想說上來問問各位前輩了。
==> VB6 呼叫Stored procedure,並傳入3個參數,回傳3個參數
Dim DBCmd As ADODB.Command
Set DBCmd = New ADODB.Command
DBCmd.CommandText = "{call T_TEST_FLOW_USER.CREATE_USER_INDEX(?,?,?,'"&
Trim(UserID) &"','"& UserBir &"','"& UserPW &"') }"
DBCmd.Parameters.Append
DBCmd.CreateParameter("nUserIdx",adChar.adParameterOutput,20 )
DBCmd.Parameters.Append
DBCmd.CreateParameter("nUserNum",adInteger.adParameterOutput)
DBCmd.Parameters.Append
DBCmd.CreateParameter("nUserClass",adInteger.adParameterOutput)
DBCmd.Execute , , adExecuteNoRecords
strUserIdx = Trim(DBCmd.Parameter("nUserIdx"))
UserNum = DBCmd.Parameter("nUserNum")
UserClass = DBCmd.Parameter("nUserClass")
Set DBCmd = Nothing
==>實際Oracle中的Procedure如下:
Create OR REPLACE PACKAGE TEST.T_TEST_FLOW_USER IS
PROCEDURE CREATE_USER_INDEX(strUserIdx OUT VARCHAR2,nUserNum OUT NUMBER,
nUserClass OUT NUMBER,UserID IN VARCHAR2,
UserBir IN VARCHAR2, UserPW IN VARCHAR2);
PROCEDURE DELETE_USER_INDEX(??, ?? ,....,);
PROCEDURE ....
End T_TEST_FLOW_USER
==>轉換成C#版本...
Command.Text = "TEST.T_TEST_FLOW_USER.CREATE_USER_INDEX";
Command.Type = StoredProcedure; <==這好像是這樣,有點忘了@@
DBParameter = DBCommand.CreateParameter();
DBParameter.ParameterName = ??
DBParameter.ParameterValue = ??
DBParameter.DBType = ??
DBParameter.Direction = Parameter.Direction.Output;
DBParameter.Size = ??
DBCommand.Parameters.Add(DBParameter);
問題一:
針對Output的參數,ParameterName要怎麼寫? 隨便帶入一個變數名稱?
因為在VB6的話,是直接帶入一個字串"nUserIdx"..所以這邊有點不解?
是不是ParameterName 前方都需要加入 @ (例.DBParameter.ParameterName = "@User";)
問題二:
有"一定"需要針對每個參數去定義型別嗎?在VB6中,好像必須要定義,例如:adChar
問題三:
針對Output的參數,所有型別都"必須"指定Size嗎?
在VB6好像只有Char 才需要,Integer不用。
但是,如果再C#中,我的DBParameter.DBType = Data.Int32;
則會拋出例外,string[2] 字串轉換型別錯誤? <==有點忘記錯誤訊息了...
麻煩各位前輩指點了。