Forum: PC-Programmierung Problem beim Verbinden mit ODBC-Datenbank (W2K3)


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Richte eine System-DSN ein und nutze diese.

von JensM (Gast)


Lesenswert?

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.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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 :-(

von Peter II (Gast)


Lesenswert?

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

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

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.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

... 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?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von ... (Gast)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.