// retrieve object with given ID
        public static Agents GetValue(int objID)
        {
            Agents obj = null;

            // create connection
            SqlConnection connection = TravelExperts.GetConection();

            // create SELECT command
            string query =
                "SELECT AgentId, AgtFirstName, AgtMiddleInitial, AgtLastName, AgtBusPhone, AgtEmail, AgtPosition, AgencyId " +
                "FROM Agents " +
                "WHERE AgentId = @AgentId ";
            SqlCommand cmd = new SqlCommand(query, connection);

            // suply perameter value
            cmd.Parameters.AddWithValue("@AgentId", objID);

            // run the SELECT query
            try
            {
                // open the conection
                connection.Open();

                // run the command
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);

                // build object object to return
                if (reader.Read()) // if there is a object with this ID
                {
                    obj                  = new Agents();
                    obj.AgentId          = Convert.ToInt32(reader["AgentId"]);
                    obj.AgtFirstName     = reader["AgtFirstName"].ToString();
                    obj.AgtMiddleInitial = reader["AgtMiddleInitial"].ToString();
                    obj.AgtLastName      = reader["AgtLastName"].ToString();
                    obj.AgtBusPhone      = reader["AgtBusPhone"].ToString();
                    obj.AgtEmail         = reader["AgtEmail"].ToString();
                    obj.AgtPosition      = reader["AgtPosition"].ToString();
                    obj.AgencyId         = Convert.ToInt32(reader["AgencyId"]);
                }
                reader.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally // executes always
            {
                connection.Close();
            }

            return(obj);
        }
        }                                 // FK

        // makes identival copy of Customer
        public Agents Clone()
        {
            Agents copy = new Agents();

            copy.AgentId          = this.AgentId;
            copy.AgtFirstName     = this.AgtFirstName;
            copy.AgtMiddleInitial = this.AgtMiddleInitial;
            copy.AgtLastName      = this.AgtLastName;
            copy.AgtBusPhone      = this.AgtBusPhone;
            copy.AgtEmail         = this.AgtEmail;
            copy.AgtPosition      = this.AgtPosition;
            copy.AgencyId         = this.AgencyId; // FK
            return(copy);
        }
        // insert new row to table
        // return new object
        public static int Add(Agents obj)
        {
            int custID = 0;

            // create connection
            SqlConnection connection = TravelExperts.GetConection();

            // create INSERT command
            // CustomerID is IDENTITY so no value provided
            string insertStatment =
                "INSERT INTO Agents(AgentId, AgtFirstName, AgtMiddleInitial, AgtLastName, AgtBusPhone, AgtEmail, AgtPosition, AgencyId) " +
                "OUTPUT inserted.[AgentId] " +
                "VALUES(@AgentId, @AgtFirstName, @AgtMiddleInitial, @AgtLastName, @AgtBusPhone, @AgtEmail, @AgtPosition, @AgencyId) ";
            SqlCommand cmd = new SqlCommand(insertStatment, connection);

            // suply perameter value
            cmd.Parameters.AddWithValue("@AgentId", obj.AgentId);
            cmd.Parameters.AddWithValue("@AgtFirstName", obj.AgtFirstName);
            cmd.Parameters.AddWithValue("@AgtMiddleInitial", obj.AgtMiddleInitial);
            cmd.Parameters.AddWithValue("@AgtLastName", obj.AgtLastName);
            cmd.Parameters.AddWithValue("@AgtBusPhone", obj.AgtBusPhone);
            cmd.Parameters.AddWithValue("@AgtEmail", obj.AgtEmail);
            cmd.Parameters.AddWithValue("@AgtPosition", obj.AgtPosition);
            cmd.Parameters.AddWithValue("@AgencyId", obj.AgencyId);

            // execute the INSERT command
            try
            {
                // open the conection
                connection.Open();

                // execute insert command
                custID = (int)cmd.ExecuteScalar();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally // executes always
            {
                connection.Close();
            }
            // retrieve generated customer nID to return
            return(custID);
        }
        // retrieve all objects
        public static List <Agents> GetAll()
        {
            // create SELECT command
            string query =
                "SELECT AgentId, AgtFirstName, AgtMiddleInitial, AgtLastName, AgtBusPhone, AgtEmail, AgtPosition, AgencyId " +
                "FROM Agents ";
            SqlConnection connection = TravelExperts.GetConection();
            List <Agents> dataList   = new List <Agents>(); // epmty list
            Agents        data;                             // for reading
                                                            // create connection



            SqlCommand cmd = new SqlCommand(query, connection);

            // open the conection
            connection.Open();

            // run the command
            SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            // build object list to return
            while (reader.Read()) // if there is a object with this ID
            {
                data                  = new Agents();
                data.AgentId          = Convert.ToInt32(reader["AgentId"]);
                data.AgtFirstName     = reader["AgtFirstName"].ToString();
                data.AgtMiddleInitial = reader["AgtMiddleInitial"].ToString();
                data.AgtLastName      = reader["AgtLastName"].ToString();
                data.AgtBusPhone      = reader["AgtBusPhone"].ToString();
                data.AgtEmail         = reader["AgtEmail"].ToString();
                data.AgtPosition      = reader["AgtPosition"].ToString();
                data.AgencyId         = Convert.ToInt32(reader["AgencyId"]);
                dataList.Add(data);
            }

            return(dataList);
        }
        // Update object
        // return indicator of success
        public static bool Update(Agents oldObj, Agents newObj)
        {
            bool success = false; // did not update

            // create connection
            SqlConnection connection = TravelExperts.GetConection();

            // create UPDATE command
            string updateStatment =
                "UPDATE Agents SET " +
                "AgentId = @NewAgentId, " +
                "AgtFirstName = @NewAgtFirstName, " +
                "AgtMiddleInitial = @NewAgtMiddleInitial, " +
                "AgtLastName = @NewAgtLastName, " +
                "AgtBusPhone = @NewAgtBusPhone, " +
                "AgtEmail = @NewAgtEmail, " +
                "AgtPosition = @NewAgtPosition, " +
                "AgencyId = @NewAgencyId " +
                "WHERE AgentId = @OldAgentId " +         // identifies
                "AND AgtFirstName = @OldAgtFirstName " + // the rest - for optimistic concurrency
                "AND AgtFirstName = @OldAgtFirstName " +
                "AND AgtMiddleInitial = @OldAgtMiddleInitial " +
                "AND AgtLastName = @OldAgtLastName " +
                "AND AgtBusPhone = @OldAgtBusPhone " +
                "AND AgtEmail = @OldAgtEmail " +
                "AND AgtPosition = @OldAgtPosition " +
                "AND AgencyId = @OldAgencyId ";
            SqlCommand cmd = new SqlCommand(updateStatment, connection);

            // suply perameter value

            // New object Values
            cmd.Parameters.AddWithValue("@NewAgentId", newObj.AgentId);
            cmd.Parameters.AddWithValue("@NewAgtFirstName", newObj.AgtFirstName);
            cmd.Parameters.AddWithValue("@NewAgtMiddleInitial", newObj.AgtMiddleInitial);
            cmd.Parameters.AddWithValue("@NewAgtLastName", newObj.AgtLastName);
            cmd.Parameters.AddWithValue("@NewAgtBusPhone", newObj.AgtBusPhone);
            cmd.Parameters.AddWithValue("@NewAgtEmail", newObj.AgtEmail);
            cmd.Parameters.AddWithValue("@NewAgtPosition", newObj.AgtPosition);
            cmd.Parameters.AddWithValue("@NewAgencyId", newObj.AgencyId);
            // ID
            cmd.Parameters.AddWithValue("@OldAgentId", oldObj.AgentId);
            // Old object Values
            cmd.Parameters.AddWithValue("@OldAgtFirstName", oldObj.AgtFirstName);
            cmd.Parameters.AddWithValue("@OldAgtMiddleInitial", oldObj.AgtMiddleInitial);
            cmd.Parameters.AddWithValue("@OldAgtLastName", oldObj.AgtLastName);
            cmd.Parameters.AddWithValue("@OldAgtBusPhone", oldObj.AgtBusPhone);
            cmd.Parameters.AddWithValue("@OldAgtEmail", oldObj.AgtEmail);
            cmd.Parameters.AddWithValue("@OldAgtPosition", oldObj.AgtPosition);
            cmd.Parameters.AddWithValue("@OldAgencyId", oldObj.AgencyId);

            // execute the UPDATE command
            try
            {
                // open the conection
                connection.Open();

                // execute the command
                int count = cmd.ExecuteNonQuery();

                // check if successful
                if (count > 0)
                {
                    success = true;            // updated
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally // executes always
            {
                connection.Close();
            }
            // retrieve generated object ID to return
            return(success);
        }