Base mit externem MySQL-Server verbinden

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Base mit externem MySQL-Server verbinden

Beitrag von arkadiuszpaluszek »

Hallo!

Ich kontaktiere einen externen MySQL-Server durch Base. Muss zur Anmeldung jedes mal das Passwort angeben, was ich aber gerne vermeiden würde.
Mit folgendem Skript funktionierte es früher bei einer lokalen MySQL-DB:

Code: Alles auswählen

dim DatabaseContext as Object
dim DataSource as Object
dim Connection as Object
dim InteractionHandler as Object
dim Statement as Object
dim ResultSet as Object

DatabaseContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DatabaseContext.getByName("MeineDatenbank")
Connection=DataSource.GetConnection("benutzername","passwort")
Statement=Connection.createStatement()
ResultSet=Statement.executeQuery("SELECT ""feld"" FROM ""tabelle""")
Diesmal funktioniert es nicht, ich bekomme die Meldung "MySQL Server has gone away". Ich nehme an, es liegt daran, dass ich mit dem obigen Skript zunächst nur die Verbindung zur Base-Datei aufbaue, welche aber ihrerseits mit dem externen Server noch nicht verbunden ist.

Ist es möglich, per Makro den Prozess zu initiieren, welcher die Base-Datei mit dem MySQL-Server verbindet, also sich direktz an den MySQL-Server zu wenden, ohne Umweg über die Base-Datei?

Gruss

Arek
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Base mit externem MySQL-Server verbinden

Beitrag von komma4 »

arkadiuszpaluszek hat geschrieben: "MySQL Server has gone away".
Du hast ein Berechtigungsproblem - Benutzer und/oder Host sind nicht auf dem Server berechtigt.
Oder ein Timing-Problem...

arkadiuszpaluszek hat geschrieben: Ich nehme an, es liegt daran, dass ich mit dem obigen Skript zunächst nur die Verbindung zur Base-Datei aufbaue
Diese Annahme ist falsch.
Dein Code läuft bei mir (3.2.1/Linux/MySQL 5.1.46 mit Java-Connector 5.1.15) und stellt mit der Anweisung .getConnection() die Verbindung her.


Viel Erfolg beim Probieren!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Base mit externem MySQL-Server verbinden

Beitrag von arkadiuszpaluszek »

O.k., es war ein Timeout - Problem. Habe den Rechner neu gestartet und siehe da - er fragt die Inhalte der Datenbank ab. Das alles geschieht als Makro im Hintergrund eines Writer-Dokuments. Gleichzeitig verfügt dieses Dokument über Buttons, welche weitere Formulare aufmachen, die wiederum auf die gleiche Datenbank zugreifen möchten - und obwohl die Datenbankverbindung offensichtlich besteht, werde ich hier beim erstmaligen Aufmachen des Formulars erstaunlicherweise nach dem Datenbankpasswort gefragt - was ich eigentlich vermeiden wollte.

Habe ich aber das Passwort beim Aufmachen eines Formulars eingegeben und mache ein weiteres Formular auf, wird aufgrund der bereits bestehenden DB-Verbindung das Passwort nicht erneut abgefragt.

Warum funktioniert es also wenn die DB-Verbindung durch manuelle Eingabe des Passworts beim Aufmachen eines Formulars hergestellt wird, nicht aber wenn ein Makro die DB-Verbindung aufbaut?

Gruss

Arek
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Base mit externem MySQL-Server verbinden

Beitrag von DPunch »

Aloha
arkadiuszpaluszek hat geschrieben:Warum funktioniert es also wenn die DB-Verbindung durch manuelle Eingabe des Passworts beim Aufmachen eines Formulars hergestellt wird, nicht aber wenn ein Makro die DB-Verbindung aufbaut?
Vermutlich, weil sich OpenOffice durch die GUI-Interaktion die Verbindung merkt und offenhält.
Im Makro gehen die Verbindungsinformationen mit dem Sterben des Connection-Objekts verloren bzw stehen den Formularen gar nicht zur Verfügung (von Haus aus).

Ohne es getestet oder mich näher damit beschäftigt zu haben, sollte es aber auf jeden Fall möglich sein, z.B. bei globaler Deklaration des Verbindungsobjekts, den Formularen beim Öffnen dieses gleich zur Verfügung zu stellen.
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Base mit externem MySQL-Server verbinden

Beitrag von arkadiuszpaluszek »

Habe nun meine Verbindungsvariablen global deklariert, "nix da", ich werde nach wie vor nach dem Passwort gefragt! :?

Code: Alles auswählen

dim DatabaseContext as Object
dim DataSource as Object
dim Connection as Object
dim Statement as Object
dim ResultSet as Object

Sub DB_Verbindung

dim oDoc as Object, oForm as Object, oEl as Object

DatabaseContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DatabaseContext.getByName("MeineDatenbank")
Connection=DataSource.GetConnection("Benutzername","Passwort")
Statement=Connection.createStatement()

oDoc=thisComponent

oForm=oDoc.drawpage.forms.getByName("Formular1")
oEl=oForm.getByName("infofeld")
oEl.text="wird erhalten"
oEl=oForm.getByName("testfeld")
oEl.text=""
ErsteAbfrage=0

do while oEl.text<>"stop"
	
	ResultSet=Statement.executeQuery("SELECT ""KundeCode"" FROM ""Kunden""")
	
	if ErsteAbfrage=0 then
	ErsteAbfrage=1
		if not isNull(ResultSet) then
			msgbox("Datenbankverbindung hergestellt")
		else
			msgbox("Datenbankverbindung FEHLGESCHLAGEN")
		end if
	end if
wait(1000)	
loop

msgbox ("Datenbankverbindung wird nicht"+chr(13)+"mehr aufrechterhalten")
oEl.text=""
Connection.close()
oDoc.close(true)	

End Sub

sub beenden
dim oDoc as Object, oForm as Object, oEl as Object
oDoc=thisComponent
oForm=oDoc.drawpage.forms.getByName("Formular1")
oEl=oForm.getByName("testfeld")
oEl.text="stop"
oEl=oForm.getByName("infofeld")
oEl.text="stop"
exit sub

end sub
Weiß nun jemand trotzdem noch eine Lösung oder zumindest einen Ansatz?

Viele Grüße

Arek
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Base mit externem MySQL-Server verbinden

Beitrag von DPunch »

Aloha
arkadiuszpaluszek hat geschrieben:Habe nun meine Verbindungsvariablen global deklariert, "nix da", ich werde nach wie vor nach dem Passwort gefragt!
Einfach nur global deklarieren war ja auch nicht der Vorschlag, sondern
DPunch hat geschrieben:bei globaler Deklaration des Verbindungsobjekts, den Formularen beim Öffnen dieses gleich zur Verfügung zu stellen.
Ich habe das gerade mal getestet und es lief auf Anhieb, ohne Passwortabfrage.
(Öffnen eines Writer-Dokuments mit einem Formular, das auf eine Passwort-geschützte MySQL-DB zugreift, ausgeführt aus einem anderen Writer-Dokument)

Code: Alles auswählen

DatabaseContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DatabaseContext.getByName("MeineDatenbank")
Connection=DataSource.GetConnection("benutzername","passwort")
Dim props(0) as new com.sun.star.beans.PropertyValue
props(0).Name = "Hidden"
props(0).Value = True
sPath = "C:\meinDokument.odt"
sPath = ConvertToURL(sPath)
oNewDoc = StarDesktop.loadComponentFromURL(sPath,"_blank",0,props())
oNewDoc.Drawpage.Forms(0).ActiveConnection = Connection
oNewDoc.CurrentController.Frame.ContainerWindow.setVisible(True)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Base mit externem MySQL-Server verbinden

Beitrag von komma4 »

arkadiuszpaluszek hat geschrieben:Habe nun meine Verbindungsvariablen global deklariert
Das sehe ich nicht so. Wo steht das Schlüsselwort GLOBAL? Siehe F1 Hilfe - oder bei Dannenhöfer.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Antworten