用了Oracle8i,发现程储过程不能直接返回结果集,怎么通过程储过程返回结果集在c#下怎么调用。

解决方案 »

  1.   

    使用OracleCommand
    设置CommandText为你调用的存储过程名
    设置CommandType为存储过程类型
    使用ExecuteReader执行存储,返回的是一个OracleDataReader
      

  2.   

    private void JLBMJY(string PARM3,string SJJMC,string GLTJ,string PARM1,string JYGZ)
    {
    Comm= new OleDbDataAdapter(PARM3,ConnStr);
    Comm.SelectCommand.CommandType = CommandType.StoredProcedure; Comm.SelectCommand.Parameters.Add(new OleDbParameter("P_TNAME",OleDbType.VarChar,100));
    Comm.SelectCommand.Parameters["P_TNAME"].Value=SJJMC; Comm.SelectCommand.Parameters.Add(new OleDbParameter("P_USER",OleDbType.VarChar,100));
    Comm.SelectCommand.Parameters["P_USER"].Value="pedis20kf"; Comm.SelectCommand.Parameters.Add(new OleDbParameter("P_GLTJ",OleDbType.VarChar,100));
    Comm.SelectCommand.Parameters["P_GLTJ"].Value=GLTJ; DataSet Ds = new DataSet();
    Comm.Fill(Ds,SJJMC); 
    DataGrid6.DataSource=Ds.Tables[SJJMC].DefaultView;
    string ErrorRecord =Ds.Tables[0].Rows.Count.ToString();
    Label7.Text=JYGZ+"<font color=#0000FF>:错误记录"+ ErrorRecord +  "条</font>";
    string[] Shz = hz.Split(new char[]{','});
    string[] Spy = py.Split(new char[]{','});
    int szcd = Shz.Length;
    for(int i=0;i<szcd;i++)
    {
    BoundColumn BC = new BoundColumn();
    //if (Spy[i].ToString().Equals(PARM1))
    //{
    // BC.ItemStyle.BackColor = System.Drawing.Color.BurlyWood;
    //}
    if (Spy[i].ToUpper().IndexOf("RQ")>=0)
    {
    BC.DataFormatString="{0:yyyy-MM-dd}";
    }
    BC.HeaderText = Shz[i].ToString();
    BC.DataField  = Spy[i].ToString();
    DataGrid6.Columns.Add(BC);
    }
    //if (Convert.ToInt16(ErrorRecord)!=0)
    //{
    DataGrid6.DataBind();
    //}
    Comm.Dispose();
    Ds.Reset();
    DataGrid6.Dispose();
    }
      

  3.   

    不知道8i里面 out类型的参数是否可以返回结果集
    C#里面把对应的OracleType设定为Cursor
      

  4.   

    http://www.pcdog.com/p/html/20041215/151220044980_1.htm====CSDN 小助手 V2.5 2005年11月05日发布====
    CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
    界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
    下载:http://szlawbook.com/csdnv2
      

  5.   


    using System;
    using System.Data;
    using System.Xml;
    using System.Data.OracleClient;
    using System.Data.SqlClient;
    using System.Collections;namespace DataAccess
    {
    /// <summary>
    /// The OracleHelper class is intended to encapsulate high performance, scalable best practices for 
    /// common uses of SqlClient
    /// </summary>
        public sealed class OracleHelper
        {
            #region private utility methods & constructors        // Since this class provides only static methods, make the default constructor private to prevent 
            // instances from being created with "new OracleHelper()"
            private OracleHelper() {}        /// <summary>
            /// This method is used to attach array of SqlParameters to a OracleCommand.
            /// 
            /// This method will assign a value of DbNull to any parameter with a direction of
            /// InputOutput and a value of null.  
            /// 
            /// This behavior will prevent default values from being used, but
            /// this will be the less common case than an intended pure output parameter (derived as InputOutput)
            /// where the user provided no input value.
            /// </summary>
            /// <param name="command">The command to which the parameters will be added</param>
            /// <param name="commandParameters">An array of SqlParameters to be added to command</param>
            private static void AttachParameters(OracleCommand command, OracleParameter[] commandParameters)
            {
    if( command == null ) throw new ArgumentNullException( "command" );
    if( commandParameters != null )
    {
    foreach (OracleParameter p in commandParameters)
    {
    if( p != null )
    {
    // Check for derived output value with no value assigned
    if ( ( p.Direction == ParameterDirection.InputOutput || 
    p.Direction == ParameterDirection.Input ) && 
    (p.Value == null))
    {
    p.Value = DBNull.Value;
    }
    command.Parameters.Add(p);
    }
    }
    }
            }        /// <summary>
            /// This method assigns dataRow column values to an array of SqlParameters
            /// </summary>
            /// <param name="commandParameters">Array of SqlParameters to be assigned values</param>
            /// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values</param>
            private static void AssignParameterValues(OracleParameter[] commandParameters, DataRow dataRow)
            {
                if ((commandParameters == null) || (dataRow == null)) 
                {
                    // Do nothing if we get no data
                    return;
                } int i = 0;
                // Set the parameters values
                foreach(OracleParameter commandParameter in commandParameters)
                {
    // Check the parameter name
    if( commandParameter.ParameterName == null || 
    commandParameter.ParameterName.Length <= 1 )
    throw new Exception( 
    string.Format( 
    "Please provide a valid parameter name on the parameter #{0}, the ParameterName property has the following value: '{1}'.", 
    i, commandParameter.ParameterName ) );
                    if (dataRow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1)
                        commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)];
    i++;
                }
            }        /// <summary>
            /// This method assigns an array of values to an array of SqlParameters
            /// </summary>
            /// <param name="commandParameters">Array of SqlParameters to be assigned values</param>
            /// <param name="parameterValues">Array of objects holding the values to be assigned</param>
            private static void AssignParameterValues(OracleParameter[] commandParameters, object[] parameterValues)
            {
                if ((commandParameters == null) || (parameterValues == null)) 
                {
                    // Do nothing if we get no data
                    return;
                }            // We must have the same number of values as we pave parameters to put them in
                if (commandParameters.Length != parameterValues.Length)
                {
                    throw new ArgumentException("Parameter count does not match Parameter Value count.");
                }            // Iterate through the SqlParameters, assigning the values from the corresponding position in the 
                // value array
                for (int i = 0, j = commandParameters.Length; i < j; i++)
                {
                    // If the current array value derives from IDbDataParameter, then assign its Value property
    if (parameterValues[i] is IDbDataParameter)
    {
    IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i];
    if( paramInstance.Value == null )
    {
    commandParameters[i].Value = DBNull.Value; 
    }
    else
    {
    commandParameters[i].Value = paramInstance.Value;
    }
    }
    else if (parameterValues[i] == null)
    {
    commandParameters[i].Value = DBNull.Value;
    }
    else
    {
    commandParameters[i].Value = parameterValues[i];
    }
                }
            }        /// <summary>
            /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters 
            /// to the provided command
            /// </summary>
            /// <param name="command">The OracleCommand to be prepared</param>
            /// <param name="connection">A valid OracleConnection, on which to execute this command</param>
            /// <param name="transaction">A valid OracleTransaction, or 'null'</param>
            /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
            /// <param name="commandText">The stored procedure name or T-SQL command</param>
            /// <param name="commandParameters">An array of SqlParameters to be associated with the command or 'null' if no parameters are required</param>
            /// <param name="mustCloseConnection"><c>true</c> if the connection was opened by the method, otherwose is false.</param>
            private static void PrepareCommand(OracleCommand command, OracleConnection connection, OracleTransaction transaction, CommandType commandType, string commandText, OracleParameter[] commandParameters, out bool mustCloseConnection )
            {
    if( command == null ) throw new ArgumentNullException( "command" );
    if( commandText == null || commandText.Length == 0 ) throw new ArgumentNullException( "commandText" );            // If the provided connection is not open, we will open it
    if (connection.State != ConnectionState.Open)
    {
    mustCloseConnection = true;
    connection.Open();
    }
    else
    {
    mustCloseConnection = false;
    }            // Associate the connection with the command
                command.Connection = connection;            // Set the command text (stored procedure name or SQL statement)
                command.CommandText = commandText;            // If we were provided a transaction, assign it
                if (transaction != null)
                {
    if( transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );
                    command.Transaction = transaction;
                }            // Set the command type
                command.CommandType = commandType;            // Attach the command parameters if they are provided
                if (commandParameters != null)
                {
                    AttachParameters(command, commandParameters);
                }
                return;
            }        #endregion private utility methods & constructors
      

  6.   

    #region ExecuteNonQuery        /// <summary>
            /// Execute a OracleCommand (that returns no resultset and takes no parameters) against the database specified in 
            /// the connection string
            /// </summary>
            /// <res>
            /// e.g.:  
            ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders");
            /// </res>
            /// <param name="connectionString">A valid connection string for a OracleConnection</param>
            /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
            /// <param name="commandText">The stored procedure name or T-SQL command</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
            public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText)
            {
                // Pass through the call providing null for the set of SqlParameters
                return ExecuteNonQuery(connectionString, commandType, commandText, (OracleParameter[])null);
            }        /// <summary>
            /// Execute a OracleCommand (that returns no resultset) against the database specified in the connection string 
            /// using the provided parameters
            /// </summary>
            /// <res>
            /// e.g.:  
            ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24));
            /// </res>
            /// <param name="connectionString">A valid connection string for a OracleConnection</param>
            /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
            /// <param name="commandText">The stored procedure name or T-SQL command</param>
            /// <param name="commandParameters">An array of SqlParamters used to execute the command</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
            public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
            {
    if( connectionString == null || connectionString.Length == 0 ) throw new ArgumentNullException( "connectionString" );            // Create & open a OracleConnection, and dispose of it after we are done
                using (OracleConnection connection = new OracleConnection(connectionString))
                {
                    connection.Open();                // Call the overload that takes a connection in place of the connection string
                    return ExecuteNonQuery(connection, commandType, commandText, commandParameters);
                }
            }        /// <summary>
            /// Execute a stored procedure via a OracleCommand (that returns no resultset) against the database specified in 
            /// the connection string using the provided parameter values.  This method will query the database to discover the parameters for the 
            /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
            /// </summary>
            /// <res>
            /// This method provides no access to output parameters or the stored procedure's return value parameter.
            /// 
            /// e.g.:  
            ///  int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36);
            /// </res>
            /// <param name="connectionString">A valid connection string for a OracleConnection</param>
            /// <param name="spName">The name of the stored prcedure</param>
            /// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
            public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
            {
    if( connectionString == null || connectionString.Length == 0 ) throw new ArgumentNullException( "connectionString" );
    if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );            // If we receive parameter values, we need to figure out where they go
                if ((parameterValues != null) && (parameterValues.Length > 0)) 
                {
                    // Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
                    OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connectionString, spName);                // Assign the provided values to these parameters based on parameter order
                    AssignParameterValues(commandParameters, parameterValues);                // Call the overload that takes an array of SqlParameters
                    return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
                }
                else 
                {
    // Otherwise we can just call the SP without params
                    return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
                }
            }        /// <summary>
            /// Execute a OracleCommand (that returns no resultset and takes no parameters) against the provided OracleConnection. 
            /// </summary>
            /// <res>
            /// e.g.:  
            ///  int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders");
            /// </res>
            /// <param name="connection">A valid OracleConnection</param>
            /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
            /// <param name="commandText">The stored procedure name or T-SQL command</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
            public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText)
            {
                // Pass through the call providing null for the set of SqlParameters
                return ExecuteNonQuery(connection, commandType, commandText, (OracleParameter[])null);
            }        /// <summary>
            /// Execute a OracleCommand (that returns no resultset) against the specified OracleConnection 
            /// using the provided parameters.
            /// </summary>
            /// <res>
            /// e.g.:  
            ///  int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new OracleParameter("@prodid", 24));
            /// </res>
            /// <param name="connection">A valid OracleConnection</param>
            /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
            /// <param name="commandText">The stored procedure name or T-SQL command</param>
            /// <param name="commandParameters">An array of SqlParamters used to execute the command</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
            public static int ExecuteNonQuery(OracleConnection connection, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
            {
    if( connection == null ) throw new ArgumentNullException( "connection" );            // Create a command and prepare it for execution
                OracleCommand cmd = new OracleCommand();
    bool mustCloseConnection = true;
                PrepareCommand(cmd, connection, (OracleTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection );
        
                // Finally, execute the command
                int retval = cmd.ExecuteNonQuery();
        
                // Detach the SqlParameters from the command object, so they can be used again
                cmd.Parameters.Clear();
    if( mustCloseConnection )
    connection.Close();
                return retval;
            }
      

  7.   


            /// <summary>
            /// Execute a stored procedure via a OracleCommand (that returns no resultset) against the specified OracleConnection 
            /// using the provided parameter values.  This method will query the database to discover the parameters for the 
            /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
            /// </summary>
            /// <res>
            /// This method provides no access to output parameters or the stored procedure's return value parameter.
            /// 
            /// e.g.:  
            ///  int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36);
            /// </res>
            /// <param name="connection">A valid OracleConnection</param>
            /// <param name="spName">The name of the stored procedure</param>
            /// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
            public static int ExecuteNonQuery(OracleConnection connection, string spName, params object[] parameterValues)
            {
    if( connection == null ) throw new ArgumentNullException( "connection" );
    if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );            // If we receive parameter values, we need to figure out where they go
                if ((parameterValues != null) && (parameterValues.Length > 0)) 
                {
                    // Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
                    OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(connection, spName);                // Assign the provided values to these parameters based on parameter order
                    AssignParameterValues(commandParameters, parameterValues);                // Call the overload that takes an array of SqlParameters
                    return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);
                }
                else 
                {
    // Otherwise we can just call the SP without params
                    return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);
                }
            }        /// <summary>
            /// Execute a OracleCommand (that returns no resultset and takes no parameters) against the provided OracleTransaction. 
            /// </summary>
            /// <res>
            /// e.g.:  
            ///  int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders");
            /// </res>
            /// <param name="transaction">A valid OracleTransaction</param>
            /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
            /// <param name="commandText">The stored procedure name or T-SQL command</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
            public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText)
            {
                // Pass through the call providing null for the set of SqlParameters
                return ExecuteNonQuery(transaction, commandType, commandText, (OracleParameter[])null);
            }        /// <summary>
            /// Execute a OracleCommand (that returns no resultset) against the specified OracleTransaction
            /// using the provided parameters.
            /// </summary>
            /// <res>
            /// e.g.:  
            ///  int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new OracleParameter("@prodid", 24));
            /// </res>
            /// <param name="transaction">A valid OracleTransaction</param>
            /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
            /// <param name="commandText">The stored procedure name or T-SQL command</param>
            /// <param name="commandParameters">An array of SqlParamters used to execute the command</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
    public static int ExecuteNonQuery(OracleTransaction transaction, CommandType commandType, string commandText, params OracleParameter[] commandParameters)
    {
    if( transaction == null ) throw new ArgumentNullException( "transaction" );
    if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" ); // Create a command and prepare it for execution
    OracleCommand cmd = new OracleCommand();
    bool mustCloseConnection = false;
    PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection );
        
    // Finally, execute the command
    int retval = cmd.ExecuteNonQuery();
        
    // Detach the SqlParameters from the command object, so they can be used again
    cmd.Parameters.Clear();
    return retval;
    }        /// <summary>
            /// Execute a stored procedure via a OracleCommand (that returns no resultset) against the specified 
            /// OracleTransaction using the provided parameter values.  This method will query the database to discover the parameters for the 
            /// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.
            /// </summary>
            /// <res>
            /// This method provides no access to output parameters or the stored procedure's return value parameter.
            /// 
            /// e.g.:  
            ///  int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36);
            /// </res>
            /// <param name="transaction">A valid OracleTransaction</param>
            /// <param name="spName">The name of the stored procedure</param>
            /// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
            public static int ExecuteNonQuery(OracleTransaction transaction, string spName, params object[] parameterValues)
            {
    if( transaction == null ) throw new ArgumentNullException( "transaction" );
    if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" );
    if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" ); // If we receive parameter values, we need to figure out where they go
                if ((parameterValues != null) && (parameterValues.Length > 0)) 
                {
                    // Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
                    OracleParameter[] commandParameters = OracleHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);                // Assign the provided values to these parameters based on parameter order
                    AssignParameterValues(commandParameters, parameterValues);                // Call the overload that takes an array of SqlParameters
                    return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);
                }
                else 
                {
    // Otherwise we can just call the SP without params
                    return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);
                }
            }        #endregion ExecuteNonQuery