2010-11-23 7 views
1

Ich poste diese Frage, nachdem ich andere ähnliche Fragen über mein Problem gelesen habe, aber nicht wirklich verstehe, wie ich die Informationen verwenden kann.Verwenden von SqlDataAdapter.Update und RowUpdating zum Aktualisieren einer Datenbank aus einer Gridview

Ich habe hauptsächlich diesen Code geschrieben, um zu sehen, wie ich SqlDataAdapter verwenden kann, um eine Datenbank von einem GridView zu aktualisieren.

Ich schreibe meine Gridview in meiner aspx Seite wie folgt:

<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> 

Dann in meinem Code hinter Datei Ich schreibe den folgenden Code (Datenbank ist nur eine Klasse zu meiner Datenbank zu verbinden ...) :

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(); 

Das alles funktioniert soweit; Die GridView-Sortier-, Editier-, RowCancellingEdit-, PageIndexChanging-Funktionen usw. funktionieren wie sie sollten.

Mein Problem ist, wenn ich die RowUpdating-Funktion aufrufen.

Was ich tun möchte, ist die adapter.Update() Funktion, um die Datenbank zu aktualisieren.

Es wirft keine Fehler mit meinem aktuellen Code, aber es aktualisiert auch nicht die Datenbank.

Sobald ich auf update klicke, verschwindet das Bearbeitungsfeld aus meiner GridView und ich habe den ursprünglichen Wert, bevor ich versuche, es zu bearbeiten.

Dies ist meine row_updating() Funktion:

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(); 
} 

ich kann nicht herausfinden, warum es nicht die Datenbank aktualisieren (wahrscheinlich, weil ich es völlig falsch tue)

ich Sachen gesehen haben, um das Internet, das eine EndEdit() Funktion erwähnt, aber ich bin mir nicht sicher, ob das hier gilt.

Wenn mir jemand sagen könnte, was ich falsch mache und warum meine Datenbank es nicht aktualisiert, wäre es sehr zu schätzen.

Antwort

0

ich meine row_updating() Funktionen Code geändert, die hier nicht viel relevence ist, aber die Sache, die es für mich fixiert war dafür, dass ich verwendet! Page.IsPostBack

So jetzt meine Page_Load() Funktionen Gridview einrichtet und dann, statt nur die Datenbindung geht es:

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

Obwohl es nicht perfekt funktioniert, zumindest ist es jetzt meine Datenbank zu aktualisieren (was diese que ist, was lierte wollte, also werde ich eine neue Fragen stellen, wenn ich nicht eine Lösung für mein neues Problem finden)

Manchmal nur, dass es die einfachsten Dinge, die die meisten frustrierend Probleme verursachen ...

0

Haben Sie den UpdateCommand für Ihren Datenadapter erstellt? Wenn nicht, dann denke ich, dass Sie es möglicherweise tun müssen, um die Daten erfolgreich zu aktualisieren.

Auch diese MSDN Verbindung überprüfen:

Wenn INSERT, UPDATE oder DELETE-Anweisungen haben nicht angegeben, die Update-Methode erzeugt eine Ausnahme. Sie können jedoch einen SqlCommandBuilder oder OleDbCommandBuilder Objekt automatisch SQL-Anweisungen für Single-Table Updates generieren erstellen, wenn Sie die Select Eigenschaft eines .NET Framework-Daten Anbieter festgelegt. Dann werden alle zusätzlichen SQL-Anweisungen, die Sie nicht festgelegt haben, von dem CommandBuilder generiert. Diese Generierungslogik erfordert, dass die Schlüsselspalteninformationen im DataSet vorhanden sind. Weitere Informationen finden Sie unter Generieren von Befehlen mit CommandBuilders (ADO.NET) .

Die Update-Methode ruft Zeilen aus der Tabelle ab, die in der ersten Zuordnung aufgeführt ist, bevor eine Aktualisierung durchgeführt wird. Das Update aktualisiert dann die Zeile unter Verwendung von den Wert der Eigenschaft UpdatedRowSource . Alle zusätzlichen zurückgegebenen Zeilen werden ignoriert.

Nachdem alle Daten zurück in den Datensatz geladen werden, das Ereignis wird OnRowUpdated angehoben, so dass der Benutzer der abgeglichenen DataSet Zeilen und alle Ausgangsparameter durch den Befehl zurückgegeben inspizieren. Nachdem eine Zeile erfolgreich aktualisiert wurde, werden die Änderungen an dieser Zeile akzeptiert.

Wenn Update verwendet wird, ist die Reihenfolge der Ausführung wie folgt:

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 

zurückgegebene Ergebnis in dem DataRow platziert wird.

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

The OnRowUpdated event is raised. 

AcceptChanges is called. 
+0

Ich habe versucht, Adapter .UpdateCommand = builder.GetUpdateCommand(); wie in der Verbindung, aber ich bekomme immer noch die gleichen Ergebnisse. –

Verwandte Themen