Problem mit Veröffentlichung einer Datenbank

Hallo,

ich habe vor kurzem ein umfangreiches Rechnungsprogramm mit C# und dem in Visual Studio eingebundenen SQL-Server erstellt.
Beim debuggen lief immer alles perfekt und eigentlich war das Programm reif für die Veröffentlichung. Jedoch wenn ich das Programm vom Ordner „debug“ in der Projektmappe aus starte, tritt ein Problem auf:
Das starten unmittelbar nach der letzten Kompilierung funktioniert, jedoch sobald ich den Computer neu starte oder einfach nur irgend ein anderes Programm ausgeführt habe (sei es nur der Media Player), funktioniert die .exe Datei gar nicht mehr. Es kommt folgende Fehlermeldung:

„…exe ist keine gültige Win32-Anwendung.“

Erst wenn ich das Programm noch einmal kompiliere läuft es wieder.
Ich dachte zuerst, das sich das mit dem Veröffentlichen erledigen würde, aber dann passiert unter den selben Umständen genau das gleiche - nur mit einer allgemeineren Fehlermeldung:

„Die Anwendung kann nicht gestartet werden. Wenden Sie sich dan den Hersteller der Anwendung.“

Habe ich vielleicht irgendetwas entscheidendes vergessen? Muss vor dem Beenden des Programms noch eine wichtige Codezeile eingefügt werden? Ich kann mir nicht erklären wo genau der Fehler liegt, deshalb kann ich noch kein Codebeispiel angeben. Aber vielleicht hat ja jemand Erfahrung mit dieser Art von Fehler. Ich bin für jeden Hinweis dankbar!

Florian

Auch hallo.

ich habe vor kurzem ein umfangreiches Rechnungsprogramm mit C#
und dem in Visual Studio eingebundenen SQL-Server erstellt.

MSDE oder der richtige (aktuell wäre 2005) ?

Habe ich vielleicht irgendetwas entscheidendes vergessen?

Wie nimmt das Programm Kontakt zur Datenbank auf ? Und ist der Server bereits oben, wenn das Programm auf seine Daten wartet ? Uns stimmen die
zugriffsrechte ?
Aber vielleicht führt diese openbook bereits auf die Lösung: http://www.galileocomputing.de/openbook/visual_cshar…

HTH
mfg M.L.

Hallo!

Das hört sich ja ausgesprochen abenteuerlich an, eine Anwendung, die nur funktioniert, wenn sie frisch erstellt wurde…

Probier’ vielleicht mal folgendes: Erstelle eine Mini-Exe (MessageBox.Show(„Hello World“)) und überprüfe, ob auch dort der Effekt auftritt.
Evtl. auch mal mit einem C++ (nicht .NET) Minimalprogramm.

Wenn ja, dann hat entweder Deine Festplatte einen Schuss oder Du bist evtl. verseucht und irgendeine Malware schreibt die Exe kaputt. U.U. passiert’s auch nur bei .NET Anwendungen, weil die Malware mit dem anderen Format nichts anfangen kann und die Verbreitungsroutinen an die falsche Stelle schreibt.

Wie sieht denn das Änderungs-/Erstellungsdatum sowie die Dateigröße aus a) zum Kompilierzeitpunkt und b) wenn gemeldet wird, dass die Anwendung keine gültige Win32 Anwendung ist?

Es ist nach Deiner Fehlerbeschreibung schnurzegal, was Dein Programm macht oder welche DB Du verwendest, die Überprüfung auf ein gültiges PE-Format passiert, bevor die erste Zeile Deines Codes ausgeführt wird…

Gruß,
Martin

MSDE oder der richtige (aktuell wäre 2005) ?

Der richtige (also SQL Server 2005)

Wie nimmt das Programm Kontakt zur Datenbank auf ? Und ist der
Server bereits oben, wenn das Programm auf seine Daten wartet
? Uns stimmen die
zugriffsrechte ?

Ich muss dazu sagen, ich bin totaler Anfänger.
Das Programm hat bisher immer automatisch Kontakt mit der Datenbank aufgenommen. Ich musste mich darum nie kümmern, weil die Entwicklungsumgebung das von alleine gemacht hat. Sozusagen: Wenn ich das Projekt geöffnet habe und kompilierte, stellt das Programm die Verbindung ohne mein zutun her.

Aber der Hinweis ist gut. Gibt es einen Befehl, der soviel sagt wie: „Beim starten stell zuerstmal die Verbindung mit der Datenbank her!“ ? Also einen anderen, als den standardmäßig in Form1_Load(…) erzeugten Befehl:

// TODO: Diese Codezeile lädt Daten in die Tabelle "DatabaseDataSet.Daten". Sie können sie bei Bedarf verschieben oder entfernen.
this.DatenTableAdapter.Fill(this.DatabaseDataSet.Daten);

Wenn ja, das könnte das Problem beheben. Aber wie gesagt: Leider weiß ich noch nicht allzu viel.

Im Voraus vielen Dank für alle Hilfe!

Florian

Auch Hallo!

Probier’ vielleicht mal folgendes: Erstelle eine Mini-Exe
(MessageBox.Show(„Hello World“)) und überprüfe, ob auch dort
der Effekt auftritt.

Das habe ich gemacht. Vielen Dank für den Tipp. Aber bei „Nicht-Datenbank-Programmen“ läuft alles einwandfrei. (Auch nach der Veröffentlichung.)

Ich bin mir fast 100%ig sicher, das das Problem bei meinem Code liegt. Ich muss nur noch herausfinden an welcher Stelle ich etwas vergessen habe, von dem ich nur noch nicht weiß, das es da hin muss.

Danke für deine Hilfe!

Florian

Hallo nochmal.

Das Programm hat bisher immer automatisch Kontakt mit :der
Datenbank aufgenommen. Ich musste mich darum nie :kümmern, weil
die Entwicklungsumgebung das von alleine gemacht hat.

Ein direkter Simulationsversuch mit einer exe Datei hier (VB.NET 2.0, Datenbank als Datei im mdb-Format) führte von einem anderen Ordner aus ebenfalls zu einer Fehlermeldung. Das Programm lief dann aber ohne Anzeige der Daten weiter.
So gesehen sollte am Connection String auf Codeebene (oder mit der IDE selbst) etwas geändert werden.

HTH
mfg M.L.

So gesehen sollte am Connection String auf Codeebene (oder mit
der IDE selbst) etwas geändert werden.

Nur was sollte ich da ändern? Wie gesagt, ich bin noch ganz am Anfang meiner „Programmier-Karriere“ und kann damit nichts anfangen.

Wenn ich dem Programm irgendwie mitteilen könnte: „Nimm beim starten Kontakt mit der Datenbank auf.“ - Ich glaube das wäre die Lösung.
Es ist zwar nur eine Vermutung, aber meine heißeste Spur bisher.

Vielen Dank für alle Hilfe!

Florian

Nochmal Hallo! :smile:
Wenn die Meldung tatsächlich die ist, dass es sich nicht um eine gültige Win32-Anwendung handelt, dann ist das definitiv nichts, was an Deinem Code liegt!

Das „schlimmste“, was Du codeseitig machen kannst, ist, eine Anweisung in Deinem Code zu haben, die eine Exception auslöst, welche dann nicht abgefangen wird.
In diesem Fall meldet die CLR halt, dass das Programm wegen einer nicht behandelten Ausnahme beendet werden muss, nichts anderes!
Ihr könnt Euch also das ganze Suchen nach dem richtigen ConnectionString sparen.

Noch eine Idee: Nach dem Erstellen der Anwendung könntest Du den kompletten Inhalt des Debug-Verzeichnisses wo anders hin kopieren.
Nach Deiner Beschreibung startest Du dann die Anwendung einmal, startest dann z.B. den Media Player und anschließend kommt die „keine gültige Win32-Anwendung“-Meldung, wenn Du nochmal versuchst, Deine Anwendung im Debug-Verzeichnis zu starten, ja?
Was passiert, wenn Du dann versuchst, die wegkopierte Anwendung zu starten? Selbe Meldung? Anderer Effekt?

Gruß,
Martin

P.S.: Wenn Du partout gleich am Anfang Kontakt zur DB aufnehmen willst, brauchst Du ja nur eine SqlConnection instanziieren (da muss man natürlich den entsprechenden ConnectionString angeben) und dann bspw. einen einfachen SELECT per SqlCommand absetzen.
Das geht auch gleich nach Programmstart, also quasi als erste Anweisungen in Deinem Main().

Hallo nochmal und danke für deine Hilfe!

Ich habe das Problem zwar noch nicht gelöst, bin aber wieder einen Schritt weiter:

P.S.: Wenn Du partout gleich am Anfang Kontakt zur DB
aufnehmen willst, brauchst Du ja nur eine SqlConnection
instanziieren (da muss man natürlich den entsprechenden
ConnectionString angeben) und dann bspw. einen einfachen
SELECT per SqlCommand absetzen.

Das habe ich nun gemacht. Das Problem wurde dadurch tatsächlich nicht gelöst. Immerhin weiß ich das nun mit Sicherheit.

Noch eine Idee: Nach dem Erstellen der Anwendung könntest Du
den kompletten Inhalt des Debug-Verzeichnisses wo anders hin
kopieren.

Das habe ich ebenfalls gemacht. Ich habe 2 Kopien des Debug-Verzeichnisses erstellt. In die eine Kopie des Programms habe ich 3 Datensätze eingetragen und die andere habe ich unbehelligt gelassen.
Nachdem ich den Computer neu gestartet habe, ging das Programm mit den 3 Datensätzen nicht mehr aber das andere funktionierte noch.
Ich startete nun die zweite Kopie und habe keine Daten eingetragen, sondern das Programm gleich wieder beendet. Aber auch dann funktionierte das Programm nach dem Neustart nicht mehr.

Ich kann also mit Sicherheit sagen: Das Programm funktioniert immer nur nach dem ersten Betrieb nicht mehr. Wenn es einfach nur da ist, ohne benutzt zu werden, kann man es praktisch noch ein einziges Mal verwenden. Komisch, oder?

Was soll ich nur tun? Ich bin weiterhin für jede Hilfe dankbar!

Florian

Ok, nach dieser Beschreibung hört es sich aber jetzt wirklich verschärft nach Verseuchung an.
Hast Du mal einen aktuellen Virenscanner/Malwarescanner laufen lassen?

Wenn jede der Executable-Kopien einmal geht und dann nicht mehr, wie sieht es dann aus, wenn Du die selbe Kopie 2* hintereinander startest? Geht’s dann auch 2* oder ist auch dann nach dem 1.Aufruf Schluss?
Wenn Du eine Version, die geht, mit einer, die nicht geht vergleichst, wie unterscheiden sich die (Größe, Änderungszeitpunkt)?
Im Zweifel mal die 2 Dateien bitweise per FC auf der DOS-Shell vergleichen.

Gruß,
Martin

Hast Du mal einen aktuellen Virenscanner/Malwarescanner laufen
lassen?

Im Moment lasse ich einen Virenscanner laufen und es sieht so aus, als ob das Problem tatsächlich durch einen Virus erzeugt wird. Er heißt Win32/Jeefo und infiziert alle .exe Dateien. Ich werde jetzt meinen Computer neu aufsetzen und nur nicht-exe-Dateien sichern. Ich hoffe das hilft.

Vorerst vielen Dank für alles und falls es immer noch nicht geht, würde ich mich nochmal melden.

Florian

Hast Du mal einen aktuellen Virenscanner/Malwarescanner laufen
lassen?

Im Moment lasse ich einen Virenscanner laufen und es sieht so
aus, als ob das Problem tatsächlich durch einen Virus erzeugt
wird. Er heißt Win32/Jeefo und infiziert alle .exe Dateien.

Oh Mist…
Mein Beileid.

Ich werde jetzt meinen Computer neu aufsetzen und nur
nicht-exe-Dateien sichern. Ich hoffe das hilft.

Vorerst vielen Dank für alles und falls es immer noch nicht
geht, würde ich mich nochmal melden.

Klar, gerne doch.

Florian