2010-11-23 3 views
1

Je publie cette question après avoir lu d'autres questions similaires à propos de mon problème mais sans vraiment comprendre comment je peux utiliser l'information.Utilisation de SqlDataAdapter.Update et de RowUpdating pour mettre à jour une base de données à partir d'une grille

J'ai principalement écrit ce code pour voir comment je peux utiliser SqlDataAdapters pour mettre à jour une base de données à partir d'un GridView.

Je vous écris mon GridView dans ma page aspx comme suit:

<asp:GridView ID="Clients" runat="server"> 
    <Columns> 
     <asp:TemplateField HeaderText="Name" SortExpression="Name"> 
      <ItemTemplate> 
       <asp:Label ID="labelName" runat="server" Text='<%# Eval("Name") %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="textboxName" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField EditText="Edit" ShowEditButton="true" /> 
    </Columns> 
</asp:GridView> 

Puis dans mon code derrière le fichier que je vous écris le code suivant (base de données est juste une classe pour se connecter à ma base de données ...) :

Database database = new Database(); 
database.open_connection(); 

SqlCommand command = new SqlCommand(query, database.dbConnection); 
SqlDataAdapter adapter = new SqlDataAdapter(command); 

DataTable dataTable = new DataTable(); 
adapter.Fill(dataTable); 

SqlCommandBuilder builder = new SqlCommandBuilder(adapter); 

Clients.AutoGenerateColumns = false; 
Clients.PageIndexChanging += new GridViewPageEventHandler(this.grid_view_page_index_changing); 
Clients.Sorting += new GridViewSortEventHandler(this.grid_view_sorting); 
Clients.RowEditing += new GridViewEditEventHandler(this.row_editing); 
Clients.RowUpdating += new GridViewUpdateEventHandler(this.row_updating); 
Clients.RowCancelingEdit += new GridViewCancelEditEventHandler(this.row_canceling_edit); 
Clients.AllowPaging = true; 
Clients.PageSize = 25; 
Clients.AllowSorting = true; 
Clients.DataSource = dataTable; 
Clients.DataBind(); 

database.close_connection(); 

Tout cela fonctionne très bien jusqu'à présent; Les fonctions GridView Sorting, Editing, RowCancellingEdit, PageIndexChanging etc fonctionnent comme ils devraient le faire.

Mon problème est lorsque j'appelle la fonction RowUpdating.

Ce que je veux faire est d'utiliser la fonction adapter.Update() pour mettre à jour la base de données.

Il ne jette aucune erreur avec mon code actuel, mais il ne met pas à jour la base de données non plus.

Dès que je clique sur mettre à jour, la zone de texte d'édition de ma GridView disparaît et il me reste la valeur d'origine avant d'essayer de l'éditer.

Ceci est ma fonction row_updating():

public void row_updating(object sender, GridViewUpdateEventArgs e) { 
    GridViewRow gvr = gridView.Rows[Clients.EditIndex]; 

    TextBox txt = (TextBox)gvr.Cells[0].FindControl("textboxName"); 
    e.NewValues["Name"] = txt.Text; 

    adapter.Update((DataTable)Clients.DataSource); 

    Clients.EditIndex = -1; 
    Clients.DataBind(); 
} 

Je ne peux pas comprendre pourquoi il ne sera pas à jour la base de données (probablement parce que je fais complètement faux)

J'ai vu des choses autour l'Internet qui mentionne une fonction EndEdit(), mais je ne suis pas sûr si cela s'applique ici.

Si quelqu'un pouvait me dire ce que je fais de mal et pourquoi ma base de données ne serait pas mise à jour, ce serait très apprécié.

Répondre

0

J'ai changé row_updating() code des fonctions qui ne sont pas de beaucoup relevence, mais la chose qui fixe pour moi se assurait je! Page.IsPostBack

Alors maintenant mes fonctions Page_Load() met en place le GridView, puis au lieu de simplement lier les données qu'il va:

if(!Page.IsPostBack) { 
    Clients.DataBind(); 
} 

Bien qu'il ne fonctionne pas parfaitement, au moins il met actuellement à jour ma base de données (qui est ce que ce Qué stion était sur le point, donc je vais poster une nouvelle question si je ne peux pas trouver une solution à mon problème nouveau)

Parfois, il est juste les choses les plus simples qui causent les problèmes les plus frustrant ...

0

Avez-vous créé UpdateCommand pour votre adaptateur de données? Sinon, je pense que vous devrez peut-être le faire pour mettre à jour les données avec succès.

Vérifiez également ce lien MSDN:

Si INSERT, UPDATE ou DELETE déclarations n'ont pas été précisées, la méthode de mise à jour génère une exception . Cependant, vous pouvez créer un SqlCommandBuilder ou objet OleDbCommandBuilder à générer automatiquement des instructions SQL pour les mises à jour à table unique si vous définissez la propriété SelectCommand d'un .NET Framework fournisseur de données. Toutes les instructions SQL supplémentaires non définies sont ensuite générées par le CommandBuilder . Cette logique de génération nécessite que les informations de colonne de clé soient présentes dans le DataSet. Pour plus d'informations, voir Generating Commands avec CommandBuilders (ADO.NET).

La méthode Update récupère les lignes de la table répertoriée dans le premier mappage avant d'effectuer une mise à jour. La mise à jour actualise ensuite la ligne en utilisant la valeur de la propriété UpdatedRowSource . Les lignes supplémentaires renvoyées sont ignorées.

Après toutes les données est chargé de nouveau dans l'ensemble de données , l'événement est OnRowUpdated élevé, ce qui permet à l'utilisateur d'inspecter la ligne DataSet réconciliée et les paramètres de sortie renvoyé par la commande . Après une ligne met à jour avec succès, les modifications à cette ligne sont acceptées.

Lors de l'utilisation de mise à jour, l'ordre d'exécution est la suivante:

The values in the DataRow are moved to the parameter values. 

The OnRowUpdating event is raised. 

The command executes. 

If the command is set to FirstReturnedRecord, then the first 

résultat retourné est placé dans la DataRow.

If there are output parameters, they are placed in the DataRow. 

The OnRowUpdated event is raised. 

AcceptChanges is called. 
+0

J'ai essayé d'utiliser l'adaptateur .UpdateCommand = builder.GetUpdateCommand(); comme ils l'ont fait dans le lien, mais j'ai toujours les mêmes résultats. –

Questions connexes