OleDb.NET访问返回结果集的Oracle存储过程问题...

hz890 2009-01-22 06:36:42
OleDb.NET访问返回结果集的Oracle存储过程问题...

存储过程TestPackage1.GetData1需要从表test返回结果集:

CREATE OR REPLACE package STD.TestPackage1 is
type mycursor is ref cursor;
procedure GetData1(ta varchar2,ret_cursor out mycursor);
end TestPackage1;
/
CREATE OR REPLACE package body STD.TestPackage1 is
procedure GetData1(ta varchar2,ret_cursor out mycursor) is
sqlstr varchar2 (4000);
begin
if ta='' then
open ret_cursor for select * from test;
else
sqlstr:='select * from test where A=:a';
open ret_cursor for sqlstr using ta;
end if;
end GetData1;
end TestPackage1;
/

test表很简单,只有两个字段:
A VARCHAR2(200) NOT NULL,
NUM NUMBER(38) DEFAULT 0 NOT NULL

---------------------------------------------------------------------------------------

ASP.NET(C#)访问程序:
public DataTable GetDataTable()
{
DataTable dt = new DataTable();

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
OleDbCommand cmd = new OleDbCommand("TestPackage1.GetData1", conn);
cmd.CommandType = CommandType.StoredProcedure;

OleDbParameter para = new OleDbParameter();
para.ParameterName = "ta";
para.Value = "a";
para.OleDbType = OleDbType.Variant;
para.Direction = ParameterDirection.Input;
cmd.Parameters.Add(para);

OleDbParameter para1 = new OleDbParameter();
para1.ParameterName = "ret_cursor";
para1.Value = DBNull.Value;
para1.OleDbType = OleDbType.Variant;
para1.Direction = ParameterDirection.Output;
cmd.Parameters.Add(para1);

OleDbDataAdapter sda = new OleDbDataAdapter(cmd);
sda.Fill(dt);

}
return dt;
}

在执行至sda.Fill(dt);时报错:ORA-01036: 變數名稱?號碼無效(公司用的是VS2005繁体中文版)

不知当如何解决。我知道如果采用OracleClient而不是OleDb访问,程序是不会有问题的,但现在用户要求采用OleDb来实现对Oracle的访问,不知当如何解决,请各位不要再要求我用OracleClient来解决此问题,感谢各位支持!

...全文
139 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hz890 2009-01-23
  • 打赏
  • 举报
回复
以上回答都不正确。
我终于在今天凌晨找到了问题所在,原来OleDbCommand不支持Oracle的Cursor类型的(输出)参数,所以
OleDbParameter para1 = new OleDbParameter();
para1.ParameterName = "ret_cursor";
para1.Value = DBNull.Value;
para1.OleDbType = OleDbType.Variant;
para1.Direction = ParameterDirection.Output;
cmd.Parameters.Add(para1);


添加参数para1是多余的,也是无效的。Oracle的Cursor类型的参数只能由OracleCommand来支持,所以在屏蔽上面的代码后,就正常了!
大聪 2009-01-22
  • 打赏
  • 举报
回复
para.ParameterName = ":ta";
hz890 2009-01-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 king19840811 的回复:]
Provider=OraOLEDB.Oracle这个改没有
[/Quote]

连接字符串:Provider=msdaora;Data Source=GIMESTEST.ichia.com;User Id=std;Password=std;
king19840811 2009-01-22
  • 打赏
  • 举报
回复
或者设置目录属性,将"读取和运行"后选项取消再选上,选择确定就解决了
king19840811 2009-01-22
  • 打赏
  • 举报
回复
Provider=OraOLEDB.Oracle这个改没有

62,072

社区成员

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

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

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

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