對不起,如果我的英文不如我所希望的那麼好: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可以很好地與企業庫一起工作,但與本地代碼相比,它本該更好。難道我做錯了什麼?
幾件事情脫穎而出。我相信你需要爲輸出參數指定一個大小,我不認爲有這樣的事情,像一個50k varchar2。 –
:D感謝您的回覆。即使我使用50k大小或不使用,仍然有相同的結果null。正如我寫的,我不能發佈圖像。 Im測試的參數是te O_PLAZA,其值爲空 –