LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
RobertG
Beiträge: 1969
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von RobertG » Sa 10. Aug 2019, 08:23

Hallo Heiko,
aladin hat geschrieben:
Fr 9. Aug 2019, 21:13
Woran hast Du gesehen, dass es der Typ TEXT war?
Ich bin durch Zufall auf eine Tabelle in meinem Sammelsurium gestoßen, die den Fehler auswarf. Dann habe ich mit PHPMyAdmin nachgesehen, was denn an der Tabelle das Besondere an Feldern war. Ich kannte den Typ TEXT gar nicht, wusste aber, dass alle anderen Typen auch in vielen meiner sonstigen Tabellen vorkamen. Habe das dann auf VARCHAR mit der entsprechenden Länge geändert und gut war es. Die Tabelle ließ sich öffnen und Werte eingeben.

Jetzt wäre es natürlich schön, wenn Du einfach eine Parallelinstallation hättest (ich habe hier alle möglichen Versionen parallel auf der Platte liegen). Dann könntest Du testen, ob bei Dir ein anderer Feldtyp den Ausrutscher gibt.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

aladin
Beiträge: 31
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von aladin » Sa 10. Aug 2019, 09:54

Hallo Robert.
RobertG hat geschrieben:
Sa 10. Aug 2019, 08:23
Jetzt wäre es natürlich schön, wenn Du einfach eine Parallelinstallation hättest (ich habe hier alle möglichen Versionen parallel auf der Platte liegen). Dann könntest Du testen, ob bei Dir ein anderer Feldtyp den Ausrutscher gibt.
Ich baue LO 6.3 eben noch mal neu und teste das im Anschluss genauer.
Schön, dass Du das mit den Bugreports machst!
Ich tue mich da etwas schwer, da ich das nicht gut in englisch formulieren kann.

Vielleicht komme ich da gleich den Abstürzen auf die Spur.
Der Absturz unter LO 6.2 hatte definitiv nichts mit den Formularen zu tun, sondern wurde bei einer Abfrage über Basic ausgelöst.
Evtl. war das auch unter LO 6.3 der Fall.

In Deinem Beitrag hier viewtopic.php?p=65381#p65381 hast Du ja Hinweise über die ResultSets gegeben.

Als ich mich da vor Jahren damit auseinander gesetzt hatte, hat man diese noch unterschieden zwischen
FORWARD_ONLY:

Code: Alles auswählen

Function oResult(sSQL as String)as Object
	Dim oStatement as Object
	oStatement=oConnection.createStatement()
	oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.FORWARD_ONLY 
	oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY
	oStatement.EscapeProcessing = FALSE
	oResult=oStatement.executeQuery(sSQL)
End Function
und SCROLL_INSENSITIVE:

Code: Alles auswählen

Function oResult_Scroll(sSQL as String)as Object
	Dim oStatement as Object
	oStatement=oConnection.createStatement()
	oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE
	oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY
	oStatement.EscapeProcessing = FALSE
	oResult_Scroll=oStatement.executeQuery(sSQL)
End Function
Hier noch die Funktion für die Connection:

Code: Alles auswählen

Function oConnection as Object
On Error Goto ErrorHandler
	Dim vDatabaseContext As variant,oAccess as Object
	Dim vInteractionHandler as variant,vTables as Object
	vDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	if vDatabaseContext.hasByName(sDataSource) = "False" then
		MsgBox "Sie haben möglicherweise noch nicht die Datenquelle "& Chr$(13) &_
				">> ALADIN << eingerichtet!"& Chr$(13) & Chr$(13) &_
				"Achtung!! Groß-Kleinschreibung beachten!",16,"Fehler"
	Stop
	Exit Function
	End if
	oAccess = vDatabaseContext.getByName(sDataSource)
nochmal:
	If Not oAccess.IsPasswordRequired Then
		oConnection = oAccess.getConnection("","")
	Else
		vInteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
		oConnection = oAccess.ConnectWithCompletion(vInteractionHandler)
	End If
	Exit Function
ErrorHandler:
	Reset
	MsgBox "Sie haben möglicherweise nicht das richtige Passwort eingegeben,"&_
			" oder die notwendigen Rechte in der Datenbank sind nicht gesetzt!",16,"Fehler"
    goto nochmal
End Function
Ist Dir da etwas bekannt, dass das unter LO mit dem neuen Treiber nicht mehr so geht?

Gruß und Danke
Heiko

aladin
Beiträge: 31
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von aladin » Sa 10. Aug 2019, 10:02

RobertG hat geschrieben:
Sa 10. Aug 2019, 08:23
Ich bin durch Zufall auf eine Tabelle in meinem Sammelsurium gestoßen, die den Fehler auswarf. Dann habe ich mit PHPMyAdmin nachgesehen, was denn an der Tabelle das Besondere an Feldern war. Ich kannte den Typ TEXT gar nicht, wusste aber, dass alle anderen Typen auch in vielen meiner sonstigen Tabellen vorkamen. Habe das dann auf VARCHAR mit der entsprechenden Länge geändert und gut war es. Die Tabelle ließ sich öffnen und Werte eingeben.
Als Typ in meinen Tabellen gibt es noch LONGTEXT.
VARCHAR war mir in diesem Fall zu kurz.
Sehr wahrscheinlich, dass der die Ursache für die Meldung ist.

MySQL nennt in dem Zusammenhang noch BLOB bzw. LONGBLOB.
Ich könnte mal probieren, ob es da auch zu der Meldung kommt.

Diese Typen werde ich mal testen:

Code: Alles auswählen

TINYTEXT, TINYBLOB: Zeichenkette mit einer Größe von max. 255 Byte (entspricht 255 Zeichen).
BLOB, TEXT: Für Zeichenketten mit einer maximalen Größe von 65.535 Byte. (Zeichen)
MEDIUMBLOB, MEDIUMTEXT: Zeichenkette, die maximal 16.777.215 Byte (Zeichen) groß ist.
LONGBLOB, LONGTEXT: Text mit einer maximalen Größe von 4.294.967.295 Byte (Zeichen)
Gruß
Heiko

aladin
Beiträge: 31
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von aladin » Sa 10. Aug 2019, 14:14

Ich konnte den Fehler bei allen TEXT-Typen (TEXT, TINYTEXT, MEDIUMTEXT, LONGTEXT) nachvollziehen.
Dazu habe ich jeweils für jeden Typ eine Tabelle mit einer Spalte des jeweiligen Typs angelegt.
Wichtig, die Fehlermeldung kam erst, nachdem mindestens ein Datensatz in der Tabelle enthalten war.

Bei den BLOB-Typen kam keine Fehlermeldung. In der Tabelle wurde jedoch statt des Textes <OBJECT> angezeigt.
Ich habe mich aber noch nicht damit auseinander gesetzt, kann also nicht bewerten, ob das so in Ordnung ist.

Ob noch andere Typen betroffen sind, konnte ich so nicht feststellen.
Da wäre es eigentlich schlauer, wenn die Fehlermeldung in LO die entsprechende Information liefern würde, welcher Typ nicht bekannt ist.

Gruß und schönes WE
Heiko

aladin
Beiträge: 31
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von aladin » Sa 10. Aug 2019, 15:02

zu den Abstürzen:
Ich konnte zumindest sicher einen Absturz reproduzieren, wenn in der Funktion:

Code: Alles auswählen

Function oResult(sSQL as String)as Object
	Dim oStatement as Object
	oStatement=oConnection.createStatement()
	oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.FORWARD_ONLY 
	oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY
	oStatement.EscapeProcessing = FALSE
	oResult=oStatement.executeQuery(sSQL)
End Function

Code: Alles auswählen

oStatement.EscapeProcessing = FALSE
Auskommentiert oder auf TRUE gesetzt wird.

Es fällt mir allerdings schwer nachzuvollziehen, bei welchen Aktionen es darüber hinaus zu Abstürzen kommt.
Evtl. liegt es an den unbekannten Feld-Typen.

RobertG
Beiträge: 1969
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von RobertG » Sa 10. Aug 2019, 19:48

Hallo Heiko,

der Typ VARCHAR konnte früher einmal nur 255 Zeichen, seit MySQL 5 aber 65535 Zeichen - also genauso viel wie TEXT. Das gesamte Kapitel 1 - Einführung in Base (1. Kapitel nach dem Vorwort) hat momentan 62338 Zeichen und ist mit den Bildern zusammen 45 Seiten lang.

Nutzt Du die Variablen MEDIUMTEXT oder LONGTEXT, so können da ganze Bücher drin gespeichert werden. Da MySQL in der Version 5 im Jahr 2005 veröffentlicht wurde bin ich nie darauf gekommen, die TEXT-Datentypen überhaupt zu wählen.

Das Merkwürdige ist ja, dass der Tabelleneditor in Base mit dem direkten Treiber die Möglichkeit der TEXT-Felder als "Memo [TEXT]" usw. aufführt. Müsste also eigentlich funktionieren.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

RobertG
Beiträge: 1969
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von RobertG » Sa 10. Aug 2019, 20:02

Hallo Heiko,

Du willst doch weder in der Datensätzen hin- und her navigieren noch während der Abfrage direkt Daten ändern. Dann kannst Du das Makro gleich direkt zusammenkürzen:

Code: Alles auswählen

Function oResult(sSQL as String)as Object
	Dim oStatement as Object
	oStatement=oConnection.createStatement()
	oResult=oStatement.executeQuery(sSQL)
End Function
Dazu brauchst Du eigentlich keine Funktion. Es ist mir auch unklar, wo denn oConnection her kommt ...
aladin hat geschrieben:
Sa 10. Aug 2019, 15:02

Code: Alles auswählen

oStatement.EscapeProcessing = FALSE
Auskommentiert oder auf TRUE gesetzt wird.
Für das EscapeProcessing musste ich erst einmal in der API nachsehen - das habe ich bisher (auch in allen Beschreibungen im Handbuch) nicht benötigt.
https://api.libreoffice.org/docs/idl/re ... vider.html
Nach dem, was ich da lese, ist das Ding standardmäßig TRUE. Das erreichst Du also durch den Zusatz TRUE oder direkt durch das Weglassen dieses Parameters. Es muss auf FALSE gesetzt sein, wenn der SQL-Befehl direkt ohne eine Analyse durch Base weiter gegeben werden soll.

Ich kann mir vorstellen, dass auch hier wieder etwas passiert, was mit den Datentypen zusammen hängt, die schon in der Tabelle mit dem Treiber nicht lesbar sind.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

aladin
Beiträge: 31
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von aladin » Sa 10. Aug 2019, 20:26

Hallo Robert.
RobertG hat geschrieben:
Sa 10. Aug 2019, 19:48
der Typ VARCHAR konnte früher einmal nur 255 Zeichen, seit MySQL 5 aber 65535 Zeichen - also genauso viel wie TEXT. Das gesamte Kapitel 1 - Einführung in Base (1. Kapitel nach dem Vorwort) hat momentan 62338 Zeichen und ist mit den Bildern zusammen 45 Seiten lang.
Das ist ja sehr interessant!!!
Muss doch jetzt mal schauen wie ich den Datentyp ändern kann in der vorhandenen Datenbank.
Das geht wahrscheinlich am schnellsten mit einem dump und sed...

Aber den Code für die Erzeugung der Tabellen, sollte ich dringend überarbeiten.
Nutzt Du die Variablen MEDIUMTEXT oder LONGTEXT, so können da ganze Bücher drin gespeichert werden.
Ja, ist mir auch gerade aufgefallen.
Ich dachte wohl damals "viel hilft viel" ;-)
Da MySQL in der Version 5 im Jahr 2005 veröffentlicht wurde bin ich nie darauf gekommen, die TEXT-Datentypen überhaupt zu wählen.
Die ältesten Daten in dieser Datenbank sind von 2002, damals noch mit StarOffice 5.2 verbunden...

http://www.aladin-gmbh.de/download/Angebote.jpg :lol:

aladin
Beiträge: 31
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von aladin » Sa 10. Aug 2019, 20:46

RobertG hat geschrieben:
Sa 10. Aug 2019, 20:02
Du willst doch weder in der Datensätzen hin- und her navigieren noch während der Abfrage direkt Daten ändern. Dann kannst Du das Makro gleich direkt zusammenkürzen:
Doch, manchmal muss ich durch die einzelnen Datensätze durch.
Deswegen hatte ich beide Funktionen siehe hier:viewtopic.php?p=65404#p65404
Dazu brauchst Du eigentlich keine Funktion. Es ist mir auch unklar, wo denn oConnection her kommt ...
oConnection (auch hier:viewtopic.php?p=65404#p65404) war eine Funktion, die ich geschrieben hatte um Fehler abzufangen, wenn das Passwort falsch eingegeben wird. Damit sollte der Benutzer besser damit umgehen können.
Für das EscapeProcessing musste ich erst einmal in der API nachsehen - das habe ich bisher (auch in allen Beschreibungen im Handbuch) nicht benötigt.
https://api.libreoffice.org/docs/idl/re ... vider.html
Nach dem, was ich da lese, ist das Ding standardmäßig TRUE. Das erreichst Du also durch den Zusatz TRUE oder direkt durch das Weglassen dieses Parameters. Es muss auf FALSE gesetzt sein, wenn der SQL-Befehl direkt ohne eine Analyse durch Base weiter gegeben werden soll.
Naja, es gibt in der Anwendung schon sehr MySQL-spezielle SQL-Statements, die ich Base nicht analysieren lassen kann, denke ich.
Das war damals der Grund das abzuschalten...
Ich kann mir vorstellen, dass auch hier wieder etwas passiert, was mit den Datentypen zusammen hängt, die schon in der Tabelle mit dem Treiber nicht lesbar sind.
Das ist durchaus möglich. Ich merke, ich sollte mir mal einige Sachen genauer ansehen.
Die Entwicklung von SO5.2 über OO1.1 zu AOO4 war oft damit verbunden Workarounds zu entwickeln. Wenn dann mal eine Lösung funktionierte, habe ich sie nicht mehr angefasst, bis es Probleme gab... "never touch a running system"
Jetzt, da ich LO ein wenig ins Herz geschlossen habe, ist die Motivation mal wieder etwas größer da tiefer einzusteigen.

Danke für die Hinweise. Da schaue ich erst einmal. Vielleicht löst sich das mit den Abstürzen.

Gruß
Heiko

RobertG
Beiträge: 1969
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: LO Anbindung an MariaDB / MySQL mit "Direkte Verbindung"

Beitrag von RobertG » So 11. Aug 2019, 09:10

Hallo Heiko,

wenn Du die Datenbank seit StarOffice 5.2 mit Dir rumschleppst, dann müsste da vermutlich einiges überarbeitet werden. Zu der Zeit habe ich gerade meine ersten Datenbanken mit dem dort mitgelieferten Adabas erstellt.

Allein schon was den Tabellentyp und die Collation würde ich schleunigst aus der Datenbank eine relationale Datenbank machen. MyISAM durch InnoDB ersetzen, latin1_swedish (damals Standard) durch eine UTF8-Codierung. Meine ersten MySQL-Datenbanken (Bibliotheksdatenbank ...) habe ich erst mit der Version 5.0 erstellt. Da habe ich die Relationen auch erst einmal nur über die Programmierung (in PHP) zusammenbekommen. Irgendwann habe ich dann auch da umgestellt.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Antworten