예제 #1
0
        /// <summary>
        ///
        ///		Return the cached procedure.
        ///
        /// </summary>
        /// <param name="connection">
        ///
        ///		The connection to use to get the procedure detail
        ///
        /// </param>
        /// <param name="procedureName">
        ///
        ///		The procedure identifier.
        ///
        /// </param>
        /// <returns>
        ///
        ///		A procedure.
        ///
        /// </returns>

        private static DbUtilProcedure Procedure(
            SqlConnection connection,
            string procedureName, SqlTransaction oTransaction)
        {
            DbUtilProcedure procedure = null;

            if (!m_ProcedureCache.Contains(procedureName))
            {
                SqlDataReader reader = null;

                try
                {
                    m_ProcedureCacheLock.AcquireWriterLock(Timeout.Infinite);

                    if (!m_ProcedureCache.Contains(procedureName))
                    {
                        procedure = new DbUtilProcedure();

                        SqlCommand command = new SqlCommand("spUTL_GetProcedureMetaData", connection);
                        command.Parameters.AddWithValue("@objname", procedureName);
                        command.CommandType = CommandType.StoredProcedure;
                        command.Transaction = oTransaction;

                        reader = command.ExecuteReader();

                        procedure.ProcedureName = procedureName;

                        while (reader.Read())
                        {
                            DbUtilParameter parameter = new DbUtilParameter();

                            parameter.ParameterName   = reader.GetString(0);
                            parameter.ParameterLength = reader.GetInt32(2);
                            parameter.ParameterType   =
                                DbUtilParameter.StringToType(reader.GetString(1));
                            parameter.ParameterDirection =
                                DbUtilParameter.IntToDirection(reader.GetInt32(5));

                            procedure.ProcedureParameters.Add(parameter);
                        }
                        {
                            //Adding a Return Type as the SP can't return that value.
                            DbUtilParameter parameter = new DbUtilParameter();

                            parameter.ParameterName      = "@RETURN_VALUE";
                            parameter.ParameterLength    = 4;
                            parameter.ParameterType      = SqlDbType.Int;
                            parameter.ParameterDirection = ParameterDirection.ReturnValue;

                            procedure.ProcedureParameters.Add(parameter);
                        }

                        // Update Cache
                        m_ProcedureCache[procedureName] = procedure;
                    }
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                    m_ProcedureCacheLock.ReleaseWriterLock();
                }
            }

            try
            {
                m_ProcedureCacheLock.AcquireReaderLock(Timeout.Infinite);
                procedure = (DbUtilProcedure)(m_ProcedureCache[procedureName]);
            }
            catch (System.Exception)
            {
                // do nothing
            }
            finally
            {
                m_ProcedureCacheLock.ReleaseReaderLock();
            }
            return(procedure);
        }
예제 #2
0
        /// <summary>
        /// 
        ///		Return the cached procedure.
        ///		
        /// </summary>
        /// <param name="connection">
        /// 
        ///		The connection to use to get the procedure detail
        ///
        /// </param>
        /// <param name="procedureName">
        /// 
        ///		The procedure identifier.
        ///		
        /// </param>
        /// <returns>
        /// 
        ///		A procedure.
        ///		
        /// </returns>
        private static DbUtilProcedure Procedure(
            SqlConnection connection,
            string procedureName, SqlTransaction oTransaction)
        {
            DbUtilProcedure procedure = null;
            if (!m_ProcedureCache.Contains(procedureName))
            {

                SqlDataReader reader = null;

                try
                {

                    m_ProcedureCacheLock.AcquireWriterLock(Timeout.Infinite);

                    if (!m_ProcedureCache.Contains(procedureName))
                    {

                        procedure = new DbUtilProcedure();

                        SqlCommand command = new SqlCommand("spUTL_GetProcedureMetaData", connection);
                        command.Parameters.AddWithValue("@objname", procedureName);
                        command.CommandType = CommandType.StoredProcedure;
                        command.Transaction = oTransaction;

                        reader = command.ExecuteReader();

                        procedure.ProcedureName = procedureName;

                        while (reader.Read())
                        {

                            DbUtilParameter parameter = new DbUtilParameter();

                            parameter.ParameterName = reader.GetString(0);
                            parameter.ParameterLength = reader.GetInt32(2);
                            parameter.ParameterType =
                                DbUtilParameter.StringToType(reader.GetString(1));
                            parameter.ParameterDirection =
                                DbUtilParameter.IntToDirection(reader.GetInt32(5));

                            procedure.ProcedureParameters.Add(parameter);
                        }
                        {
                            //Adding a Return Type as the SP can't return that value.
                            DbUtilParameter parameter = new DbUtilParameter();

                            parameter.ParameterName = "@RETURN_VALUE";
                            parameter.ParameterLength = 4;
                            parameter.ParameterType = SqlDbType.Int;
                            parameter.ParameterDirection = ParameterDirection.ReturnValue;

                            procedure.ProcedureParameters.Add(parameter);
                        }

                        // Update Cache
                        m_ProcedureCache[procedureName] = procedure;
                    }
                }
                catch (System.Exception ex)
                {

                    throw ex;
                }
                finally
                {

                    if (reader != null)
                    {

                        reader.Close();
                    }
                    m_ProcedureCacheLock.ReleaseWriterLock();
                }
            }

            try
            {

                m_ProcedureCacheLock.AcquireReaderLock(Timeout.Infinite);
                procedure = (DbUtilProcedure)(m_ProcedureCache[procedureName]);
            }
            catch (System.Exception)
            {

                // do nothing
            }
            finally
            {

                m_ProcedureCacheLock.ReleaseReaderLock();
            }
            return procedure;
        }