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