【发布时间】:2015-06-11 09:52:05
【问题描述】:
对不起,如果我的英语没有我希望的那么好:D。 我使用 VS2013 并通过 Nuget 包下载了 ODP.NET。 我在 Oracle 数据库的 sp 中调用一个方法。我已经能够建立连接,但是当我尝试从输出参数中获取字符串值时,这个值为空。 int 值检索 ok 但不是字符串。 我用相同的值 ej 调用这个方法。员工编号 = 431206 和公司编号 = 0
这是我的网络配置文件 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。正如我所写,我无法发布图像。我测试的参数是 te O_PLAZA 为空
标签: c# oracle enterprise-library odp.net