none
Problem beim Zugriff auf SQL Server RRS feed

  • Frage

  • Hallo @all,
     
    wir greifen aus c# per ADO.NET auf einen SQL Server 2008 R2 (10.50.4000) zu.
     
    Dabei haben wir sporadisch folgende Probleme
    1. Bei einem Insert kommen nicht alle Daten in der Datenbank an, es stehen null Werte in diesen Spalten
    2. Bei Selects kommt es zu Fehlern spalte xyz ist nicht in der Tabelle enthalten, obwohl diese Spalte eindeutig enthalten ist
     
    Wir sind zu Zeit mit unserem Latein am Ende. Gerade der 1. Fehler treibt uns zum Wahn...
    Wir sind sogar schon so weit gegangen, dass nach dem Insert geprüft wird ob die Daten auch in der Tabelle stehen, da scheint alles ok zu sein (für den c# code) aber die Daten stehen nicht in der DB.
     
    Das Problem tritt nicht immer auf, wir vermuten dass es was mit der Auslastung des SQL Servers zu tun hat.
     
    Wenn der Server einen Fehler werfen würde, dann würde ich das ja verstehen, aber wir bekommen keinen Fehler zurück, die Daten passen aber nicht.
     
    hat jemand eine Idee wo wir ansetzen könnten?
     
    Grüße
    Jörg
     

    Jörg Schneider
    Dienstag, 15. Dezember 2015 08:59

Alle Antworten

  • Hallo Jörg,

    zuerst würde ich mal das SP 3 für SQL Server 2008 R2 installieren, damit man sicherstellen kann, dass es nicht am SQL Server selbst liegt.

    Dein Problem hört sich ähnlich an wie eines, dass ich mal vor vielen vielen Jahren hatte. Daher die Frage:

    Verwendest Du irgendwo statische Klassen, Eigenschaften und/oder Methoden für deine Datenbankzugriffe? Falls ja, welche Art von Anwendung erstellst Du? ASP.NET? Falls nicht, wird die Anwendung mit mehreren Instanzen gestartet bzw. von mehreren anderen Anwendungen aus angesprochen? (Bspw. wenn deine Anwendung Client/Server basiert ist)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 15. Dezember 2015 12:16
    Moderator
  • Hallo Stefan,
     
    Nein wir nutzen keine Statischen Klassen. Sind alles Instantiierte Klassen, die aber teilweise die komplette Anwendungslaufzeit über leben. Die Connections werden allerdings vor dem Gebrauch aufgebaut und danach wieder weggeworfen (disposed).
    Wir haben einen Windows-Service mit c#. Der wird nicht von außen angesprochen sondern liest die Daten aus der Datenbank und schaufelt die auf den Exchange-Server und umgekehrt. Aber alles ohne externe Einflüsse.
    Der Dienst in sich arbeitet aber Asynchron. Greift also aus mehreren Threads auf die Datenbank zu. Jeweils aber wiederum über eine eigene Connection.
     Am 15.12.2015 um 13:16 schrieb Stefan Falz [MVP]:
    > Hallo Jörg,
    >
    > zuerst würde ich mal das SP 3 für SQL Server 2008 R2 installieren, damit man sicherstellen kann, dass es nicht am SQL Server selbst liegt.
    >
    > Dein Problem hört sich ähnlich an wie eines, dass ich mal vor vielen vielen Jahren hatte. Daher die Frage:
    >
    > Verwendest Du irgendwo statische Klassen, Eigenschaften und/oder Methoden für deine Datenbankzugriffe? Falls ja, welche Art von Anwendung erstellst Du? ASP.NET? Falls nicht, wird die Anwendung mit mehreren Instanzen gestartet bzw. von mehreren anderen Anwendungen aus angesprochen? (Bspw. wenn deine Anwendung Client/Server basiert ist)
    >
     
     
    Mittwoch, 16. Dezember 2015 07:43
  • Hallo Jörg,

    ich gehe stark davon aus, dass das Problem dennoch genau das ist, dass ich vermute.

    Durch die verschiedenen Threads schmeißt ihr an irgendeiner Stelle bspw. die SqlCommand Objekte durcheinander. Für dich ist das nicht ersichtlich aber eine Meldung, dass eine Spalte XY nicht existiert, obwohl Du 100%ig sicher bist, dass Tabelle A diese Spalte(n) enthält, kann eigentlich nichts anderes sein.

    Das Problem an sich ist wahrscheinlich, dass irgendwo doch eine statische Eigenschaft oder Methode verwendet wird oder doch eben nicht alle Objekte korrekt für diesen einen Aufruf instanziert wurden. Das Problem dabei ist dann bspw. dass Thread 1 über ein SqlCommand Objekt mit "SELECT SpalteA FROM TabelleA" Daten aus TabelleA auslesen will, zeitgleich Thread 2 mit "SELECT SpalteB FROM TabelleB" eben Daten aus TabelleB.

    Und wenn nun das SqlCommand für A gerade abgearbeitet wird und innerhalb dieser Zeit das SqlCommand Objekt für den Abruf B geändert wird, kommt es genau zu dem von dir festgestellten Effekt.

    Poste doch mal den relevanten Code, dann kann man sich das besser anschauen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 16. Dezember 2015 09:55
    Moderator
  • Hallo Stefan,
     
    das mit dem relevanten Code ist nicht so einfach.
    Das wäre ne komplette Solution mit nem Dutzend Klassen und Codezeilen.
    Das command-objekt ist auch nochmal gewrappt, und es sind generell viele Sonderlocken drin.
    (Wir können zwischen zwei DB Systemen (SQL Server und DBF Files) umschalten...)
     
    Wir vermuten das das Problem eher am Backend liegt?!
    Wir haben mehrere Kunden bei denen das Problem nicht auftritt, deshalb gehen wir von einem Konfigurationsproblem aus.
    Was meinst Du dazu?
     
    Grüße
    Jörg Schneider
     Am 16.12.2015 um 10:55 schrieb Stefan Falz [MVP]:
    > Hallo Jörg,
    >
    > ich gehe stark davon aus, dass das Problem dennoch genau das ist, dass ich vermute.
    >
    > Durch die verschiedenen Threads schmeißt ihr an irgendeiner Stelle bspw. die SqlCommand Objekte durcheinander. Für dich ist das nicht ersichtlich aber eine Meldung, dass eine Spalte XY nicht existiert, obwohl Du 100%ig sicher bist, dass Tabelle A diese Spalte(n) enthält, kann eigentlich nichts anderes sein.
    >
    > Das Problem an sich ist wahrscheinlich, dass irgendwo doch eine statische Eigenschaft oder Methode verwendet wird oder doch eben nicht alle Objekte korrekt für diesen einen Aufruf instanziert wurden. Das Problem dabei ist dann bspw. dass Thread 1 über ein SqlCommand Objekt mit "SELECT SpalteA FROM TabelleA" Daten aus TabelleA auslesen will, zeitgleich Thread 2 mit "SELECT SpalteB FROM TabelleB" eben Daten aus TabelleB.
    >
    > Und wenn nun das SqlCommand für A gerade abgearbeitet wird und innerhalb dieser Zeit das SqlCommand Objekt für den Abruf B geändert wird, kommt es genau zu dem von dir festgestellten Effekt.
    >
    > Poste doch mal den relevanten Code, dann kann man sich das besser anschauen.
    >
    > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    >
    > Gruß, Stefan
    > Microsoft MVP - Visual Developer ASP/ASP.NET
    > http://www.asp-solutions.de/ - Consulting, Development
    > http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    >
    > -----
    > -----
    >
     
     
    Dienstag, 29. Dezember 2015 09:43