2010-08-05 82 views
0

我们有一个驻留在oracle 10.2数据库中的oracle存储过程。存储的程序包含特定的输入和输出参数。我们正在尝试创建一个asp.net web应用程序来执行存储过程,并将来自输出参数的结果绑定到一个gridview中。但没有运气。使用asp.net调用oracle存储过程。 Visual Studio 2005

这是我迄今所做

Oracle.DataAccess.dll

我与Oracle开发工具Visual Studio已安装了Oracle数据访问组件(ODAC),并用它来调用oracle存储过程。

**这是我得到**
ORA-06550错误:第1行,第7列:
PLS-00306:错号码或类型的呼叫参数 'CALC_NUMBERVOTES'
ORA-06550 :第1行,第7列:
PLS-00306:错误数量或类型的呼叫参数 'CALC_NUMBERVOTES'
ORA-06550:第1行,第7列:
PLS-00306:错误的号码或类型的参数来电 'CALC_NUMBERVOTES'
ORA-06550:第1行,第7列:
PLS-00306 :错误的数量或类型的呼叫参数 'CALC_NUMBERVOTES'
ORA-06550:第1行,第7列:
PL/SQL:语句被忽略

任何帮助非常感谢。
oralce的存储过程代码

PROCEDURE calc_numbervotes ( 
    i_Office    IN ELECTIONRESULTS.office%TYPE, 
    o_candidate    OUT tblcandidate , 
    o_party     OUT tblparty, 
    o_votes     OUT tblvotes, 
    o_percAll    OUT tblpercAll) 
IS 
/***************Find Number of candidate per office and party******************/ 
CURSOR c1 is 
    SELECT distinct candidate, party,sum(votes) totalvotes 
    FROM ELECTIONRESULTS 
    WHERE candidate not in ('Registered Voters') 
    AND office = i_office 
    AND Precinct <> ' ' 
    GROUP BY candidate,party 
    ORDER BY sum(votes) desc; 
/****************** Find total county votes per candidate *********************/ 
CURSOR c2 is 
    SELECT sum(votes) from ELECTIONRESULTS 
    WHERE candidate !='Registered Voters' 
    AND office  = i_Office 
    AND Precinct <> ' '; 

    recCount  NUMBER DEFAULT 0; 
    totvotesall NUMBER; 
    totvotescandidateprec NUMBER; 

BEGIN 

    OPEN c2; 
    FETCH c2 into totvotesall; 
    CLOSE c2; 
    ************************************************************/ 
    FOR rec in c1 LOOP 

    recCount:= recCount + 1; 

     o_candidate(recCount):= rec.candidate; 
     o_party(recCount) := rec.party; 
     o_votes(recCount) := rec.totalvotes; 

    if rec.totalvotes = 0 then 
     o_percAll(recCount) := 0; 
    else 

     o_percAll(recCount) := round((rec.totalvotes/totvotesall)*100,2); 

    end if; 

    END LOOP; 
END calc_numbervotes; 

asp.net代码

Dim constr As String = "data source=ds;user id=uid;password=pwd;" 
Dim orclCon As OracleConnection 
orclCon = New OracleConnection(constr) 
Dim objCmd As OracleCommand = New OracleCommand() 
objCmd.Connection = orclCon 
objCmd.CommandText = "pkg_calc_votes.calc_numbervotes" 
objCmd.CommandType = CommandType.StoredProcedure 
objCmd.Parameters.Add(New OracleParameter("i_office", OracleDbType.NVarchar2, 255)).Value = "U.S. CONGRESS 05" 
objCmd.Parameters.Add(New OracleParameter("o_party", OracleDbType.NVarchar2, 10)).Direction = ParameterDirection.Output 
objCmd.Parameters.Add(New OracleParameter("o_candidate", OracleDbType.NVarchar2, 255)).Direction = ParameterDirection.Output 
objCmd.Parameters.Add(New OracleParameter("o_votes", OracleDbType.Decimal, 10)).Direction = ParameterDirection.Output 
objCmd.Parameters.Add(New OracleParameter("o_percAll", OracleDbType.Double, 10)).Direction = ParameterDirection.Output 
orclCon.Open() 
Dim orclDtRdr As OracleDataReader = Nothing 
orclDtRdr = objCmd.ExecuteReader() 
gvCursor.DataSource() = orclDtRdr 
gvCursor.DataBind() 
orclDtRdr.Close() 
orclCon.Close() 

所存储proceder从表中选择数据库中的所有数据,除了一个值,其中_o_percAll_。该参数正在sp中进行计算。

谢谢 教育暨青年局

+0

你的参数类型似乎并不匹配: NVARCHAR2 <> tblCandidate – 2010-08-05 20:27:22

+0

为什么需要在存储过程的输出参数?为什么不返回单个结果集? – 2010-08-05 20:36:50

回答

1

要使用ExecuteReader(),存储过程需要返回的结果集。您的存储过程似乎没有这样做。考虑这样做,它返回无需使用输出参数的设置结果:

CURSOR votes_cur is 
    SELECT sum(votes) from ELECTIONRESULTS 
    WHERE candidate !='Registered Voters' 
    AND office  = i_Office 
    AND Precinct <> ' '; 

    totvotesall NUMBER; 

    OPEN votes_cur; 
    FETCH votes_curinto totvotesall; 
    CLOSE votes_cur; 

    SELECT distinct candidate, party, 
    sum(votes) totalvotes, 
    round((sum(votes)/totvotesall)*100,2) votesPerc 
    FROM ELECTIONRESULTS 
    WHERE candidate not in ('Registered Voters') 
    AND office = i_office 
    AND Precinct <> ' ' 
    GROUP BY candidate,party 
    ORDER BY sum(votes) desc; 

我的PL/SQL技能是隔靴搔痒我的T-SQL技能,但我认为这可以让你接近。你甚至可以删除光标,就像这样:

totvotesall NUMBER; 

SELECT totvotesall = sum(votes) 
FROM ELECTIONRESULTS 
WHERE candidate !='Registered Voters' 
AND office  = i_Office 
AND Precinct <> ' '; 
1

你的存储过程有四个输出参数是PL/SQL关联数组(大概是,虽然你不显示究竟怎么tblcandidate等被定义在你的代码示例中)。因此,在您的.Net代码中,您需要指定将四个输出参数绑定为pl/sql关联数组,因此:

o_party.CollectionType = OracleCollectionType。PLSQLAssociativeArray

等等。看到这里了解更多详情:

OracleCommand Object - Array Binding details