Hallo zusammen,
ich hatte diese Frage vor kurzem schon einmal gestllt und es wurden mir auch einige Tips gegeben, aber trotzdem bekomme ich immer noch einen Abbruch mit "Das Ausführungstimeout ist abgelaufen...." (siehe Anhang). Wer kann mir hier hilfreiche Tips geben?
Hier der Code-Schnipsel
try
{
string connetionString = @"Data Source=DESKTOP-FU5A4SI\MSSQLSERVER01;Database=DWD;Trusted_Connection=True;Connection Timeout=50";
using (SqlConnection connection = new SqlConnection(connetionString))
using (SqlCommand cmd = new SqlCommand("select Mess_Datum_aufbereitet,Mess_Datum_Zeit,TT_10,TM5_10 FROM [DWD].[dbo].[Temperatur] order by Mess_Datum_aufbereitet desc,Mess_Datum_Zeit", connection))
{
if (connection.State != ConnectionState.Open)
connection.Open();
UpdateProgressBarMax(HolenAnzahlAllerDatensätze());
int lb = 0;
using (SqlDataReader reader = cmd.ExecuteReader()) ( <== hier kommt der Abruch){#ff0000}
{
try
{
while (reader.Read())
{
dataGridView1.Rows.Add(reader.GetValue(0).ToString().Trim(), reader.GetValue(1).ToString().Trim(), reader.GetValue(2).ToString().Trim(), reader.GetValue(3).ToString().Trim());
UpdateProgressBar(lb += 1);
}
}
catch (Exception e)
Wenn ich den SQL-Befehl auf dem SQL-Server laufen lasse da werden mir die ca. 80000 Datensätze innerhalb von ca. 2-3 Sekunden angezeigt.
Ich bin um jede Info Dankbar.
VG WInni
Code Tags hinzugefügt und in den richtigen Forenbereich verschoben.
Dein Vorgehen ist auch nicht die beste Idee. Willst Du wirklich 80.000 Einträge in Deiner UI haben? Wer soll das lesen?
Das kostet Zeit, Arbeitsspeicher - und der Nutzen ist nur semi. Dafür sind Standard UI Komponenten auch gar nicht ausgelegt; die ballern Dir den RAM voll.
Ja, der ExecuteReader ist langsam bei sehr vielen Datenmengen, denn auch er ist nicht darauf ausgelegt.
Du wirst einfach in dem Timeout laufen, weil das eben für den ExecuteReader so lange braucht.
Fazit: lade nicht so viel in eine UI, das ist weder sinnvoll noch jemals schnell - oder eben Timeout erhöhen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Außerdem führst du auch bei jeder Zeile mittels UpdateProgressBar
ein UI-Update durch - das auch Zeit kostet.
Wenn du dies außerdem auch noch im Main-/UI-Thread durchführst, blockierst du bei großen Datenmengen die UI: [FAQ] Warum blockiert mein GUI?
Desweiteren solltest du DataBinding benutzen, d.h. DataGridView.DataSource, und nicht einzeln die Zeilen per Rows.Add
hinzufügen.
Hi,
ich bin persönlich kein Freund davon soviel Daten auf einmal zu laden. Gleiches hat Abt ja auch schon geäußert.
Warum holst du dir nicht n-Datensätze (meinetwegen 100) und baust ein paginiertes DataGrid (10 Seiten á 10 Datensätze z.b.) und lädst dann den Rest nach Bedarf nach?
Das spart Ressourcen. Schau doch einfach mal, wie viele Datensätze auf deinem Bildschirm sichtbar sind, und richte es erstmal darauf aus.
Was der SQL Server kann muss noch lange keine UI Anwendung können 😃.
Hallo zusammen,
ich habe jetzt viele von euren Vorschläge benutzt aber trotzdem bekomme ich weiterhin den "Timeout". Ich habe sogar den SQLSERVER neu installiert(Entwickler-Version). Manchmal geht ein und dieselbe Abfrage super schnell dann kommt wieder der Timeout. Und wie schon zuvor berichtet habe ich nicht die riesigen Datenmengen, manchmal nur 50 Datensätze. Kann es was mit den Einstellungen am SQLServer zu tun haben der Firewall, Port etc.
Für hilfreiche Tips wäre ich super dankbar.
VG Winni
P.S.:Ich kenne mich mit dem SQLServer absolut nicht aus.
Hallo zusammen,
ich habe jetzt viele von euren Vorschläge benutzt aber trotzdem bekomme ich weiterhin den "Timeout". Ich habe sogar den SQLSERVER neu installiert(Entwickler-Version). Manchmal geht ein und dieselbe Abfrage super schnell dann kommt wieder der Timeout. Und wie schon zuvor berichtet habe ich nicht die riesigen Datenmengen, manchmal nur 50 Datensätze. Kann es was mit den Einstellungen am SQLServer zu tun haben der Firewall, Port etc.
Für hilfreiche Tips wäre ich super dankbar.
VG Winni
P.S.:Ich kenne mich mit dem SQLServer absolut nicht aus.
Bei einer select
-Abfrage kann es auch sein, daß der SQL Server einen "full table scan" durchführt (und dies kann bei großen Datenmengen entsprechend lange dauern), daher solltest du dann passende Indizes für die Tabelle(n) setzen.
Auch hier dazu, wie in deinem anderen Beitrag, die Empfehlung im SQL Management Studio den Ausführungsplan anzuschauen.
Und kommt der Timeout denn bei der von dir angegeben Zeit (Connection Timeout=50
) oder aber schon früher?
Edit: Laut How to increase the sqlconnection timeout using program file in .net core 7 heißt es aber Connect Timeout
!
Nach erreichen des eingestellten timeouts. Hatte zum Test auch schon mal 5000 angegeben, da Imam der timeout halt später.
Hat die Blume einen Knick, war der Schmetterling zu dick.
Neben dem Connect Timeout
für den Verbindungsaufbau gibt es noch den Command Timeout
für die Queries.
Hallo zusammen,
Vielen Dank an alle für ihre Hilfe, ABER ich habe jetzt wirklich alles ausprobiert, und es nichts hilft. einmal funktioniert der SQL-Befehl ohne Timeout, 1 min, später an der selben stelle mit den selben Daten kommt wieder der Timeout (siehe Anhang!
Und Manchmal wenn ich dann das Programm abbrechen und wieder aufrufe funktioniert es super schnell ohne Timeout!?!?!? Kann es was mit der Verbindung zum Server zu tun haben?
VG Winni