4 votes

Erreur : La mise à jour nécessite une commande UpdateCommand valide lorsqu'une collection DataRow contenant des lignes modifiées lui est transmise.

J'utilise la pagination pour afficher les données dans datagridview mais lorsque j'essaie de mettre à jour une donnée avec updatebutton Les données doivent être mises à jour. datagridview ainsi que dans la base de données.

Mais j'obtiens cette erreur :

La mise à jour nécessite une commande UpdateCommand valide lorsqu'on lui transmet une collection DataRow avec des lignes modifiées

qui se produit sur cette ligne :

adp1.Update(dt);//here I am getting error

Voici le code

public partial class EditMediClgList : Form
    {        
        public EditMediClgList()
        {
            InitializeComponent();
            try
            {
                con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb");
                con.Open();
            }
            catch (Exception err)
            {
                MessageBox.Show("Error:" +err);
            }

            cmd1 = new OleDbCommand("Select * from MedicalColeges order by MedicalClgID", con);
            ds = new DataSet();
            adp1 = new OleDbDataAdapter(cmd1);
            adp1.Fill(ds, "MedicalColeges");
            dataGridView1.DataSource = ds;

            // Get total count of the pages; 
            this.CalculateTotalPages();
            // Load the first page of data; 
            this.dataGridView1.DataSource = GetCurrentRecords(1, con);

        }
        private void CalculateTotalPages()
        {
            int rowCount = ds.Tables["MedicalColeges"].Rows.Count;
            this.TotalPage = rowCount / PageSize;
            if (rowCount % PageSize > 0) // if remainder is more than  zero 
            {
                this.TotalPage += 1;
            }
        }
        private DataTable GetCurrentRecords(int page, OleDbConnection con)
        {
             dt = new DataTable();

            if (page == 1)
            {
                cmd2 = new OleDbCommand("Select TOP " + PageSize + " * from MedicalColeges ORDER BY MedicalClgID", con);
                // CurrentPageIndex++;
            }
            else
            {
                int PreviouspageLimit = (page - 1) * PageSize;

                cmd2 = new OleDbCommand("Select TOP " + PageSize +
                    " * from MedicalColeges " +
                    "WHERE MedicalClgID NOT IN " +
                "(Select TOP " + PreviouspageLimit + " MedicalClgID from MedicalColeges ORDER BY MedicalClgID) ", con); // +
                //"order by customerid", con);
            }
            try
            {
                // con.Open();
                this.adp1.SelectCommand = cmd2;
                this.adp1.Fill(dt);
                txtPaging.Text = string.Format("page{0} of {1} pages", this.CurrentPageIndex, this.TotalPage);
            }
            finally
            {
               // con.Close();
            }
            return dt;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {                
                adp1.Update(dt);//here I am getting error
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message.ToString());
            }

        }
}

10voto

Chris Points 7289

Vous avez créé le OleDbDataAdapter avec un Select uniquement :

adp1 = new OleDbDataAdapter(cmd1);

OleDbDataAdapter doit être valide Update , Insert, Delete à utiliser pour enregistrer les données comme suit :

adp1.Update(dt);//here I am getting error

Il suffit d'utiliser un OleDbCommandBuilder qui générera les commandes pour vous :

adp1 = new OleDbDataAdapter();
adp1.SelectCommand = cmd1; // cmd1 is your SELECT command
OleDbCommandBuilder cb = new OleDbCommandBuilder(adp1);

EDITAR

Puisque vous modifiez la commande Select du OleDbDataAdapter à l'exécution pour la pagination, ce dont vous avez besoin, c'est de l'initialiser à chaque fois que vous enregistrez des données :

private void button1_Click(object sender, EventArgs e)
    {
        try
        {                
            adp1.SelectCommand = cmd1; // cmd1 is your SELECT command
            OleDbCommandBuilder cb = new OleDbCommandBuilder(adp1);
            adp1.Update(dt); //here I hope you won't get error :-)
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message.ToString());
        }

    }

3voto

Eaint Points 61

Il se peut qu'il manque une clé primaire dans la table. Vous devez vous assurer que la clé primaire est définie sur une colonne de votre table de base de données.

1voto

Nallware Points 149

J'ai dû modifier ma colonne d'index (incrémentale) pour la remplacer par la colonne clé primaire de ma table (comme le suggère Eaint). Après cela, j'ai dû extraire le DataSet.xsd dans la vue du concepteur, faire un clic droit sur l'objet DataTable visuel et sélectionner configurer. Lorsque l'assistant de configuration de TableAdapter s'est ouvert, j'ai cliqué sur le bouton Options avancées. J'ai coché la case Generate Insert, Update and Delete statements (Générer des instructions d'insertion, de mise à jour et de suppression), puis j'ai cliqué sur OK et Finish (Terminer). Après cela (toujours dans la vue du concepteur), j'ai sélectionné l'objet visuel TableAdapter qui m'a donné toutes les propriétés complètes. Le code SQL a été généré automatiquement. J'ai mis du temps à trouver la solution, j'espère que cela aidera quelqu'un.

0voto

Stefan27 Points 133

Grâce à "@Chris", le code ci-dessus fonctionne pour moi. J'avais besoin de spécifier le nom de la table de la base de données qui sera mise à jour lors de la mise à jour. Vous pouvez lire plus d'informations à ce sujet ici :

DataAdapter : Update unable to find TableMapping['Table'] or DataTable 'Table'

// This Adapter and Dataset are used for Populating my datagridview, 
// so I use them also when I need to Update the Datagridview

SqlDataAdapter kundeTlfAdapter;
DataSet kundeTlfDataSet; 

try
{
    SqlConnection connection = new SqlConnection("Data source=BG-1-PC\\SQLEXPRESS; Database = Advokathuset; User Id = abc; Password = abc;");
    SqlCommand cmd1 = new SqlCommand("Select* From Kunde_Tlf", connection);
    SqlCommandBuilder builder = new SqlCommandBuilder(kundeTlfAdapter);
    kundeTlfAdapter.SelectCommand = cmd1; // cmd1 is your SELECT command

    kundeTlfAdapter.Update(kundeTlfDataSet, "Kunde_Tlf"); //I get eror here if I dont add the name of the table that needs Update "Kunde_Tlf"
}
catch (Exception err)
{
    MessageBox.Show(err.Message.ToString());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X