2009-06-10 22 views
0

Ich habe eine C++ - Anwendung (kompiliert mit VS2003 läuft auf Windows 2000 Server gegen SQL 2000-Datenbank), die seit Jahren gut lief und jetzt abstürzt.Ausnahmeproblem mit ODBC und C++ verursacht bizarre Datenbankverhalten

Meine Protokollierung zeigt, dass die Datenbankverbindung (ODBC mit dem SQL Server-Treiber) gut funktioniert (Datenbank lesen und aktualisieren). Wenn eine Ausnahme ausgelöst wird (und abgefangen/protokolliert wird, aber kein Detail), kann die Verbindung Daten lesen aus der Datenbank, kann aber die Datenbank nicht mehr aktualisieren.

So sehe ich ein Thread liest die nächste Zeile zu verarbeiten, Senden von Daten aus einem Socket an einen anderen Server, versucht, den Datensatz als verarbeitet und BOOM zu aktualisieren.

Die einzige Fehler Informationen, die ich zurück von der ausgefallenen Abfrage erhalten sind:

[Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. [37000] 

gefolgt von einem Leerzeichen wie in denen Sie normalerweise den Grund die Abfrage fehlgeschlagen (schlechte Syntax, siehe Tabelle nicht gefunden, was auch immer, aber diesmal nichts).

Dieser Code verarbeitet Zehntausende von Aufzeichnungen, kann für Monate laufen und kurz nach diesem Thread (scheint immer das erste Opfer zu sein, kann nur der beschäftigt sein und wird zuerst erwischt) beginnt zu ersticken alle anderen Verbindungen scheinen zu haben Das gleiche Problem - Lesen ist erlaubt, aber Updates werfen diese Ausnahme.

Ich habe mir den Task-Manager das letzte Mal angeschaut (er wird schnell zurückgeworfen, so dass ich nicht lange nachsehen kann) und die App verwendete die üblichen 5 bis 6 Megabyte RAM und die anderen Ressourcen sahen normal aus.

Andere Anwendungen verwenden die Datenbank und haben während dieser Zeit keine Fehler.

ich etwas nicht online finden können, wo Sie diese gemeldeten Fehler Ergebnis erhalten, wenn die Abfrage gültig ist ...

HELP!

Antwort

0

Von dem Fehler, "[Microsoft] [ODBC SQL Server-Treiber] [SQL Server] Statement (s) konnte nicht vorbereitet werden. [37000]" Ich nehme an, der ODBC-Treiber versucht, eine Anweisung vorzubereiten. Dies hat uns viele erratische Probleme verursacht.

Deaktivieren Sie in der Definition der ODBC-Datenquelle die Option "Temporär gespeicherte Prozeduren für vorbereitete SQL erstellen ..." und prüfen Sie, ob dadurch der Fehler behoben wird.

0

Gibt es eine Chance, dass die Update-Anweisung Daten schreibt, die für das Feld zu groß oder null sind, wenn Nullwerte nicht zulässig sind?

Vielleicht könnten Sie die Aktualisierungen in einer Datei protokollieren, um festzustellen, ob das Problem datengesteuert ist.

Ich bin mir nicht sicher, ob der ODBC-Treiber von SQL Server ADO verwendet, aber ich denke, ADO hat ein Leck in seinem Update und fügt Code ein, der nach und nach all Ihren Speicher verbraucht. Wenn Sie den Absturz nach ungefähr der gleichen Anzahl von Datensätzen erhalten, sollten Sie dies untersuchen.