2015-04-06 92 views
0

對不起,如果我的英文不如我所希望的那麼好:D。 我使用VS2013並通過Nuget Package下載了ODP.NET。 我在Oracle數據庫中調用sp中的方法。我已經能夠建立連接,但是當Im試圖從輸出參數中獲取字符串值時,這個值爲空。 int值檢索正常,但不是字符串。我使用相同的值ej調用這個方法。 employeeNumber = 431206和companyNumber = 0OracleManagedDataAccess不從存儲過程參數中檢索字符串

這裏是我的Web配置文件CONNSTRING

<connectionStrings> 
<add name="OracleMOC" 
    connectionString="Data Source=(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (COMMUNITY = uri.world) (PROTOCOL = TCP) (Host = 14.85.65.12) (Port = 1521)))(CONNECT_DATA =(SID = SIOX)));User Id=***;Password=****;" 
    providerName="Oracle.ManagedDataAccess.Client" /> 

而且我的代碼

public Employee GetEmployeeByNumber(string employeeNumber, int companyNumber) 
    { 
     Employee employee = new Employee(); 
      OracleConnection con = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleMOC"].ToString()); 
      con.Open(); 
      OracleCommand cmd = con.CreateCommand(); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "SPR.GetEmployeeDetail"; 
      cmd.Parameters.Add("I_FEC_APROY", OracleDbType.Date, DateTime.Now, ParameterDirection.Input); 
      cmd.Parameters.Add("I_FICHA", OracleDbType.Int32, Convert.ToInt32(employeeNumber.Trim()), ParameterDirection.Input); 
      cmd.Parameters.Add("I_EMPCLAVE", OracleDbType.Int32, companyNumber, ParameterDirection.Input); 
      cmd.Parameters.Add("O_RC", OracleDbType.Varchar2, 50000, ParameterDirection.InputOutput); 
      cmd.Parameters.Add("O_PLAZA", OracleDbType.Varchar2, ParameterDirection.Output); 
      cmd.Parameters.Add("O_NIVEL", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_NIVEL_P", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_CENTRO", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_DEPTO", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_DDEPTO", OracleDbType.Varchar2, 50000, ParameterDirection.InputOutput); 
      cmd.Parameters.Add("O_AEMP", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_DEMP", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_FEC_RPROY", OracleDbType.Varchar2, 50000, ParameterDirection.InputOutput); 
      cmd.Parameters.Add("O_VALIDO", OracleDbType.Varchar2, ParameterDirection.Output); 
      cmd.Parameters.Add("O_FICHA", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_NOMBRE", OracleDbType.Varchar2, ParameterDirection.Output); 
      cmd.Parameters.Add("O_APPAT", OracleDbType.Varchar2, ParameterDirection.Output); 
      cmd.Parameters.Add("O_APMAT", OracleDbType.Varchar2, ParameterDirection.Output); 
      cmd.Parameters.Add("O_ORGANISMO", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_NUMFAM", OracleDbType.Int32, ParameterDirection.Output); 
      cmd.Parameters.Add("O_DESC_ORG", OracleDbType.Varchar2, ParameterDirection.Output); 
      cmd.ExecuteNonQuery(); 

      employee.EmployeeNumber = employeeNumber; 
      employee.CompanyNumber = companyNumber; 
      employee.Regime = cmd.Parameters["O_RC"].Value.ToString(); 
      employee.Plaza = cmd.Parameters["O_PLAZA"].Value.ToString(); 
      employee.Level = cmd.Parameters["O_NIVEL"].Value.ToString(); 
      employee.Level_P = cmd.Parameters["O_NIVEL_P"].Value.ToString(); 
      employee.CenterNumber = cmd.Parameters["O_CENTRO"].Value.ToString() == "null" ? 0 : Convert.ToInt32(cmd.Parameters["O_CENTRO"].Value.ToString()); 
      employee.DepartmentNumber = cmd.Parameters["O_DEPTO"].Value.ToString() == "null" ? 0 : Convert.ToInt32(cmd.Parameters["O_DEPTO"].Value.ToString()); 
      employee.DepartmentDescription = cmd.Parameters["O_DDEPTO"].Value.ToString(); 
      employee.EmployeeYear = cmd.Parameters["O_AEMP"].Value.ToString() == "null" ? 0 : Convert.ToInt32(cmd.Parameters["O_AEMP"].Value.ToString()); 
      employee.EmployeeDay = cmd.Parameters["O_DEMP"].Value.ToString() == "null" ? 0 : Convert.ToInt32(cmd.Parameters["O_DEMP"].Value.ToString()); 
      employee.FirstName = cmd.Parameters["O_NOMBRE"].Value.ToString(); 
      employee.LastName = cmd.Parameters["O_APPAT"].Value.ToString(); 
      employee.LastName2 = cmd.Parameters["O_APMAT"].Value.ToString(); 

      employee.Organism = cmd.Parameters["O_ORGANISMO"].Value.ToString(); 

      if (cmd.Parameters["O_VALIDO"].Value.ToString() == "null") 
       employee.IsValid = false; 
      else 
      { 
       if (cmd.Parameters["O_VALIDO"].Value.ToString() == "true") 
       { 
        employee.IsValid = false; 
       } 
       else 
       { 
        employee.IsValid = true; 
       } 
      } 

      employee.DateFinish = cmd.Parameters["O_FEC_RPROY"].Value.ToString(); 
      employee.OrganismDescription = cmd.Parameters["O_DESC_ORG"].Value.ToString(); 
      con.Close(); 

     return employee; 

    } 

我測試了同一個SP,但使用企業庫,具有同一供應商。

public Employee GetEmployeeByNumber(string employeeNumber, int companyNumber) 
    {    
     Employee employee = null; 
     try 
     { 
      if (!String.IsNullOrEmpty(employeeNumber)) 
      {      
       EmployeeDataSet ds = new EmployeeDataSet(); 
       DatabaseProviderFactory dbProviderFactory = new DatabaseProviderFactory(); 
       Database db = dbProviderFactory.Create("OracleMOC"); 

       DbCommand cmd = db.GetStoredProcCommand("SPR.GetEmployeeDetail"); 
       db.AddInParameter(cmd, "I_FEC_APROY", DbType.DateTime, DateTime.Now); 
       db.AddInParameter(cmd, "I_FICHA", DbType.Int32, Convert.ToInt32(employeeNumber.Trim())); 
       db.AddInParameter(cmd, "I_EMPCLAVE", DbType.Int32, companyNumber); 
       db.AddOutParameter(cmd, "O_RC", DbType.String, 200); 
       db.AddOutParameter(cmd, "O_PLAZA", DbType.String, 200); 
       db.AddOutParameter(cmd, "O_NIVEL", DbType.Int32, 100); 
       db.AddOutParameter(cmd, "O_NIVEL_P", DbType.Int32, 100); 
       db.AddOutParameter(cmd, "O_CENTRO", DbType.Int32, 200); 
       db.AddOutParameter(cmd, "O_DEPTO", DbType.Int32, 200); 
       db.AddOutParameter(cmd, "O_DDEPTO", DbType.String, 200); 
       db.AddOutParameter(cmd, "O_AEMP", DbType.Int32, 200); 
       db.AddOutParameter(cmd, "O_DEMP", DbType.Int32, 200); 
       db.AddOutParameter(cmd, "O_FEC_RPROY", DbType.DateTime, 200); 
       db.AddOutParameter(cmd, "O_VALIDO", DbType.Int32, 200); 
       db.AddOutParameter(cmd, "O_FICHA", DbType.Int32, 200); 
       db.AddOutParameter(cmd, "O_NOMBRE", DbType.String, 200); 
       db.AddOutParameter(cmd, "O_APPAT", DbType.String, 200); 
       db.AddOutParameter(cmd, "O_APMAT", DbType.String, 200); 
       db.AddOutParameter(cmd, "O_ORGANISMO", DbType.Int32, 200); 
       db.AddOutParameter(cmd, "O_NUMFAM", DbType.Int32, 200); 
       db.AddOutParameter(cmd, "O_DESC_ORG", DbType.String, 200); 

       db.ExecuteNonQuery(cmd); 

       if (String.IsNullOrEmpty(db.GetParameterValue(cmd, "O_NOMBRE").ToString()) && String.IsNullOrEmpty(db.GetParameterValue(cmd, "O_APPAT").ToString())) 
       { 
        return employee; 
       } 
       else 
       { 
        employee = new Employee(); 
       } 
       employee.EmployeeNumber = employeeNumber; 
       employee.CompanyNumber = companyNumber; 
       employee.Plaza = db.GetParameterValue(cmd, "O_PLAZA").ToString(); 
       employee.Level = db.GetParameterValue(cmd, "O_NIVEL").ToString(); 
       employee.Level_P = db.GetParameterValue(cmd, "O_NIVEL_P").ToString(); 
       employee.CenterNumber = db.GetParameterValue(cmd, "O_CENTRO") == DBNull.Value ? 0 : Convert.ToInt32(db.GetParameterValue(cmd, "O_CENTRO")); 
       employee.DepartmentNumber = db.GetParameterValue(cmd, "O_DEPTO") == DBNull.Value ? 0 : Convert.ToInt32(db.GetParameterValue(cmd, "O_DEPTO")); 
       employee.DepartmentDescription = db.GetParameterValue(cmd, "O_DDEPTO").ToString(); 
       employee.EmployeeYear = db.GetParameterValue(cmd, "O_AEMP") == DBNull.Value ? 0 : Convert.ToInt32(db.GetParameterValue(cmd, "O_AEMP")); 
       employee.EmployeeDay = db.GetParameterValue(cmd, "O_DEMP") == DBNull.Value ? 0 : Convert.ToInt32(db.GetParameterValue(cmd, "O_DEMP")); 
       employee.FirstName = db.GetParameterValue(cmd, "O_NOMBRE").ToString(); 
       employee.LastName = db.GetParameterValue(cmd, "O_APPAT").ToString(); 
       employee.LastName2 = db.GetParameterValue(cmd, "O_APMAT").ToString(); 
       employee.Regime = db.GetParameterValue(cmd, "O_RC").ToString(); 
       employee.Organism = db.GetParameterValue(cmd, "O_ORGANISMO").ToString(); 
       employee.IsValid = db.GetParameterValue(cmd, "O_VALIDO") == DBNull.Value ? false : !Convert.ToBoolean(db.GetParameterValue(cmd, "O_VALIDO")); 
       employee.DateFinish = db.GetParameterValue(cmd, "O_FEC_RPROY").ToString(); 
       employee.OrganismDescription = db.GetParameterValue(cmd, "O_DESC_ORG").ToString(); 
      } 
      return employee; 
     } 
     catch (Exception ex) 
     { 
      return null; 
     }   
    } 

不幸的是,我沒有10的聲望發佈圖像。

最大的問題是,爲什麼ODP.NET可以很好地與企業庫一起工作,但與本地代碼相比,它本該更好。難道我做錯了什麼?

+0

幾件事情脫穎而出。我相信你需要爲輸出參數指定一個大小,我不認爲有這樣的事情,像一個50k varchar2。 –

+0

:D感謝您的回覆。即使我使用50k大小或不使用,仍然有相同的結果null。正如我寫的,我不能發佈圖像。 Im測試的參數是te O_PLAZA,其值爲空 –

回答

0

我對Mananged ODP.NET沒有太多經驗,但在較早的ODP:NET中,您必須指定最大值。返回值,即長度應該是這樣的:

myOracleCmd.Parameters.Add("O_APMAT", OracleDbType.Varchar2, ParameterDirection.Output); 
myOracleCmd.Parameters["O_APMAT"].Size = 1000; 

或者你可以在一行寫:

myOracleCmd.Parameters.Add("O_APMAT", OracleDbType.Varchar2, 1000, null, ParameterDirection.Output); 

那麼也許你還必須指定參數的DbType,即

cmyOracleCmdmd.Parameters["O_APMAT"].DbType = DbType.String; 

在這裏,你看到的DbType主場迎戰OracleDbType列表:C#: Oracle Data Type Equivalence with OracleDbType

然後一般說明:你的SP包含很多輸出參數,也許它只是簡單地返回一個RefCursor,並從這個光標讀出屬性,而不是一個一個地定義每個輸出參數。

+0

感謝您的回覆。我嘗試了,因爲你告訴沒有運氣:( –

+0

:D我知道SP中有很多輸出參數,不幸的是我不能修改該SP ..我必須現在就使用它。 –