我在Oracle中定义了一存储过程,返回一个结果集,如:
create or replace package pk1
is
type rc is ref cursor;
procedure pk_p1 (v_REID varchar2,dvT_rc out rc);
end;该存储过程(略)在Oracle中调试通过,但我无法用C#或VB.NET调用(我用的是OleDB)
我看了一些文章说用OracleClient,但我.Net环境中没有OracleClient,如何才能使用?我的程序中:
myCommand.CommandText = "pk1.pk_p1"
myCommand.CommandType = CommandType.StoredProcedure
myCommand.Parameters.Add("@v1", OleDb.OleDbType.VarChar).Value = str1
    Dim myRS As OleDb.OleDbDataReader
    myRS = myCommand.ExecuteReader()
错:说参数个数不对

解决方案 »

  1.   

    不使用oraclehelper类,http://blog.csdn.net/gztoby/archive/2004/10/19/142286.aspx
    使用oraclehelper类,http://community.csdn.net/Expert/topic/3912/3912516.xml?temp=.6948206
      

  2.   

    可我用的是OleDB,不是OracleClient啊,所以没有OracleType.Cursor类型的返回值,我怎么在OleDB中定义一个结果集的参数类型作为返回值呢?
      

  3.   

    to wh8254(为了俺老婆,努力写程序) 
    你是说什么应该可以?
    OleDB应该可以接收返回的结果集?能给个例子吗?to wu896222(wu896222) 
    oraclehelper?是什么样的东西?能作个简单的介绍吗?
      

  4.   

    to tianzhijian(天之剑)
    你说的是存储过程吗?我的存储过程的确是在包中的,主要是返回了结果集,其他的参数都能解决,就是无法得到结果集,更无法传入结果集(以前有个存储过程中有一输入参数为一光标,就是因为无法传入,所以后来只有修改输入参数,到现在我也不知道怎么传送结果集到存储过程中,郁闷~~~)
      

  5.   

    /*********** 存储过程--返回数据集 ******************************
     * 
     *CREATE OR REPLACE PACKAGE TestProc AS TYPE refCursorxx IS REF CURSOR;
     * PROCEDURE ReturnDataSet(para OUT refCursorxx);
     * END;
              *
     * CREATE OR REPLACE PACKAGE BODY Testproc AS
     * PROCEDURE ReturnDataSet(para OUT refCursorxx) IS
     * BEGIN
     * OPEN para FOR SELECT * FROM ROLLPLAN;
     * END ReturnDataSet;
     * END;
     * 
     *****************************************************************************/ /// <summary>
    /// 通过存储过程返回查询表的信息
    /// </summary>
    /// <param name="sprocName">存储过程名称</param>
    /// <returns>DataTable</returns>
    protected DataTable GetTable(string sprocName)
    {
    conn.Open();
    try
    {
    mycm.CommandText = sprocName;
    mycm.CommandType = CommandType.StoredProcedure;
    mycm.Parameters.Add(new OracleParameter("para", OracleType.Cursor)).Direction = ParameterDirection.Output;
    myda.SelectCommand = mycm; myda.Fill(myds); }
    catch(Exception ex)
    {
    throw ex;
    }
    finally
    {
    //无论语句执行正确与否,都关闭连接释放资源
    conn.Close();
    }
    return myds.Tables[0];
    }
      

  6.   

    .Net环境中没有OracleClient 是 VS2003 就有 2002 可以到ms 网站搞到
    用oledb 必须用Oracle 带的那个
    连接串如下,你应该可以看懂
    Provider=OraOLEDB.Oracle;Data Source=Ora9i1;User ID=username;Password=pass;PLSQLRSet=1;PLSQLRSet=1 必须否则调用不要存储过程然后
    myCommand.CommandText = "{CALL pk1.pk_p1(?)}"; //返回游标的那个不用给参数
    //myCommand.CommandType 也不用设置
    myCommand.Parameters.Add("@v1", OleDb.OleDbType.VarChar).Value = str1
    Dim myRS As OleDb.OleDbDataReader
    myRS = myCommand.ExecuteReader()
    //就OK 了
    [Oracle 目录]\oledb\samples 下有个 VB6 的烈子可以看看。
      

  7.   

    非常感谢FlashElf(銘龘鶽),结贴!
      

  8.   

    非常感谢FlashElf(銘龘鶽),结贴!