2016-08-08 5 views
1

У меня возникла проблема с простой процедурой в пакете 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: 
+0

Ну, я иду к нему, работая. Я принял рекомендации 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

ответ

1

Технически var_Return не возвращаемое значение из функции, но выходной параметр.

По этой причине, я бы попытаться изменить:

cmd.Parameters["var_Return"].Direction = ParameterDirection.ReturnValue; 

к:

cmd.Parameters["var_Return"].Direction = ParameterDirection.Output; 

Там могут быть и другие проблемы, но я хотел бы начать с этого.

+0

Спасибо sstan Я пробовал это, и я до сих пор не могу пройти мимо cmd.ExecuteNonQuery() – MeGreeny

+0

В дополнение к ответу sstan, который является правильным, возможно, преобразовать эти строки в числа. Не уверен в эквиваленте C#, но в VB у меня есть 'cmd.Parameters.Добавить ("var_PaidAmt", OracleDbType.Decimal) .Value = CDec (txtPaidAmtNum) '. Я обычно передавал их в свою рутину как подходящий тип для начала. Я бы также сделал var_Trans 'Int32' тип, если вы не знаете, что он никогда не будет превышать' Short' – topshot

1
  1. Изменить направление на "var_Return" в ParameterDirection.Output
  2. Укажите длину для "var_Return". Я считаю, что по умолчанию для varchar2 32k (но я не могу вспомнить, когда-либо устанавливая длину настолько большой, поэтому рассмотрим 4k для начала).
  3. Позвольте ODP.net определить тип ваших входных значений (не требование, но менее подверженное ошибкам IMO).
  4. Подтвердите ваши типы входных значений соответствуют типам параметров

т.е.:

cmd.Parameters.Add("var_ArcNum", txtArc); 
cmd.Parameters.Add("var_Trans", Int32.Parse(txtTranIDNum));//if this is a string, you have to convert it in order to pass it as an int, even if you specify the parameter type 
cmd.Parameters.Add("var_TransStatus", vStatus); 
cmd.Parameters.Add("var_PaidAmt", Decimal.Parse(txtPaidAmtNum)); 
cmd.Parameters.Add("var_Return", OracleDbType.Varchar2, 4000); 
cmd.Parameters["var_Return"].Direction = ParameterDirection.Output; 
0

Ну я иду к нему работать. Я принял рекомендации sstan и переключил ReturnValue на Output. Я также добавил длину поля к Varchars и Return. Так выглядит примерно так:

//     Added the 12 after the Varchar, ===\/ 
cmd.Parameters.Add("var_ArcNum", OracleDbType.Varchar2, 12).Value = txtArc; 

//     Added the 4 after the Varchar, ===\/ 
cmd.Parameters.Add("var_Return", OracleDbType.Varchar2, 4); 

С комой после Varchar и длиной поля.

Смежные вопросы