DataAdapter.Update () ne met pas à jour la base de données

je suis sûr qu'il y a une raison extrêmement simple que cette ligne ne fonctionne pas, mais elle a éludé la semaine dernière, donc j'espère que quelqu'un d'autre remarquera ma faute.

je travaille sur ce projet depuis plusieurs semaines à un mois. J'ai utilisé un mélange de vieux DataAdapter, CommandBuiler,etc. avec quelques codes linq à sql sur 1 Base de données, avec de multiples formulaires d'application windows. Ce formulaire particulier édite ou supprime des lignes de la base de données en utilisant un DataAdapter, un ensemble de données, et constructeur de commandes. Il a été fonctionne bien, jusqu'à ce que j'ai changé d'ordinateurs. Maintenant, l'ensemble de données est mis à jour, mais pas la base de données.

<!-Voici le code complet de ce formulaire:

private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("Exit Cook Book?", "Exit?", MessageBoxButtons.OKCancel) == DialogResult.OK)
    {
        Application.Exit();
    }
}

private void goBackToolStripMenuItem_Click(object sender, EventArgs e)
{
    AddRecipe goBack = new AddRecipe();

    Close();
    goBack.Show();
}

private void helpToolStripMenuItem_Click(object sender, EventArgs e)
{
    MessageBox.Show("Scan through the Cook Book to find recipes that you wish to edit or delete.", "Help!");
}

SqlConnection con;
SqlDataAdapter dataAdapt;
DataSet dataRecipe;
SqlCommandBuilder cb;

int MaxRows = 0;
int inc = 0;


private void EditRecipe_Load(object sender, EventArgs e)
{
    con = new SqlConnection();
    dataRecipe = new DataSet();

    con.ConnectionString = "Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|Recipes.mdf;Integrated Security=True;User Instance=True";

        con.Open();

        //MessageBox.Show("Database Open");

        string sql = "SELECT* From CookBookRecipes";
        dataAdapt = new SqlDataAdapter(sql, con);

        dataAdapt.Fill(dataRecipe, "CookBookRecipes");
        NavigateRecords();
        MaxRows = dataRecipe.Tables["CookBookRecipes"].Rows.Count;

        con.Close();
}


private void NavigateRecords()
{
    DataRow dRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc];

    tbRName.Text = dRow.ItemArray.GetValue(0).ToString();
    listBox1.SelectedItem = dRow.ItemArray.GetValue(1).ToString();
    tbRCreate.Text = dRow.ItemArray.GetValue(2).ToString();
    tbRIngredient.Text = dRow.ItemArray.GetValue(3).ToString();
    tbRPrep.Text = dRow.ItemArray.GetValue(4).ToString();
    tbRCook.Text = dRow.ItemArray.GetValue(5).ToString();
    tbRDirections.Text = dRow.ItemArray.GetValue(6).ToString();
    tbRYield.Text = dRow.ItemArray.GetValue(7).ToString();
    textBox1.Text = dRow.ItemArray.GetValue(8).ToString();
}

private void btnNext_Click(object sender, EventArgs e)
{
    if (inc != MaxRows - 1)
    {
        inc++;
        NavigateRecords();
    }
    else
    {
        MessageBox.Show("That's the last recipe of your Cook Book!", "End");
    }
}

private void btnBack_Click(object sender, EventArgs e)
{
    if (inc > 0)
    {
        inc--;
        NavigateRecords();
    }
    else
    {
        MessageBox.Show("This is the first recipe of your Cook Book!", "Start");
    }
}

private void btnSave_Click(object sender, EventArgs e)
{
    cb = new SqlCommandBuilder(dataAdapt);

    DataRow daRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc];

    daRow[0] = tbRName.Text;
    daRow[1] = listBox1.SelectedItem.ToString();
    daRow[2] = tbRCreate.Text;
    daRow[3] = tbRIngredient.Text;
    daRow[4] = tbRPrep.Text;
    daRow[5] = tbRCook.Text;
    daRow[6] = tbRDirections.Text;
    daRow[7] = tbRYield.Text;
    daRow[8] = textBox1.Text;

    if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK)
    {

        dataAdapt.Update(dataRecipe, "CookBookRecipes");

        MessageBox.Show("Recipe Updated", "Update");
    }
}

private void btnDelete_Click(object sender, EventArgs e)
{
    SqlCommandBuilder cb;
    cb = new SqlCommandBuilder(dataAdapt);

    if (MessageBox.Show("You wish to DELETE this recipe?", "Delete?", MessageBoxButtons.OKCancel) == DialogResult.OK)
    {
        dataRecipe.Tables["CookBookRecipes"].Rows[inc].Delete();
        MaxRows--;
        inc = 0;
        NavigateRecords();

        dataAdapt.Update(dataRecipe, "CookBookRecipes");

        MessageBox.Show("Your Recipe has been Deleted", "Delete");
    }
}

C'est censé mettre à jour la table:

dataAdapt.Update(dataRecipe, "CookBookRecipes");

Je ne reçois pas d'erreurs, mais la table de données ne sera pas mise à jour.

Merci d'avance pour votre aide, et laissez-moi savoir si vous avez besoin de plus d'informations.

10
demandé sur Nikolay Kostov 2011-07-26 20:21:27

8 réponses

afin de mettre à jour les données sur la base de données, votre SqlDataAdapter doit avoir ses propriétés InsertCommand, UpdateCommand, DeleteCommand définies. L'instance SqlCommandBuilder que vous avez créée possède ces commandes, mais vous devez les définir à votre SqlDataAdapter.

dans d'autres mondes: quelque part entre

 SqlCommandBuilder cb;
 cb = new SqlCommandBuilder(dataAdapt);

et

 dataAdapt.Update(dataRecipe, "CookBookRecipes");

vous devez

dataAdapt.DeleteCommand = cb.GetDeleteCommand(true);
dataAdapt.UpdateCommand = cb.GetUpdateCommand(true);
dataAdapt.InsertCommand = cb.GetInsertCommand(true);
11
répondu Daniel Zazula 2012-10-16 12:56:13

Que les SqlCommand pour la mise à Jour? Je vois la commande mais je ne vois pas de SqlText, c'est ce que vous manquez.

Vous devez définir ce que .Update fait par le paramètre .UpdateCommand propriété sur l' SqlDataAdapter

ce lien donne une assez bonne répartition sur la façon de procéder: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.updatecommand.aspx

2
répondu Tom Studee 2011-07-26 17:43:50

Vous pourriez avoir besoin

DataAdapeter.AcceptChanges()
0
répondu user2418654 2013-05-24 18:57:19

j'ai eu le même problème: J'ai rempli un nouvel ensemble de données avec de nouvelles lignes, mais rien ne s'est passé lors de la mise à jour. J'ai utilisé le MySqlDataAdapter qui fonctionne similaire.

il s'avère que lorsque vous avez besoin de la commande INSERT de MySqlCommandBuilder vous devez spécifier le rowstate comme ajouté. Voir aussi: MSDN

0
répondu Cerveser 2013-06-21 19:07:52
//change this line

DataRow daRow = dataRecipe.Tables["CookBookRecipes"].NewRow();

daRow[0] = tbRName.Text;
daRow[1] = listBox1.SelectedItem.ToString();
daRow[2] = tbRCreate.Text;
daRow[3] = tbRIngredient.Text;
daRow[4] = tbRPrep.Text;
daRow[5] = tbRCook.Text;
daRow[6] = tbRDirections.Text;
daRow[7] = tbRYield.Text;
daRow[8] = textBox1.Text;

if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
//add & change this too
dataRecipe.Tables["CookBookRecipes"].Rows.Add(daRow);
    dataAdapt.Update(dataRecipe, "CookBookRecipes");

    MessageBox.Show("Recipe Updated", "Update");
}

}

0
répondu Muniba 2015-02-18 16:47:09

Essayez la source ci-dessous.

private void btnSave_Click(object sender, EventArgs e)
{
    cb = new SqlCommandBuilder(dataAdapt);

    //Old source: DataRow daRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc];

    //Added source code
    DataRow daRow = dataRecipe.Tables["CookBookRecipes"].NewRow();

    //Added source code
    dataRecipe.Tables["CookBookRecipes"].AddRow(daRow);

    daRow.BeginEdit();
    daRow[0] = tbRName.Text;
    daRow[1] = listBox1.SelectedItem.ToString();
    daRow[2] = tbRCreate.Text;
    daRow[3] = tbRIngredient.Text;
    daRow[4] = tbRPrep.Text;
    daRow[5] = tbRCook.Text;
    daRow[6] = tbRDirections.Text;
    daRow[7] = tbRYield.Text;
    daRow[8] = textBox1.Text;
    daRow.EndEdit();

    //Reset state of rows to unchanged
    dataRecipe.Tables["CookBookRecipes"].AcceptChanges();
    //Set modified. The dataAdapt will call update stored procedured 
    //for the row that has Modifed row state. 
    //You can also try SetAdded() method for new row you want to insert
    daRow.SetModified();

    if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK)
    {

        dataAdapt.Update(dataRecipe, "CookBookRecipes");

        MessageBox.Show("Recipe Updated", "Update");
    }
}
0
répondu culithay 2016-09-01 18:46:09

ajouter AcceptChangesDuringUpdate avant que la mise à jour ne fonctionne pour moi, exemple:

foreach (string tableName in tableNames)
        {             
            da = new SqlDataAdapter("SELECT * FROM " + tableName, cn);
            cb = new SqlCommandBuilder(da); //initialise the update, insert and delete commands of da
            da.AcceptChangesDuringUpdate = true;
            da.Update(myDataSet, tableName);               
        }
0
répondu dams 2017-02-02 12:36:51

j'ai rencontré le même problème. Mon dataadapter.remplir fonctionne mais dataaadapter.la mise à jour ne fonctionne pas. J'ai réalisé que le problème était que ma table de base de données ne contient pas de clé primaire. Après avoir modifié ma table pour inclure une colonne avec la clé primaire, dataadapter.des travaux de remblai. Espérons que cela aide quelqu'un.

0
répondu Jess 2017-12-15 08:39:40