CSharp wpf Datenbankabruf optimieren
Hi,
ich habe einen SELECT welcher im SQL-Developer ~0,03 Sekunden braucht. <- es geht hier nicht um den Select an sich, sondern den Abruf bzw. das wie im Code...
wenn ich diesen mit dieser Methode aufrufe, brauche ich 1,5 Sekunden (was sich relativ lange anfühlt):
mit dieser brauche ich sogar 3,5 Sekunden (was untragbar lange ist):
=> was mach ich falsch? hat jemand eine Idee für mich?
Vielen Dank
ich habe einen SELECT welcher im SQL-Developer ~0,03 Sekunden braucht. <- es geht hier nicht um den Select an sich, sondern den Abruf bzw. das wie im Code...
wenn ich diesen mit dieser Methode aufrufe, brauche ich 1,5 Sekunden (was sich relativ lange anfühlt):
public static DataTable Sql2DataTable(string tns, string query)
{
DataTable result = new DataTable();
try
{
using (OracleConnection dbConnection = new OracleConnection(tns))
{
OracleCommand command = dbConnection.CreateCommand();
command.CommandText = query;
dbConnection.Open();
using (OracleDataReader reader = command.ExecuteReader())
{
bool head = true;
while(reader.Read())
{
string theRow = new string[reader.FieldCount];
for (int i = 0; i < reader.FieldCount; i++)
{
if(head)
{
result.Columns.Add(new DataColumn(reader.GetName(i), typeof(string)));
}
theRow[i] = reader.GetOracleValue(i).ToString();
}
head = false;
result.Rows.Add(theRow);
}
//result.Load(reader);
}
//MessageBox.Show("ready");
dbConnection.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(query + "\n" + ex.Message);
}
return result;
}
mit dieser brauche ich sogar 3,5 Sekunden (was untragbar lange ist):
public static DataTable Sql2DataTable2(string tns, string query)
{
DataTable result = new DataTable();
try
{
using (OracleConnection dbConnection = new OracleConnection(tns))
{
OracleCommand command = dbConnection.CreateCommand();
command.CommandText = query;
dbConnection.Open();
using (OracleDataReader reader = command.ExecuteReader())
{
result.BeginLoadData(); //keine auswirkung
result.Load(reader);
result.EndLoadData(); //useless
}
//MessageBox.Show("ready");
dbConnection.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(query + "\n" + ex.Message);
}
return result;
}
}
=> was mach ich falsch? hat jemand eine Idee für mich?
Vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 359926
Url: https://administrator.de/forum/csharp-wpf-datenbankabruf-optimieren-359926.html
Ausgedruckt am: 22.12.2024 um 23:12 Uhr
7 Kommentare
Neuester Kommentar
Nimm einen OracleDataAdapter() und die Fill-Methode damit entfällt das "langwierige" manuelle Füllen einer Datatable mit dem Reader:
https://stackoverflow.com/questions/42360121/fill-datatable-from-oracle- ...
Im DataSet hast du dann dein Ergebnis auch als DataTable.
Grüße Uwe
https://stackoverflow.com/questions/42360121/fill-datatable-from-oracle- ...
Im DataSet hast du dann dein Ergebnis auch als DataTable.
Grüße Uwe
Zitat von @it4baer:
es ist ein wenig schneller, aber so schnell wie im SQL-Developer ist es nicht annähernd...
Das ist ein "Brot- und Buttervergleich".es ist ein wenig schneller, aber so schnell wie im SQL-Developer ist es nicht annähernd...
Zitat von @it4baer:
Bitte um Erläuterung... was soll das heißen?
Ein SQL-Abruf ist "erstmal" ein SQL-Abruf. Wieso soll ich <Plattform A um an die Daten zu kommen> nicht mit <Plattform B um an die Daten zu kommen> vergleichen können?
Nun du schreibst hier überhaupt nichts über die Umgebung, ob die Connection im Developer Studio(welches das sein soll sagst du ebenfalls nicht, da gibts viele) beständig geöffnet ist (PIPE) , Datenbankzugriffstreiber, Netzwerkumgebung, Firewalls etc. pp.Das ist ein "Brot- und Buttervergleich".
Bitte um Erläuterung... was soll das heißen?
Ein SQL-Abruf ist "erstmal" ein SQL-Abruf. Wieso soll ich <Plattform A um an die Daten zu kommen> nicht mit <Plattform B um an die Daten zu kommen> vergleichen können?
Visual Studio bietet dir genügend Performance Debugging-Tools mit denen du die Lags schnell identifizierst bzw. die jeweilge verzögernde Routine ausfindig machst. Auch eine Anwendung muss erst mal seine Frameworks in den Speicher laden, Verbindung muss aufgebaut werden, Auth etc.
An bzw. ab "welcher Stelle" du misst ist hier auch nicht klar.