2009-06-19 10 views
0

Ich habe eine Gridview mit einem DataSourceID gesetzt, so dass die Datenbindung automatisch geschieht. Das Problem besteht darin, dass die in SqlDataSource definierte Prozedur manchmal sehr lange dauert, bis die Bindung einen Fehler mit abgelaufenem Zeitlimit aufweist.Catch Fehler in GridView automatische Datenbindung

Wie kann ich diesen Fehler abfangen, ohne die Gridview manuell zu binden und sie mit try/catch-Anweisungen zu umgeben?

Antwort

0

Warum nicht das Problem mit der Abfrage Timing-out stattdessen beheben? Optimieren Sie entweder den DB (bevorzugt) oder stellen Sie das Verbindungs-/Befehlstimeout höher als den aktuellen Wert ein.

Sie können die Timeout einstellen, wie durch Einhaken in die SqlDataSource Selecting event folgt:

protected void ds_Selecting(object sender, SqlDataSourceSelectingEventArgs e) 
    { 
     e.Command.CommandTimeout = 5000; 
    } 

Wenn Sie SQL Server verwenden Sie Tools wie der Indexoptimierungs-Assistent/tuning advisor, show query execution plan oder SQL Server Profiler aussehen möchten.

+0

Das Problem ist, dass wir mehrere Prozeduren haben, die auf dem Entwicklungsserver funktionieren, aber sehr lange dauern, um auf die Produktionsversion geladen zu werden (verschiedene SQL Server-Versionen). Also, bis wir alle identifizieren und beheben, möchten wir den Timeout-Fehler durch etwas benutzerfreundlicher ersetzen :) –

+0

In diesem Fall verwenden Sie DataSource und DataBind. – RichardOD

+0

Es gibt keine Möglichkeit, die durch Timeouts im Sql-DataSource-Steuerelement verursachten Ausnahmen abzufangen - daher wird die "Oldschool" -Methode von DataSource und DataBind in diesem Szenario besser funktionieren.Hier ist ein Codebeispiel: http://msdn.microsoft.com/en-us/library/fkx0cy6d.aspx – RichardOD

0

Wie wäre es mit der Bindung asynchron? Sobald sie abgeschlossen ist, kann die Callback-Funktion eine Datenindatei aufrufen, wenn keine Fehler zurückgegeben wurden.

EDIT: Ich denke, das ist manuell ... nicht das, was Sie wollten.

4

Wenn eine Ausnahme auftritt, wenn der SqlDataSource ausgeführt wird, es feuert seine entsprechende Post-Action-Ereignis - Ausgewählte, in diesem Fall. Sie können optional einen Ereignishandler für dieses Ereignis erstellen und im Ereignishandler angeben, dass Sie die Ausnahme behandelt haben.

Dieses Diagramm zeigt, wie diese Interaktion mit der ObjectDataSource funktioniert (das Konzept ist dasselbe wie mit dem SqlDataSource-Steuerelement). Wenn Sie das folgende Diagramm untersuchen, ersetzen Sie die Wörter "ObjectDataSource" durch "SqlDataSource" und "Underlying Object" durch "Database", damit es für die SqlDataSource relevant ist.

The datasource control raises events before and after its action.

Wie Sie sehen können, ist die Auswahl-Ereignis ausgelöst, bevor die Daten in die Datenbank und das ausgewählte Ereignis ausgelöst wird des Feldes verwiesen, nachdem die Daten zurückkommt (oder, wenn es eine Ausnahme).

Sie können einen Selected-Ereignishandler auf Ihrer Seite erstellen und prüfen, ob eine Ausnahmebedingung aufgetreten ist, und entscheiden, ob Sie sie selbst behandeln möchten. Fredrik Normen hat einen guten Blog-Eintrag dazu: Handle the data-source control exception by your own.

Zusätzliches Lesematerial: Accessing and Updating Data in ASP.NET: Examining the Data Source Control's Events.

Glückliche Programmierung!