// As OpenDataSetThroughAdapter and ExecuteNonQueryWrapper, this mothod also modified
        // so that it can able to hold a transaction for store procedure containing multiple
        // action query. So that it is now not required to make explicite transaction for DAL
        // from the business layer. (DATE: Sat, 18 June, 2005)
        public Object ExecuteScalarWrapper(String query, Boolean requiredTransaction, String conName)
        {
            IDbCommand mainCommand;
            Boolean blnBeginTrans = false;
            try
            {
                if ((query.Trim()).Length.IsZero())
                    throw new Exception("Query is blank");

                switch (ProviderType)
                {
                    case Util.ConnectionLibrary.SQlClient:
                        mainCommand = new SqlCommand();
                        break;
                    case Util.ConnectionLibrary.Oledb:
                        mainCommand = new OleDbCommand();
                        break;
                    case Util.ConnectionLibrary.ODBC:
                        mainCommand = new OdbcCommand();
                        break;
                    default:
                        mainCommand = null;
                        break;
                }
                object objRtValue = null;
                if (mainCommand.IsNotNull())
                {
                    mainCommand.CommandTimeout = CommandTimeOutValue;

                    if (requiredTransaction.IsFalse())
                    {
                        if (conName.Length > 0)
                        {
                            OpenConnection(conName);
                        }
                        else
                        {
                            OpenConnection(String.Empty);
                        }
                        transaction = disconnection.BeginTransaction(IsolationLevel.ReadUncommitted);
                        blnBeginTrans = true;
                        mainCommand.Transaction = transaction;
                    }
                    else
                    {
                        mainCommand.Transaction = transaction;
                        blnBeginTrans = true;
                    }
                    mainCommand.Connection = disconnection;
                    mainCommand.CommandText = query;
                    objRtValue = mainCommand.ExecuteScalar();
                }

                if (requiredTransaction.IsFalse())
                {
                    if (blnBeginTrans)
                    {
                        transaction.Commit();
                        blnBeginTrans = false;
                    }
                }

                return objRtValue;
            }
            catch (Exception ex)
            {
                if (requiredTransaction.IsFalse())
                {
                    if (blnBeginTrans)
                    {
                        transaction.Rollback();
                    }
                    if (disconnection.IsNotNull())
                    {
                        if (disconnection.State == ConnectionState.Open)
                        {
                            disconnection.Close();
                        }
                        disconnection.Dispose();
                        disconnection = null;
                    }
                }
                throw (ex);
            }
            finally
            {
                if (requiredTransaction.IsFalse())
                {
                    CloseConnection();
                }
            }
        }