运行提示  参数个数或是类型不正确
oracle的存储过程如下 数据库中调试是正确的。
CREATE OR REPLACE PROCEDURE DivPageBySql
(
    pstrSql       in      varchar2,
    pnPageSize    in      NUMERIC,
    pnPageIndex   in      NUMERIC,
    pnRowCount    out     NUMERIC
)
IS    v_pfrist number;
    v_sql varchar2(4000);
    v_notecount number;
    v_min number;
    v_max number;
    v_sql1 varchar2(100);
    v_sql2 varchar2(100);
    v_sql3 varchar2(4000);BEGIN    --查询总记录的SQL
    v_sql:='select count(*) from (' || pstrSql || ')';
    --执行SQL把总记录结果得到
    execute immediate v_sql into v_notecount;
    --求出总页数
    pnRowCount := ceil(v_notecount/pnPageSize);    -- 如果传进来的页数大于最后一页,默认返回最后一页数据
    v_pfrist := pnPageIndex;
    IF(v_pfrist > pnRowCount)THEN
    v_pfrist := pnRowCount;
    end IF;    --显示页的最大记录排行值
    v_max := v_pfrist * pnPageSize;
    --显示页的最小记录排行值
    v_min := v_max - pnPageSize +1;    --分页SQL
    v_sql1 := 'select * from (select rownum rn,t.* from ';
    v_sql2 := ' t ) where rn between '||v_min||' and '||v_max;
    v_sql3 := v_sql1||' ( '||pstrSql||' ) '||v_sql2;
    execute immediate v_sql3;EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;END DivPageBySql;
调用的时候 如下 
Database.AddInParameter(command, "pstrSql", DbType.String, strSqlCmd);
Database.AddInParameter(command, "pnPageSize", DbType.Int32, pageSize);
Database.AddInParameter(command, "pnPageIndex", DbType.Int32, pageIndex);
Database.AddOutParameter(command, "pnRowCount", DbType.Int32, sizeof(int));
DataSet ds;
ds = Database.ExecuteDataSet(command);
希望各位大侠 指点,晕了 看不出来是哪一个参数不正确。OracleC#

解决方案 »

  1.   

    using System.Data.OracleClient
    oracle中的NUMERIC对应OracleType.Number
      

  2.   

    Database.AddInParameter(command, "pnPageIndex", DbType.Int32, pageIndex);
    第三个参数是DbType类型的,改成OracleType.Number 参数类型不对啊。
      

  3.   

    parameters[31].Direction = ParameterDirection.Input;
    parameters[32].Direction = ParameterDirection.Output;
      

  4.   

    你看你构建参数的时候 是不是还有 Direction 属性或参数没指定
      

  5.   

    OracleParameter[] parames ={
                                                    new OracleParameter ("pstrSql" , OracleType.VarChar),
                                                    new OracleParameter ("pnPageSize", OracleType.Number),
                                                    new OracleParameter ("pnPageIndex", OracleType.Number),
                                                    new OracleParameter ("pnRowCount", OracleType.Number),
                                                    };
                        parames[0].Value = strSqlCmd;
                        parames[1].Value = pageSize;
                        parames[2].Value = pageIndex;
                        parames[0].Direction = ParameterDirection.Input;
                        parames[1].Direction = ParameterDirection.Input;
                        parames[2].Direction = ParameterDirection.Input;
                        parames[3].Direction = ParameterDirection.Output;                    foreach (OracleParameter parameter in parames)
                        {
                            command.Parameters.Add(parameter);
                        }
                        
                        DataSet ds;
                        if (!Database.NeedTransaction)
                            ds = Database.ExecuteDataSet(command);
                        else
                            ds = Database.ExecuteDataSet(command, TransactionUtil.DataTransaction);
    改成这样 还是不对~
      

  6.   

    哪一行报错 执行的时候? 
    你现在确认2个事情 
    1.da里面执行存储过程的方法是不是对的 ExecuteNoQuay 什么的
    2.跟踪参数,看值 是不是 超限 或者值不正确 传的类型正确不代表参数值在使用的时候正确 比如长度比数据表的类型超了!
      

  7.   

    执行ds = Database.ExecuteDataSet(command);的时候报错。
    把参数放在PLSQLdeveloper里测试,是可以执行的,commond里边的参数用监视器看了 也是正确的。但是就是报参数类型或是个数不正确。
      

  8.   

    使用DbType.Decimal代替DbType.Int32,对于System.Data.OracleClient命名空间下,Oracle里面不存在DbType.Int32类型。
      

  9.   

    你的DataBase.ExcuteDataSet 原形是什么? 
    你直接用OracleCommand.ExecuteNonQuery();
    OracleCommand.ExecuteScalar();  
    参考:
    http://lovenj2008.blog.163.com/blog/static/2070740020088732812524/
    细节问题
      

  10.   

    结贴
    我把存储过程改了一下 就可以了 
    加了一个输出型游标参数
    CREATE OR REPLACE PROCEDURE DivPageBySql
    (
        pstrSql       in      varchar2,
        pnPageSize    in      NUMERIC,
        pnPageIndex   in      NUMERIC,
        pnRowCount    out     NUMERIC,
        pageResultSet out     SYS_REFCURSOR
    )
    IS    v_pfrist number;
        v_sql varchar2(4000);
        v_notecount number;
        v_min number;
        v_max number;
        v_sql1 varchar2(100);
        v_sql2 varchar2(100);
        v_sql3 varchar2(4000);
    BEGIN    --查询总记录的SQL
        v_sql:='select count(*) from (' || pstrSql || ')';
        --执行SQL把总记录结果得到
        execute immediate v_sql into v_notecount;
        --求出总页数
        pnRowCount := ceil(v_notecount/pnPageSize);    -- 如果传进来的页数大于最后一页,默认返回最后一页数据
        v_pfrist := pnPageIndex;
        IF(v_pfrist > pnRowCount)THEN
        v_pfrist := pnRowCount;
        end IF;    --显示页的最大记录排行值
        v_max := v_pfrist * pnPageSize;
        --显示页的最小记录排行值
        v_min := v_max - pnPageSize +1;    --分页SQL
        v_sql1 := 'select * from (select rownum rn,t.* from ';
        v_sql2 := ' t ) where rn between '||v_min||' and '||v_max;
        v_sql3 := v_sql1||' ( '||pstrSql||' ) '||v_sql2;
        open pageResultSet for v_sql3; END DivPageBySql;