调用Oracle存储过程时出现的异常情况

xmltea 2005-08-10 06:46:16
写了一个存储过程,其返回一个记录集和一个Number类型的数值,在PL/SQL里调试都能正常返回值和记录集。在ASP.net中用如下方式调用:
OracleParameter[] parms=new OracleParameter[]
{
new OracleParameter("P_Type",OracleType.VarChar),
new OracleParameter("P_QuerySql",OracleType.VarChar),
new OracleParameter("Rating_Return",OracleType.Float),
new OracleParameter("Cables_Return",OracleType.Cursor),
};

parms[0].Value = ProType;
parms[1].Value = SqlStr;
parms[2].Direction = ParameterDirection.Output;
parms[3].Direction = ParameterDirection.Output;

using(OracleDataReader ODr = PLSQLHelper.ExecuteReader(connString,CommandType.StoredProcedure,"YH_SCJK.PG_TRSCABLE.GetCableLoadLine2",parms))
{
if(ODr.Read())
{
RatingVal = ODr.GetFloat(0);
}

ODr.NextResult();

while (ODr.Read())
{
TrsCable NowCable = new TrsCable();
NowCable.BJId = ODr.GetString(0);
NowCable.Name = ODr.GetString(1);
NowCable.SValue = ODr.GetDouble(2);
NowCable.SDate = ODr.GetDateTime(3);
Cables.Add(NowCable);
}

}

按理说Oracle存储过程返回值应该是按参数顺序返回,那么数值类型返回值Rating_Return应该在Cables_Return记录集之前,但是很奇怪,系统会报“RatingVal = ODr.GetFloat(0);”这句格式转换错误,我将获取记录集(即while (ODr.Read())后面的)的放在获取单值的前面,跟踪返回记录集正确,但ODr.NextResult();后,ODr.Read()返回false,无法得到单值……
不知哪里有问题,望各位大侠不吝赐教!
...全文
158 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cityhunter172 2005-08-10
  • 打赏
  • 举报
回复
对,你可参考以下我写的代码

/// <summary>
/// 获取存储过程参数的值
/// 注意:已被收集成 string 数组,位置与执行时的顺序相对应
/// </summary>
public string [] ParaValue
{
get
{
string[] str= null;
if(this.OraCmd.CommandType==CommandType.StoredProcedure)
{
str = new string[this.OraCmd.Parameters.Count];
for(int i =0;i<this.OraCmd.Parameters.Count;i++)
{
str[i]=this.OraCmd.Parameters[i].Value.ToString();
}
}
return str;
}
}

或者直接返回 OracleParameter
public OracleParameter Paras
{
get
{
return this.OraCmd.Parameters;
}
}
xmltea 2005-08-10
  • 打赏
  • 举报
回复
多谢 寒羽枫!
不过string str = PLSQLHelper.Parameters[2].Value.ToString();这句怎么实现,难道要在PLSQLHelper这个类里加一个属性(Parameters),专门用来返回非记录集的输出参数?
cityhunter172 2005-08-10
  • 打赏
  • 举报
回复
你把返回的记录集和输出类型的参数搞混了

首先,输出参数的获取,不需要用 OracleDataReader ,也无法用。应该用以下方法获取

string str = PLSQLHelper.Parameters[2].Value.ToString();

其次,OracleType.Cursor 是一种特殊输出参数,它的值就是一个结果集,因此可用
OracleDataReader 读取

这样解释可以吗?

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧