У меня возникла проблема с простой процедурой в пакете Oracle. Существуют другие процедуры, которые я использую в пакете, которые работают нормально. Другой пакет нас Курсоры. Этот использует Return. Я не могу получить код, чтобы пройти cmd.ExecuteNonQuery()
. Поэтому я думаю, что я не создал команду должным образом. Я пытаюсь изменить команду, но она все еще не работает. Если бы кто-то мог взглянуть на него, я был бы признателен.Проблема с C# с пакетом Oracle
хранимых процедур в Oracle Пакет:
Name Data Types:
ARC_NUMBER VARCHAR2(12)
TRANSACTION_ID NUMBER
TRANS_STATUS VARCHAR2(1)
PAID_AMT NUMBER(8,2)
PROCEDURE UPDATE_TRANS_BY_OUTPUT(
var_ArcNum IN TRANSACTION.ARC_NUMBER%type,
var_Trans IN TRANSACTION.TRANSACTION_ID%type,
var_TransStatus IN TRANSACTION.TRANS_STATUS%type,
var_PaidAmt IN TRANSACTION.PAID_AMT%type,
var_Return OUT VARCHAR2)
IS BEGIN
BEGIN
UPDATE TRANSACTION
SET
ARC_NUMBER = var_ArcNum,
TRANS_STATUS = var_TransStatus,
PAID_AMT = var_PaidAmt
WHERE TRANSACTION_ID = var_Trans;
var_Return := 'PASS';
EXCEPTION
WHEN OTHERS THEN
var_Return := 'FAIL';
END UPDATE_TRANS_BY_DEDUCT;
C# Код
public void updateTransactionDeduct(string txtArc, string txtTransID, string vStatus, string txtPaidAmt)
{
string constr = WebConfigurationManager.ConnectionStrings["OracleDbConnection"].ConnectionString;
OracleConnection con = new OracleConnection(constr);
OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "ucs.trans_data.UPDATE_TRANS_BY_OUTPUT";
cmd.BindByName = true;
//ASSIGN PARAMETERS TO BE PASSED
cmd.Parameters.Add("var_ArcNum", OracleDbType.Varchar2).Value = txtArc;
cmd.Parameters["var_ArcNum"].Direction = ParameterDirection.Input;
cmd.Parameters.Add("var_Trans", OracleDbType.Int16).Value = txtTranIDNum;
cmd.Parameters["var_Trans"].Direction = ParameterDirection.Input;
cmd.Parameters.Add("var_TransStatus", OracleDbType.Varchar2).Value = vStatus;
cmd.Parameters["var_TransStatus"].Direction = ParameterDirection.Input;
cmd.Parameters.Add("var_PaidAmt", OracleDbType.Decimal).Value = txtPaidAmtNum;
cmd.Parameters["var_PaidAmt"].Direction = ParameterDirection.Input;
cmd.Parameters.Add("var_Return", OracleDbType.Varchar2);
cmd.Parameters["var_Return"].Direction = ParameterDirection.ReturnValue;
con.Open();
cmd.ExecuteNonQuery(); //<=== Errors Out Here
string txtReturn = cmd.Parameters["var_Return"].Value.ToString();
con.Close();
if (txtReturn == "FAIL" | txtReturn == null)
{
MsgBox("Transaction record not updated.");
}
else
{
MsgBox("Transaction was updated.");
}
}
Когда я копирую деталь исключение в буфер обмена этого является то, что я получаю
Сведения об исключении из буфера обмена
Oracle.ManagedDataAccess.Client.OracleException was unhandled by user code
DataSource=""
ErrorCode=-2147467259
HResult=-2147467259
IsRecoverable=false
Message=ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'UPDATE_TRANS_BY_DEDUCT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Number=6550
Procedure=""
Source=Oracle Data Provider for .NET, Managed Driver
StackTrace:
at OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
at OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean bFirstIterationDone)
at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, OracleException& exceptionForArrayBindDML, Boolean isFromEF)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
at Query_Test.Review_List.updateTransactionDeduct(String txtPolicy, String txtTransID, String vStatus, String txtPaidAmt) in C:\Working\Test\Query_Test\Query_Test\Review_List.aspx.cs:line 314
at Query_Test.Review_List.GridViewListComp_RowUpdated(Object sender, GridViewUpdateEventArgs e) in C:\Working\Test\Query_Test\Query_Test\Review_List.aspx.cs:line 115
at System.Web.UI.WebControls.GridView.OnRowUpdating(GridViewUpdateEventArgs e)
at System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation)
at System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup)
at System.Web.UI.WebControls.GridView.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
Ну, я иду к нему, работая. Я принял рекомендации sstan и переключил ReturnValue на Output. Я также добавил длину поля к Varchars и Return. Таким образом, он выглядит так: cmd.Parameters.Add ("var_ArcNum", OracleDbType.Varchar2, 12) .Value = txtArc; cmd.Parameters.Add ("var_Return", OracleDbType.Varchar2, 4); С комой после Varchar и длиной поля. – MeGreeny