Ich habe eine Anwendung, die unter Windows läuft und sich beim Start automatisch über ODBC mit einem MSSQL-Server verbinden soll. Zum Abspeichern der Zugangsdaten kann ich im Setup meiner Anwendung die Connect-Funktion ohne Parameter aufrufen - dadurch kommt eine Auswahlbox aus dem System hoch. Die von mir verwendete Datenquelle ist eine Computerdatenquelle, d.h. mit der Anmeldung am Computer habe ich auch das Zugriffsrecht. Ich wähle also die Datenbank aus und speichere dann den sog. Connect-String ab. Unter Angabe dieses Strings kann ich (eigentlich) danach beliebig oft und ohne erneute Dialogbox die Verbindung immer wieder herstellen. Das klappt auch meistens, allerdings nicht immer. Gelegentlich wird auch die Datenbank zu Wartungszwecken mal heruntergefahren oder der Server, auf dem die Anwendung läuft, muss wegen eines Updates mal neu gestartet werden. Grob geschätzt klappt das automatische Wiederverbinden zwanzig mal problemlos und beim einundzwanzigsten Mal kommt die saublöde Dialogbox hoch und das ganze System steht. Und da es ein meist unbeobachtet laufender Server ist, manchmal ziemlich lange, was an anderer Stelle Ärger hervorruft. Langer Rede kurzer Sinn: Wieso kann sowas passieren, wie kann ich das verhindern?
Ich denke mit Computerdatenquelle meint Frank eine System-DSN. Mit Problemen bei einer Netzwerkverbindung muss immer gerechnet werden. Das muss die Anwendung entsprechend behandeln können. Hat man keinen Einfluss auf die Anwendung müsste man eine Überwachundsanwendung schreiben, welche ünerprüft ob die zu überwachenden Anwendung die Dialogbox geöffnet hat. Wenn dies der Fall ist müßte die zu überwachende Anwendung beendet und neu gestartet werden. Gruß JensM.
Die Dialogbox kommt nicht aus meiner Software. Ausserdem funktioniert das Wiederverbinden ja (nahezu) immer, nur ca. 1 mal in 3 Monaten nicht. Weiss garnicht, wie ich sowas testen soll :-(
dann bau doch den connectionstring gleich selber zusammen, dann braucht überhaupt keine datenquelle einzurichten. Driver={SQL Server};SERVER=servername;DATABASE=Master;UID=sa;PWD=sagichnicht
Mach ich doch ... Bei der ersten Benutzung (oder einer Änderung) wird absichtlich versucht, die Verbindung ohne Angabe eines Connect-String und einer Datenbank herzustellen. Das provoziert eine Dialogbox herbei (allerdings nicht die oben erwähnte unerwünschte), in der ich eine Datenquelle auswählen kann. Mit dem Klick auf OK wird die Verbindung hergestellt und ich erhalte den Connection-String zwecks Abspeicherung, was ich auch tue. Wie bereits beschrieben gelingt das WIederverbinden mit diesem gespeicherten Connection-String ja auch in geschätzten 99 von 100 Fällen.
Wie connectest Du denn zur DB (welche Funktion, welche Sprache). SQLDriverConnect kennt beispielsweise ein Flag um die Dialogbox zu unterdrücken (SQL_DRIVER_NOPROMPT), dann kommt einfach ein Error zurück wenn die Verbindung fehlschlägt. Falls Du CDatabase benutzt mußt Du statt Open die OpenEx Methode mit CDatabase::noOdbcDialog benutzen.
... schrieb: > Wie connectest Du denn zur DB Mit dem ODBC-Pugin von RealStudio ... ist ein objektorientiertes Basic mit Crosscompiler (Mac, Win, Linux). Da es sich um eine Hochsprache handelt, habe ich nur abstrakte Methoden, die konkreten Mechanismen dahinter sind mir im Detail unbekannt. Sieht ungefär so aus: Das hier bringt mir den System-Auswahldialog für eine Datenquelle auf den Schirm und liefert den Connection-String, falls ich eine DB auswähle und OK klicke:
1 | dim db as new odbcdatabase |
2 | if db.connect then constr=db.datatsource |
Wenn ich den String habe (frisch geholt oder aus dem Setup geladen), kann ich ohne jeden weiteren Dialog verbinden und SQL-Statements ausfühern:
1 | dim db as new odbcdatabase |
2 | db.datasource=constr |
3 | if db.connect then ... |
Wichtig: Was ich im Eingangs-Post bemängelte bzw. für blöde und böse hielt, war NICHT der Dialog zur Auswahl einer Datenquelle, sondern ein anderer (kleinerer) Dialog, der zu der korrekt gewählten Datenquelle plötzlich Benutzernamen und Passwort haben wollte, obwohl es sich um eine Systemdatenquelle handelt. Kann es sein, dass da gerade zu dieser Zeit im Hintergrund ein Admin an der Datenbank "herumgepfuscht" hat?
Frank Esselbach schrieb: > Kann es sein, dass da gerade zu dieser > Zeit im Hintergrund ein Admin an der Datenbank "herumgepfuscht" hat? Eventuell war auch die Netzwerkverbindung gestört. Probier doch mal die SQL_DRIVER_NOPROMPT Option anzuhängen wie von '... (Gast)' vorgeschlagen.
Frank Esselbach schrieb: > Mit dem ODBC-Pugin von RealStudio ... ist ein objektorientiertes Basic Auweia :) Davon hab ich leider keinen blassen Schimmer. Kannst ja mal schauen ob ODBCConstant was passendes hergibt, die Onlinedoku ist leider ziemlich bescheiden. Es gibt wohl auch noch ein Connectionattribut SQL_ATTR_QUIET_MODE was man auf Null setzen kann, keine Ahnung ob das hier hilft.
Läubi .. schrieb: > Probier doch mal die > SQL_DRIVER_NOPROMPT Option anzuhängen wie von '... (Gast)' > vorgeschlagen. Könnte schwierig werden, eigentlich ist das der Wert eines Flagparameters der Connect Funktion. Die von dem komischen Basic hat aber leider überhaupt keine Parameter :( Keine Ahnung, ob man das auch irgentwie über den Connectstring angeben kann.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.