可能是微软的Bug,存储过程访问的问题

mycode 2006-09-15 06:03:19
通过ADO.NET访问Oracle的存储过程。
为了得到存储过程的参数列表,使用了如下的语句。

//OleDbCommandBuilder.DeriveParameters(oleCmd);
OracleCommandBuilder.DeriveParameters(oleCmd);

在整个项目中,有许多的存储过程。有的存储过程使用就非常正常,但有的存储过程,得到的参数列表就不正确,得到的参数数量偏多,也就是有部分参数重复出现了。
create or replace procedure ssp_SMTotal(IsStep in number,oRes out number)
is
begin
oRes := IsStep;
end;

例如上述的存储过程,在执行完
OracleCommandBuilder.DeriveParameters(oleCmd);
语句后,在Parameters中,Item的数量居然是6个。

但是,将连接换成OleDbCommandBuilder方式时,就是正常的两个。
但对另一个存储过程,使用OleDbCommandBuilder时,参数列表就不正确,再换成OracleCommandBuilder,就正确了。
另外,如果将存储过程换一个名字,重新建立,通常情况该问题也会解决。
不知道是什么原因带来的。
我认为就有可能是微软程序的一个Bug,但想到如此多的人使用这些程序,如果是Bug,早应该被发现了。

尚未发现如何人工制造出该问题的出现,只是在项目开发中,随机出现的。
因此,该问题非常难以解决。

不知道哪位高手曾经遇到这样的问题。
...全文
340 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mycode 2006-09-18
  • 打赏
  • 举报
回复
最初,存储过程的参数如下:
create or replace procedure ssp_SMTotal(IsStep in number,IsMonth in number, IsOper in number,oRes out number);
这时候,出现错误。为了调试跟踪,把存储过程改为
create or replace procedure ssp_SMTotal(IsStep in number,oRes out number);
参数个数计算出来,就是6个。
再把参数都支掉了,计算出来的参数,还是原来的4个。

我还怀疑过是驱动程序的问题,但驱动程序应该不能解释,如果将存储过程重新建立一个新的,除了名字以外,都不变,却能够执行,这样一个问题。

另外,我的Oracle数据库是9.2的。

  • 打赏
  • 举报
回复
估计是 驱动的问题
楼主是什么环境?

OracleCommand是Oracle提供的.Net OLEDB Provider吧
微软自带的OLEDB Provider For Oracle不支持游标(.Net 1.1里)

我在Asp.Net 1.1里 用Oracle 提供的 驱动 访问 存储过程,输入输出,返回游标
都没有问题的

另外,

'在继续的测试和研究过程中,发现,即使去掉存储过程的任何参数,执行:
'OracleCommandBuilder.DeriveParameters(oleCmd);
'这条语句时,仍然会自动计算出4个参数,当然,这四个参数,是原来存储过程的参数。

是4个什么参数呢?
mycode 2006-09-18
  • 打赏
  • 举报
回复
现在最大的问题是,我没有办法重现这个Bug。
不知道什么时候建立的某个存储过程会出现这样的情况。也不知道系统中运行的好好的存储过程,哪一个会突然出错。
mycode 2006-09-18
  • 打赏
  • 举报
回复
感谢saucer(思归) 。
在继续的测试和研究过程中,发现,即使去掉存储过程的任何参数,执行:
OracleCommandBuilder.DeriveParameters(oleCmd);
这条语句时,仍然会自动计算出4个参数,当然,这四个参数,是原来存储过程的参数。

目前的解决办法,只有一个,就是把存储过程更改一个名字,通常情况下就没有问题了。
但这样的办法,只是治标,不能治本,不知道哪一天运行,系统就又出错了。
saucer 2006-09-15
  • 打赏
  • 举报
回复
如果存储过程只有输入参数,没有输出参数,也有问题么?
mycode 2006-09-15
  • 打赏
  • 举报
回复
我一直也怀疑是某些细节出错了。
To:saucer(思归)

leCmd.Parameters.Clear();
//在跟踪时,上面的语句执行完毕后,参数集合的确全部清除了。
OracleCommandBuilder.DeriveParameters(oleCmd);
//执行这条语句时,就出现了我所描述的问题。

我当然希望,这不是微软的Bug,而是我自己的问题。但现在,我还没有找到彻底解决的办法。
go_now 2006-09-15
  • 打赏
  • 举报
回复
可能是某些细节出错了
saucer 2006-09-15
  • 打赏
  • 举报
回复
sounds odd, what if you do

oleCmd.Parameters.Clear();
OracleCommandBuilder.DeriveParameters(oleCmd);

?
微技术 2006-09-15
  • 打赏
  • 举报
回复
顶一下
zzd8310 2006-09-15
  • 打赏
  • 举报
回复
帮顶
kbxj406 2006-09-15
  • 打赏
  • 举报
回复
哈哈

估计微软会颁奖给lz
winner2050 2006-09-15
  • 打赏
  • 举报
回复
进行一下错误重现,到微软领取奖品

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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