please help me with fixing this code, I am curretnly coding an admindashboard and in the admin dashboard the database I created on access currently is connected via dataviewgrid Tasks.

here is what my table looks like in the database: 
columns:
Appliance|Power Usage|Typical Usage	|Estimated annual running costs
LCD TV	0.21kWh per hour	6 hours a day (power on)	£130
Fridge Freezer (A spec)	408kWh per year	24 hours a day	£115
Tumble Dryer	2.50kWh per cycle	148 uses a year	£105
Electric hob	0.71kWh per use	424 uses a year	£85
Electric oven	1.56kWh per use	135 uses per year	£60
Dishwasher	1.44kWh per use (at 65⁰C)	135 uses per year	£55
Kettle	0.11kWh per use based on heating 1 litre of water		1,542 uses per year	£48


the problem is that when I execuete my code and enter something new manually into the database via dataviewgrid I get this error (System.Data.OleDb.OleDbException: 'No value given for one or more required parameters.') from this line exactly: int rowsAffected = cmd.ExecuteNonQuery();



this is all my code please help me fix: 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace ApplianceRental
{
    public partial class AdminDashboardForm : Form
    {
        public AdminDashboardForm()
        {
            InitializeComponent();
        }
        OleDbConnection con = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = db_users.mdb");
        OleDbCommand cmd = new OleDbCommand();
        OleDbDataAdapter da;
        DataSet ds = new DataSet();
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void Add_Click(object sender, EventArgs e)
        {

        }

        private void Edit_Click(object sender, EventArgs e)
        {

        }

        private void Delete_Click(object sender, EventArgs e)
        {

        }

        BindingSource bindingSource = new BindingSource();
        private void AdminDashboardForm_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'db_usersDataSet1.ApplianceDBLIST' table. You can move, or remove it, as needed.
            this.applianceDBLISTTableAdapter.Fill(this.db_usersDataSet1.ApplianceDBLIST);
            con.Open();
            string query = "SELECT * FROM ApplianceDBLIST";
            cmd = new OleDbCommand(query, con);
            da = new OleDbDataAdapter(cmd);

            da.InsertCommand = new OleDbCommand("INSERT INTO ApplianceDBLIST(Appliance, [Power Usage], [Typical Usage], [Estimated annual running costs]) VALUES(?, ?, ?, ?)", con);
            da.UpdateCommand = new OleDbCommand("UPDATE ApplianceDBLIST SET Appliance = ?, [Power Usage] = ?, [Typical Usage] = ?, [Estimated annual running costs] = ? WHERE Appliance = ?", con);
            da.DeleteCommand = new OleDbCommand("DELETE FROM ApplianceDBLIST WHERE Appliance = ?", con);

            da.InsertCommand.Parameters.Add("Appliance", OleDbType.VarChar, 255, "Appliance");
            da.InsertCommand.Parameters.Add("[Power Usage]", OleDbType.VarChar, 255, "Power Usage");
            da.InsertCommand.Parameters.Add("[Typical Usage]", OleDbType.VarChar, 255, "Typical Usage");
            da.InsertCommand.Parameters.Add("[Estimated annual running costs]", OleDbType.VarChar, 255, "Estimated annual running costs");

            da.UpdateCommand.Parameters.Add("Appliance", OleDbType.VarChar, 255, "Appliance");
            da.UpdateCommand.Parameters.Add("[Power Usage]", OleDbType.VarChar, 255, "Power Usage");
            da.UpdateCommand.Parameters.Add("[Typical Usage]", OleDbType.VarChar, 255, "Typical Usage");
            da.UpdateCommand.Parameters.Add("[Estimated annual running costs]", OleDbType.VarChar, 255, "Estimated annual running costs");
            da.UpdateCommand.Parameters.Add("Appliance", OleDbType.VarChar, 255, "Appliance");

            da.DeleteCommand.Parameters.Add("Appliance", OleDbType.VarChar, 255, "Appliance");

            da.Fill(ds, "ApplianceDBLIST");
            bindingSource.DataSource = ds.Tables["ApplianceDBLIST"].DefaultView;
            dataGridView1.DataSource = bindingSource;
            con.Close();
        }

        private void saveButton_Click(object sender, EventArgs e)
        {
            con.Open();

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (!row.IsNewRow)
                {
                    if (row.Cells[0].Value != null && !string.IsNullOrEmpty(row.Cells[0].Value.ToString()))
                    {
                        string appliance = row.Cells[0].Value.ToString();
                        string powerUsage = row.Cells[1].Value.ToString();
                        string typicalUsage = row.Cells[2].Value.ToString();
                        string annualCosts = row.Cells[3].Value.ToString();

                        string query = "UPDATE ApplianceDBLIST SET [Power Usage] = ?, [Typical Usage] = ?, [Estimated annual running costs] = ? WHERE Appliance = ?";
                        cmd = new OleDbCommand(query, con);

                        OleDbParameter applianceParam = new OleDbParameter("@Appliance", OleDbType.VarChar);
                        applianceParam.Value = appliance;
                        OleDbParameter powerUsageParam = new OleDbParameter("@PowerUsage", OleDbType.VarChar);
                        powerUsageParam.Value = powerUsage;
                        OleDbParameter typicalUsageParam = new OleDbParameter("@TypicalUsage", OleDbType.VarChar);
                        typicalUsageParam.Value = typicalUsage;
                        OleDbParameter annualCostsParam = new OleDbParameter("@AnnualCosts", OleDbType.VarChar);
                        annualCostsParam.Value = annualCosts;

                        cmd.Parameters.Add(powerUsageParam);
                        cmd.Parameters.Add(typicalUsageParam);
                        cmd.Parameters.Add(annualCostsParam);
                        cmd.Parameters.Add(applianceParam);

                        int rowsAffected = cmd.ExecuteNonQuery();

                        if (rowsAffected == 0)
                        {
                            query = "INSERT INTO ApplianceDBLIST (Appliance, [Power Usage], [Typical Usage], [Estimated annual running costs]) VALUES (?, ?, ?, ?)";
                            cmd = new OleDbCommand(query, con);

                            cmd.Parameters.Add(powerUsageParam);
                            cmd.Parameters.Add(typicalUsageParam);
                            cmd.Parameters.Add(annualCostsParam);
                            cmd.Parameters.Add(applianceParam);

                            cmd.ExecuteNonQuery();
                        }
                    }
                }
            }

            con.Close();
            MessageBox.Show("Data saved successfully.", "Save Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

    }
}