Laden...

Timeout beim SQL-Serverzugriff

Letzter Beitrag vor 2 Monaten 17 Posts 532 Views
Timeout beim SQL-Serverzugriff

Hallo, ich versuche mit c# eine Tabelle im SQL-Server zu befüllen, nur bekomme ich sehr oft den Fehler das ein TIMEOUT vorliegt. es ahndelt sich hier nur um ca 50 Datensätze die jeweils einfügen möchte.

Könnt ihr mir ein paar Ratschläge geben was ich anpassen muss.

Vielen

b Dank

Auch hallo,

passt der ConnectionString: https://www.connectionstrings.com/sql-server/ ?

Lokaler oder entfernter SQL Server ?

Kann man via SQL Server Management Änderungen an den Daten  vornehmen ?

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

Was sind das für Datensätze?
Default Timeout ist 100 Sek.
Was genau passiert da beim einfügen, dass du mehr als 100 Sek. brauchst?

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Hallo,

ich benutze folgenden Connectionstring:

Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;

Es ist ein lokaler Server, und auch wenn ich die Daten direkt auf dem server ändere, kommt manchmal diese Meldung, obwohlö es sich nicht viele Daten handelt (max 500 Datensätzen). und es sind simple insert oder delete-Abfragen!

Nimm halt mal weniger Datensätze und schau Dir den Execution Plan an, was lange dauert.

Ohne Glaskugel können wir leider auch nur raten.


Geraten wäre genauso: Dein SQL Server hat halt keine Leistung. Deine SQL-Commands sind (zu) komplex.
"Normal" wäre es, dass ein SQL Server sowas binnen Millisekunden abarbeitet. Aber Du stellst potentiellen Helfern hier quasi auch 0 Infos zur Verfügung.

Hallo,

hier der Schnippsel zum einfügen der Daten aus c':

 string sql = "Insert into Temperatur (Id, STATIONS_ID, MESS_DATUM, MESS_DATUM_aufbereitet, MESS_DATUM_Time,QN, PP_10, TT_10,TM5_10, RF_10,TD_10, ErrorCode) values (" + xId + ", " + xSTATIONS_ID + ",'" + xMESS_DATUM + "', '" + xMESS_DATUM_aufbereitet + "', '" + xMESS_DATUM_Time + "'," + xQN + "," + xPP_10 + "," + xTT_10 + "," + xTM5_10 + "," + xRF_10 + "," + xTD_10 + ",'" + xErrorCode + "')";
string connetionString;
SqlConnection cnn = new SqlConnection();
connetionString = @"Data Source=DESKTOP-FU5A4SI\SQLEXPRESS;Database=DWD;Trusted_Connection=True";
try
{
    cnn = new SqlConnection(connetionString);
   
    cnn.Open();
    SqlCommand command;
    SqlDataAdapter adapter = new SqlDataAdapter();
    command = new SqlCommand(sql, cnn);
    adapter.InsertCommand = new SqlCommand(sql, cnn);
    adapter.InsertCommand.ExecuteNonQuery();
    command.Dispose();
    cnn.Close();
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString(), "Fehler bei Insert Temperatur");
}

Welche Infos würden noch fehlen?

VG

Wir haben hier Code Tags - niemand will Plaintext lesen. Darfst sie das nächste Mal ruhig selbst setzen; hab Dein Beitrag editiert.


Du machst mit dem SQL Code eigentlich alles falsch, was man falsch machen kann:

  • [Artikelserie] SQL: Parameter von Befehlen
  • Man erstellt nicht pro Command eine Verbindung, sondern man verwendet eine Verbindung wieder. Ansonsten hast dauernd einen Connection auf- und abbau: macht alles langsamer.
  • Du sprichst von 50 Datensätze - wo ist das? Hier würde ja ein einzelner Insert dann 90 Sekunden dauern - da stimmt was an Deinem SQL Server dann nicht
  • Dein SQL Code zeigt nun eine einzelnen Insert. SQL Insert kann alles in einem Rutsch absenden. How to Insert Multiple Rows in SQL

Mir ist ein Rätsel warum Du das hier machst:

SqlCommand command;
    SqlDataAdapter adapter = new SqlDataAdapter();
    command = new SqlCommand(sql, cnn);
    adapter.InsertCommand = new SqlCommand(sql, cnn);
    adapter.InsertCommand.ExecuteNonQuery();
    command.Dispose();

Wozu der Adapter? Du hast doch har kein DataSet irgendwo...? Das sieht aus als ob Du das wild irgendwo her kopiert hast, aber nich wirklich versteht, was es macht.

Du brauchst für Deine simple Anforderungen quasi die Hälfte an Code - und kannst sie fast 1:1 aus der Doku kopieren.

Hallo,

Vielen Dank für Deine ehrliche Antwort. Ich muss gestehen das ich das wirklich alles wild zusammen kopiert habe. hat ja funktioniert (-:

Habe alles noch einmal überarbeitet und jetzt läuft es auch schneller.

Nochmals vielen Dank für Deine Mühe

VG Winni

Kein Problem, gerne.

hat ja funktioniert

Man sollte schon wissen, wann welches Werkzeug effektiv Sinn macht. Ein Bspl. für ein korrektes SQL-Skript, welches aber auf eine ungünstige Bedingung trifft: Tweet von Paul Runco

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

Ebenfalls sollte man bei größeren Datenmengen, die man importieren will, mit Bulk Insert arbeiten.
Wird für den Sql Server mit der SqlBulkCopy Klasse gelöst.

Doku:
https://learn.microsoft.com/de-de/dotnet/api/system.data.sqlclient.sqlbulkcopy?view=netframework-4.8.1

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Er hat 50 Datensätze... da ist 1 Command schneller als Bulk.

Zudem ist System.Data.SqlClient veraltet. Man sollte allein aus Sicherheitsgründen ausschließlich Microsoft.Data.SqlClient verwenden.

The current data provider for SQL Server and Azure SQL databases. This has replaced System.Data.SqlClient. These classes provide access to SQL and encapsulate database-specific protocols, including tabular data stream (TDS).

@Abt
Laut Doku hat auch Microsoft.Data.SqlClient ein SqlBulkCopy.

Doku:
https://learn.microsoft.com/en-us/dotnet/api/microsoft.data.sqlclient.sqlbulkcopy?view=sqlclient-dotnet-standard-5.2

Bei 50 Einträgen kann man auch auf normale Inserts setzen.

Wenn es halt nur einiges mehr werden sollte, dann wäre das eben die bessere Option.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Hallo zusammen,.

ich habe versuch mal alle eure Vorschläge umzusetzen, aber den Timeout bekomme ich immer noch. Nicht immer!!! Auf dem Sqlserver bekomme ich ihn auch manchmal. Wie vorher schon berichtet befinden sich keine rauhen Mengen in der einzigen Tabelle in der DB. Kann das was mit der Einrichtung des sqlServers zu tun habe? Ich habe den SQLSErver standardmäßig installiert.

Noch eine Frage zu:

Zudem ist System.Data.SqlClient veraltet. Man sollte allein aus Sicherheitsgründen ausschließlich Microsoft.Data.SqlClient verwenden.

Wenn ich das benutze fliegt mir der connectionstring um die Ohren. Muss ich wenn Microsoft.Data.SqlClient verwende muss ich da noch was anpassen?

VG Winni

Kommt der Timeout immer bei einer bestimmten Abfrage oder bei verschiedenen?
Und hast du dir schon im SQL Management Studio den Ausführungsplan dazu, wie von Abt schon vorgeschlagen, angeschaut?

PS: Habe mir gerade deinen Sourcecode angeschaut - du solltest dringend [Artikelserie] SQL: Parameter von Befehlen verwenden.

Hi, nein das habe ich noch nicht gemacht. Ich wüsste auch nicht wo/wie ich das machen kann. Kannst Du mir da Helfen?

Und zu der anderen Frage: Nein, der Timeout kommt bei verschiedenen Abfragen.

Abt hat dir doch, wenn auch auf den englischen Artikel, den Link dazu gegeben.

Hier noch mal der deutsche: Übersicht über den Ausführungsplan
Und in dem dort verlinkten Anzeigen eines tatsächlichen Ausführungsplans findest du das genaue Vorgehen dazu.

Und eine genauere Erklärung dazu für ein Insert-Kommando gibt es in dem (englischen) Artikel Understanding Execution Plans of the SQL Server Insert statement.

PS: Hast du auch mein "PS" im letzten Beitrag gelesen (den ich noch nach-editiert hatte)?

PPS: Bin mit deinen 2 Beiträgen durcheinander gekommen, da ich beide bei mir als Tabs geöffnet hatte und dann in diesem statt in dem anderen gepostet habe.