ASP.NET调用Oracle存储过程的疑问???

qingYun1029 2011-03-10 11:26:26
一个Oracle数据库的存储过程中有十个参数,前面4个是出入参数,后面6个是输出参数。。。
请问如何获取输出参数???

下面是我写的代码,在红色注释的地方报错了。
错误信息,为将对象引用到实例,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DBUtility;
using System.Data.OracleClient;
using System.Data;

public partial class Admin_Admin_index : System.Web.UI.Page
{
private readonly string conStr = SQLHelper.GetConnectionString();
private OracleConnection conn = new OracleConnection(SQLHelper.GetConnectionString());

double iuserid;
string susername;
string read_data_right;
string filterlist;
double code;
string msg;


protected void Page_Load(object sender, EventArgs e)
{
Test("1001", "1", "00-26-22-BA-46-2C", "", ref iuserid, ref susername, ref read_data_right, ref filterlist, ref code, ref msg);
string s = "";
}

private void Test(string suserno,string pwd,string mac1,string mac2,ref double iuserid,ref string susername,ref string read_data_right,ref string filterlist,ref double code,ref string msg)
{
try
{
//打开连接
OpenOracleConnection();
//定义OracleCommand对象
OracleCommand cmd = new OracleCommand("login_deal.login", conn);
//设置命令类型为存储过程
cmd.CommandType = CommandType.StoredProcedure;

//根据存储过程的参数个数及类型生成参数对象
OracleParameter p1 = new OracleParameter("p_suserno", OracleType.VarChar);
OracleParameter p2 = new OracleParameter("p_password", OracleType.VarChar);
OracleParameter p3 = new OracleParameter("p_mac1", OracleType.VarChar);
OracleParameter p4 = new OracleParameter("p_mac2", OracleType.VarChar);
OracleParameter p5 = new OracleParameter("p_iuserid", OracleType.Number);
OracleParameter p6 = new OracleParameter("p_susername", OracleType.VarChar,1000);
OracleParameter p7 = new OracleParameter("p_read_data_right", OracleType.VarChar,1000);
OracleParameter p8 = new OracleParameter("p_filterlist", OracleType.VarChar,1000);
OracleParameter p9 = new OracleParameter("p_code", OracleType.Number);
OracleParameter p10 = new OracleParameter("p_msg", OracleType.VarChar,1000);

//设置参数的输入输出类型,默认为输入
p1.Direction = ParameterDirection.Input;
p2.Direction = ParameterDirection.Input;
p3.Direction = ParameterDirection.Input;
p4.Direction = ParameterDirection.Input;
p5.Direction = ParameterDirection.Output;
p6.Direction = ParameterDirection.Output;
p7.Direction = ParameterDirection.Output;
p8.Direction = ParameterDirection.Output;
p9.Direction = ParameterDirection.Output;
p10.Direction = ParameterDirection.Output;

//对输入参数定义初值,输出参数不必赋值.
p1.Value = suserno;
p2.Value = pwd;
p3.Value = mac1;
p4.Value = mac2;

//按照存储过程参数顺序把参数依次加入到OracleCommand对象参数集合中
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);
cmd.Parameters.Add(p4);
cmd.Parameters.Add(p5);
cmd.Parameters.Add(p6);
cmd.Parameters.Add(p7);
cmd.Parameters.Add(p8);
cmd.Parameters.Add(p9);
cmd.Parameters.Add(p10);


//这儿报错了。未将对象引用到实例。
iuserid = Convert.ToDouble(p5.Value.ToString());
susername = p6.Value.ToString();
read_data_right = p7.Value.ToString();
filterlist = p8.Value.ToString();
code = Convert.ToDouble(p9.Value.ToString());
msg = p10.Value.ToString();

CloseOracleConnection();
}
catch (Exception ex)
{

}
}

#region 关闭连接
private void CloseOracleConnection()
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
#endregion

#region 打开连接
private void OpenOracleConnection()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
}
#endregion
}
...全文
174 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
浪花三朵朵 2013-08-08
  • 打赏
  • 举报
回复
楼主问题怎么解决的呀?
Airch 2011-03-10
  • 打赏
  • 举报
回复
猛一看 还真是 你没执行存储过程
wangchangming 2011-03-10
  • 打赏
  • 举报
回复
//按照存储过程参数顺序把参数依次加入到OracleCommand对象参数集合中
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);
cmd.Parameters.Add(p4);
cmd.Parameters.Add(p5);
cmd.Parameters.Add(p6);
cmd.Parameters.Add(p7);
cmd.Parameters.Add(p8);
cmd.Parameters.Add(p9);
cmd.Parameters.Add(p10);

cmd.ExecuteNonQuery(); //都没执行存储过程有值才怪; //这儿报错了。未将对象引用到实例。
iuserid = Convert.ToDouble(p5.Value.ToString());
susername = p6.Value.ToString();
read_data_right = p7.Value.ToString();
filterlist = p8.Value.ToString();
code = Convert.ToDouble(p9.Value.ToString());
msg = p10.Value.ToString();

CloseOracleConnection();
qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 airch 的回复:]

你在plsql里执行的时候 p5有数据?

楼主 我现在在弄asp.net调用oracle的存储过程,你这有可以用?
我的老提示Oracle.DataAccess.Client初始失败
[/Quote]

当我用上面参数的前面三个去测试那个存储过程(Oracle好像叫包——pkg.proc)有返回值....
存储过程不是我写的,别人只给我调用,不告诉我表,不让直接查询表。。。
数据需要保密...
Airch 2011-03-10
  • 打赏
  • 举报
回复
你在plsql里执行的时候 p5有数据?

楼主 我现在在弄asp.net调用oracle的存储过程,你这有可以用?
我的老提示Oracle.DataAccess.Client初始失败
qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
运行到
iuserid = Convert.ToDouble(p5.Value.ToString());
就报错了。。

就是获取输出的第一个参数那儿。。
笨熊熊 2011-03-10
  • 打赏
  • 举报
回复
斷點看下具體是哪個參數有誤。
Airch 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 qingyun1029 的回复:]
结果出来了,公布答案。

因为我用plsql测试存储过程后没有回滚。所以卡了...
[/Quote]
......
wangchangming 2011-03-10
  • 打赏
  • 举报
回复
从代码上看不出错误,你在Oracle下面调用存储过程看看
qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
结果出来了,公布答案。

因为我用plsql测试存储过程后没有回滚。所以卡了...




qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sid2008 的回复:]

斷點看下具體是哪個參數有誤。
[/Quote]

请学会尊重别人!!!
qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 airch 的回复:]

引用 12 楼 qingyun1029 的回复:
到底有没有人知道啊?
急死了。。

现在页面执行到cmd.ExecuteNonQuery();就不网下走了。
页面直接跳出来。。

但是就是页面的内容显示不出来,进度条走一半不动了~~~~

看是不是报异常了
[/Quote]

大哥。。。
我上面都用了try{}catche(){}语句了。。
报异常我肯定知道看啦...

~~~~
Airch 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qingyun1029 的回复:]
到底有没有人知道啊?
急死了。。

现在页面执行到cmd.ExecuteNonQuery();就不网下走了。
页面直接跳出来。。

但是就是页面的内容显示不出来,进度条走一半不动了~~~~
[/Quote]
看是不是报异常了
qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
到底有没有人知道啊?
急死了。。

现在页面执行到cmd.ExecuteNonQuery();就不网下走了。
页面直接跳出来。。

但是就是页面的内容显示不出来,进度条走一半不动了~~~~
qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wxr0323 的回复:]

断点 iuserid = Convert.ToDouble(p5.Value.ToString());

p5.Value.ToString()
有值没有。
[/Quote]

我在iuserid = Convert.ToDouble(p5.Value.ToString());前面加了一句
cmd.ExecuteNonQuery();当执行到次句时,页面跳出来了,后面的代码没有执行。

我注释掉cmd.ExecuteNonQuery();然后调试,走到
iuserid = Convert.ToDouble(p5.Value.ToString());直接报错,
错误信息“未将对象引用设置到对象的实例”。
子夜__ 2011-03-10
  • 打赏
  • 举报
回复
断点 iuserid = Convert.ToDouble(p5.Value.ToString());

p5.Value.ToString()
有值没有。
Airch 2011-03-10
  • 打赏
  • 举报
回复
一旦报异常,页面后面的代码是不会走的,直接给你个黄页,后面获取语句的值的代码自然不会走
qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
调试的时候走到那句就页面弹出来了。。

后面获取语句的值都没有走怎么回事??
qingYun1029 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangchangming 的回复:]

//按照存储过程参数顺序把参数依次加入到OracleCommand对象参数集合中
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);
cmd.Parameters.Add(p4);
……
[/Quote]
刚开始的时候写了,但是调试的时候这句代码后的代码调试不到了。。
当执行这句执行语句的时候,页面就直接跳出来了。。
后面几句赋值语句调试不走哪儿。

62,047

社区成员

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

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

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

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