Thomas Beckert hatte heute auf glengamoi.com das Problem, dass er bereits im Page_Load(ASP.NET) ein DataBind eines Repeaters durchführen musste.

Die Frage kam auf, ob dies dazu führt, dass die SQL-Abfrage evtl. mehrmals zum MSSQL geschickt wird.

Das wollte ich nun genau wissen.

In den Leistungstools des SQL-Servers gibt es den SQL Server Profiler mit dessen Hilfe man alle Aktivitäten und Abfragen auf dem SQLServer überwachen kann.

Die Antwort ist:

  • Beim einem Standard Aufruf macht dies keinen Unterschied. D.h. auch wenn im Page_Load ein Gridview1.DataBind() aufgerufen wird, wird nur eine Abfrage zum SQL-Server gesendet.
  • Die Abfrage wird unmittelbar vor dem Ereignis "GridView1.DataBinding"  zum SQL-Server geschickt.
  • Für jedes "Gridview.Databind" im Codenbehind gibt es auch eine Abfrage am SQL-Server.
  • Ist die Bindung bereits im Codebehind ausgeführt worden, gibt es keine "automatische Bindung" mehr.
  • Benutz man allerdings die "Edit" und "Cancel" Hyperlinks des Gridview gibt es zwei Abfragen am SQL-Server.
    Das Ereignis "Gridview.Databinding" tritt dann auch mehrmals auf, wenn ein Databind im Page_Load gesetzt wird.

Als Faustregel kann man sagen:
Wenn ein Ereignis Gridview.DataBinding eintritt, dann gibt es immer vorher eine DB-Abfrage.

Wenn nur im Page_Load ein Databind gemacht wird, dann gibt es auch nur eine DB-Abfrage. Ein Gridview welches bereits gebunden ist wird nicht ein zweites mal gebunden, außer im Codebehind wird ein weiteres Databind aufgerufen.

Hier die Ergebnisse im Einzelnen:

Normales Laden der Seite:  
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]
   
Klick auf den Edit Link:  
RPC:Completed exec sp_reset_connection 
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]
RPC:Completed exec sp_reset_connection 
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]
   
Aktualisieren den Datensatzes  
RPC:Completed exec sp_reset_connection 
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]
RPC:Completed exec sp_reset_connection 
RPC:Completed exec sp_executesql N'UPDATE [Table_1] SET [tesxttt] = @tesxttt WHERE [ID] = @original_ID AND [tesxttt] = @original_tesxttt',N'@tesxttt nvarchar(10),@original_ID int,@original_tesxttt nvarchar(10)',@tesxttt=N'22        ',@original_ID=32,@original_tesxttt=N'22        '
RPC:Completed exec sp_reset_connection 
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]
   
   
Klick auf Abbrechen im Edit-Mode
RPC:Completed exec sp_reset_connection 
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]
RPC:Completed exec sp_reset_connection 
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]
   
Löschen des Datensates  
RPC:Completed exec sp_reset_connection 
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]
RPC:Completed exec sp_reset_connection 
RPC:Completed exec sp_executesql N'DELETE FROM [Table_1] WHERE [ID] = @original_ID AND [tesxttt] = @original_tesxttt',N'@original_ID int,@original_tesxttt nvarchar(10)',@original_ID=32,@original_tesxttt=N'22        '
RPC:Completed exec sp_reset_connection 
SQL:BatchStarting SELECT * FROM [Table_1]
SQL:BatchCompleted SELECT * FROM [Table_1]