public static List <FoodStuff> ListAllFoodstuffs()
        {
            //displays all foodstuffs that are not atomic items (that is, base ingredients)
            //this is determined by the RecipeMaterials entries:  items where the Makes and MadeOf fields are identical
            //are atomic items.  These are the ones we DO NOT want this function to return.
            List <FoodStuff> lstFoods = new List <FoodStuff>();

            try
            {
                string       query = "Select * from Foodstuff where FoodstuffID in (select Makes from RecipeMaterials where Makes <> MadeOf)"; //Not equals for Access is <> not !=
                OleDbCommand cmd   = new OleDbCommand(query, conn);
                DataConnection.OpenConnection();
                OleDbDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    List <Recipe> lstMats = DataConnection.ListOfIngredients(reader.GetString(0));

                    FoodStuff fs = new FoodStuff(reader.GetString(0),
                                                 reader.GetString(1),
                                                 reader.IsDBNull(2) ? "" : reader.GetString(2),
                                                 reader.IsDBNull(3) ? -1 : reader.GetInt32(3),
                                                 reader.IsDBNull(4) ? -1 : reader.GetInt32(4),
                                                 reader.IsDBNull(5) ? -1.0 : reader.GetDouble(5),
                                                 reader.IsDBNull(6) ? -1 : reader.GetInt32(6),
                                                 null,
                                                 lstMats);
                    //tokenize the tags from their long string stored in the database.

                    if (!(reader[7] is System.DBNull))
                    {
                        string[] strTagList = reader.GetString(7).Split(',');
                        if (strTagList.Length > 0)
                        {
                            foreach (string t in strTagList)
                            {
                                fs.AddTag(t);
                            }
                        }
                    }
                    lstFoods.Add(fs);
                }
                reader.Close();
            }
            catch (Exception ex)
            {
                //don't do anything, apparently can't post messageboxes out of this thing
                ex.ToString();
            }
            finally
            {
                DataConnection.CloseConnection();
            }
            return(lstFoods);
        }
        public static List <FoodStuff> FindFoodstuffsNamed(string inName)
        {
            //return a list of foodstuffs whose names contain the passed in value
            //does not distinguish between base ingredients and final items.
            List <FoodStuff> lstFoods = new List <FoodStuff>();

            try
            {
                string       query = "Select * from Foodstuff where Name like ?";
                OleDbCommand cmd   = new OleDbCommand(query, conn);
                cmd.Parameters.Add("?", OleDbType.VarChar).Value = inName;
                OleDbDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    List <Recipe> lstMats = DataConnection.ListOfIngredients(reader.GetString(0));
                    FoodStuff     fs      = new FoodStuff(reader.GetString(0),
                                                          reader.GetString(1),
                                                          reader.IsDBNull(2) ? "" : reader.GetString(2),
                                                          reader.IsDBNull(3) ? -1 : reader.GetInt32(3),
                                                          reader.IsDBNull(4) ? -1 : reader.GetInt32(4),
                                                          reader.IsDBNull(5) ? -1.0 : reader.GetDouble(5),
                                                          reader.IsDBNull(6) ? -1 : reader.GetInt32(6),
                                                          null,
                                                          lstMats);


                    //tokenize the tags from their long string stored in the database.

                    string[] strTagList = reader.IsDBNull(7) ? new string[0] : reader.GetString(7).Split(',');

                    foreach (string t in strTagList)
                    {
                        fs.AddTag(t);
                    }


                    lstFoods.Add(fs);
                }
                reader.Close();
            }
            catch (Exception ex)
            {
            }
            finally
            {
                DataConnection.CloseConnection();
            }

            return(lstFoods);
        }
        public static FoodStuff GetFoodstuffWithID(string fsID)
        {
            //really simple, match the foodstuff ID passed in with the ID in the table and return it.
            FoodStuff fs = new FoodStuff();

            try
            {
                string       query = "Select * from Foodstuff where FoodstuffID like ?";
                OleDbCommand cmd   = new OleDbCommand(query, conn);
                cmd.Parameters.Add("?", OleDbType.VarChar).Value = fsID;
                OleDbDataReader reader = cmd.ExecuteReader();


                reader.Read();
                string        id      = reader.IsDBNull(0) ? "" : reader.GetString(0);
                List <Recipe> lstMats = DataConnection.ListOfIngredients(reader.GetString(0));

                fs = new FoodStuff(reader.GetString(0),
                                   reader.GetString(1),
                                   reader.IsDBNull(2) ? "" : reader.GetString(2),
                                   reader.IsDBNull(3) ? -1 : reader.GetInt32(3),
                                   reader.IsDBNull(4) ? -1 : reader.GetInt32(4),
                                   reader.IsDBNull(5) ? -1.0 : reader.GetDouble(5),
                                   reader.IsDBNull(6) ? -1 : reader.GetInt32(6),
                                   null,
                                   lstMats);


                //tokenize the tags from their long string stored in the database.

                string[] strTagList = reader.IsDBNull(7) ? new string[0] : reader.GetString(7).Split(',');

                if (strTagList.Length != 0)
                {
                    foreach (string t in strTagList)
                    {
                        fs.AddTag(t);
                    }
                }
                reader.Close();
            }
            catch (Exception ex)
            {
            }
            finally
            {
                DataConnection.CloseConnection();
            }
            return(fs);
        }
        public static List<FoodStuff> ListAllFoodstuffs()
        {
            //displays all foodstuffs that are not atomic items (that is, base ingredients)
            //this is determined by the RecipeMaterials entries:  items where the Makes and MadeOf fields are identical
            //are atomic items.  These are the ones we DO NOT want this function to return.
            List<FoodStuff> lstFoods = new List<FoodStuff>();
            try
            {
                string query = "Select * from Foodstuff where FoodstuffID in (select Makes from RecipeMaterials where Makes <> MadeOf)"; //Not equals for Access is <> not !=
                OleDbCommand cmd = new OleDbCommand(query, conn);
                DataConnection.OpenConnection();
                OleDbDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    List<Recipe> lstMats = DataConnection.ListOfIngredients(reader.GetString(0));

                    FoodStuff fs = new FoodStuff(reader.GetString(0),
                                                 reader.GetString(1),
                                                 reader.IsDBNull(2) ? "" : reader.GetString(2),
                                                 reader.IsDBNull(3) ? -1 : reader.GetInt32(3),
                                                 reader.IsDBNull(4) ? -1 : reader.GetInt32(4),
                                                 reader.IsDBNull(5) ? -1.0 : reader.GetDouble(5),
                                                 reader.IsDBNull(6) ? -1 : reader.GetInt32(6),
                                                 null,
                                                 lstMats);
                    //tokenize the tags from their long string stored in the database.

                    if (!(reader[7] is System.DBNull))
                    {
                        string[] strTagList = reader.GetString(7).Split(',');
                        if (strTagList.Length > 0)
                        {
                            foreach (string t in strTagList)
                                fs.AddTag(t);
                        }
                    }
                    lstFoods.Add(fs);
                }
                reader.Close();
            }
            catch (Exception ex)
            {
                //don't do anything, apparently can't post messageboxes out of this thing
                ex.ToString();
            }
            finally
            {
                DataConnection.CloseConnection();
            }
            return lstFoods;
        }
        public static FoodStuff GetFoodstuffWithID(string fsID)
        {
            //really simple, match the foodstuff ID passed in with the ID in the table and return it.
            FoodStuff fs = new FoodStuff();
            try
            {
                string query = "Select * from Foodstuff where FoodstuffID like ?";
                OleDbCommand cmd = new OleDbCommand(query, conn);
                cmd.Parameters.Add("?", OleDbType.VarChar).Value = fsID;
                OleDbDataReader reader = cmd.ExecuteReader();

                reader.Read();
                string id = reader.IsDBNull(0) ? "" : reader.GetString(0);
                List<Recipe> lstMats = DataConnection.ListOfIngredients(reader.GetString(0));

                fs = new FoodStuff(reader.GetString(0),
                                   reader.GetString(1),
                                   reader.IsDBNull(2) ? "" : reader.GetString(2),
                                   reader.IsDBNull(3) ? -1 : reader.GetInt32(3),
                                   reader.IsDBNull(4) ? -1 : reader.GetInt32(4),
                                   reader.IsDBNull(5) ? -1.0 : reader.GetDouble(5),
                                   reader.IsDBNull(6) ? -1 : reader.GetInt32(6),
                                   null,
                                   lstMats);

                //tokenize the tags from their long string stored in the database.

                string[] strTagList = reader.IsDBNull(7) ? new string[0] : reader.GetString(7).Split(',');

                if (strTagList.Length != 0)
                {
                    foreach (string t in strTagList)
                        fs.AddTag(t);
                }
                reader.Close();

            }
            catch (Exception ex)
            {

            }
            finally
            {
                DataConnection.CloseConnection();

            }
            return fs;
        }
        public static List<FoodStuff> FindFoodstuffsTagged(List<string> TagsToMatch)
        {
            //find a match for the tags in the passed-in list of tags in the foodstuff's tag string
            List<FoodStuff> FoodstuffsFound = new List<FoodStuff>();

            try
            {

                if (TagsToMatch.Count > 0)
                {
                    OleDbCommand cmd = new OleDbCommand();
                    cmd.Connection = conn;
                    string query = "select * from foodstuffs where tags like ?";
                    cmd.Parameters.Add(TagsToMatch[0]);
                    if (TagsToMatch.Count > 1)
                    {
                        for (int i = 1; i < TagsToMatch.Count - 1; i++)
                        {
                            query += " or tags like ?";
                            cmd.Parameters.Add(TagsToMatch[i]);
                        }
                    }
                    cmd.CommandText = query;
                    OleDbDataReader reader = cmd.ExecuteReader();

                    while (reader.Read())
                    {
                        List<Recipe> lstMats = DataConnection.ListOfIngredients(reader.GetString(0));

                        FoodStuff fs = new FoodStuff(reader.GetString(0),
                                                   reader.GetString(1),
                                   reader.IsDBNull(2) ? "" : reader.GetString(2),
                                   reader.IsDBNull(3) ? -1 : reader.GetInt32(3),
                                   reader.IsDBNull(4) ? -1 : reader.GetInt32(4),
                                   reader.IsDBNull(5) ? -1.0 : reader.GetDouble(5),
                                   reader.IsDBNull(6) ? -1 : reader.GetInt32(6),
                                                   null,
                                                   lstMats);
                        //tokenize the tags from their long string stored in the database.

                        if (!(reader[7] is System.DBNull))
                        {
                            string[] strTagList = reader.GetString(7).Split(',');
                            if (strTagList.Length > 0)
                            {
                                foreach (string t in strTagList)
                                    fs.AddTag(t);
                            }
                        }
                        FoodstuffsFound.Add(fs);
                    }
                    reader.Close();
                }
            }
            catch (Exception ex)
            {

                // throw;
            }
            finally
            {
                DataConnection.CloseConnection();
            }

            return FoodstuffsFound;
        }
        public static List<FoodStuff> FindFoodstuffsNamed(string inName)
        {
            //return a list of foodstuffs whose names contain the passed in value
            //does not distinguish between base ingredients and final items.
            List<FoodStuff> lstFoods = new List<FoodStuff>();
            try
            {
                string query = "Select * from Foodstuff where Name like ?";
                OleDbCommand cmd = new OleDbCommand(query, conn);
                cmd.Parameters.Add("?", OleDbType.VarChar).Value = inName;
                OleDbDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    List<Recipe> lstMats = DataConnection.ListOfIngredients(reader.GetString(0));
                    FoodStuff fs = new FoodStuff(reader.GetString(0),
                                                 reader.GetString(1),
                                                 reader.IsDBNull(2) ? "" : reader.GetString(2),
                                                 reader.IsDBNull(3) ? -1 : reader.GetInt32(3),
                                                 reader.IsDBNull(4) ? -1 : reader.GetInt32(4),
                                                 reader.IsDBNull(5) ? -1.0 : reader.GetDouble(5),
                                                 reader.IsDBNull(6) ? -1 : reader.GetInt32(6),
                                                 null,
                                                 lstMats);

                    //tokenize the tags from their long string stored in the database.

                    string[] strTagList = reader.IsDBNull(7) ? new string[0] : reader.GetString(7).Split(',');

                    foreach (string t in strTagList)
                        fs.AddTag(t);

                    lstFoods.Add(fs);
                }
                reader.Close();
            }
            catch (Exception ex)
            {

            }
            finally
            {

                DataConnection.CloseConnection();
            }

            return lstFoods;
        }
        public static List <FoodStuff> FindFoodstuffsTagged(List <string> TagsToMatch)
        {
            //find a match for the tags in the passed-in list of tags in the foodstuff's tag string
            List <FoodStuff> FoodstuffsFound = new List <FoodStuff>();

            try
            {
                if (TagsToMatch.Count > 0)
                {
                    OleDbCommand cmd = new OleDbCommand();
                    cmd.Connection = conn;
                    string query = "select * from foodstuffs where tags like ?";
                    cmd.Parameters.Add(TagsToMatch[0]);
                    if (TagsToMatch.Count > 1)
                    {
                        for (int i = 1; i < TagsToMatch.Count - 1; i++)
                        {
                            query += " or tags like ?";
                            cmd.Parameters.Add(TagsToMatch[i]);
                        }
                    }
                    cmd.CommandText = query;
                    OleDbDataReader reader = cmd.ExecuteReader();

                    while (reader.Read())
                    {
                        List <Recipe> lstMats = DataConnection.ListOfIngredients(reader.GetString(0));

                        FoodStuff fs = new FoodStuff(reader.GetString(0),
                                                     reader.GetString(1),
                                                     reader.IsDBNull(2) ? "" : reader.GetString(2),
                                                     reader.IsDBNull(3) ? -1 : reader.GetInt32(3),
                                                     reader.IsDBNull(4) ? -1 : reader.GetInt32(4),
                                                     reader.IsDBNull(5) ? -1.0 : reader.GetDouble(5),
                                                     reader.IsDBNull(6) ? -1 : reader.GetInt32(6),
                                                     null,
                                                     lstMats);
                        //tokenize the tags from their long string stored in the database.

                        if (!(reader[7] is System.DBNull))
                        {
                            string[] strTagList = reader.GetString(7).Split(',');
                            if (strTagList.Length > 0)
                            {
                                foreach (string t in strTagList)
                                {
                                    fs.AddTag(t);
                                }
                            }
                        }
                        FoodstuffsFound.Add(fs);
                    }
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                // throw;
            }
            finally
            {
                DataConnection.CloseConnection();
            }

            return(FoodstuffsFound);
        }