csv in datenbank schreiben per sql befehl

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

Moderator: Moderatoren

Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

csv in datenbank schreiben per sql befehl

Beitrag von Gabriel123 »

Hallo,

Meine textdatei, kommagetrennt, sprengt inzwischen excel und ich suche ein Makro oder SQL Befehl mit dem ich die csv datei in die Datenbank übertragen kann. Bin im Forum nicht fündig geworden. Wer kann mir einen entsprechenden link schicken?

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

Re: csv in datenbank schreiben per sql befehl

Beitrag von komma4 »

heute morgen im zweiten englischen Forum gepostet :-)

Code: Alles auswählen

Sub base_insertCSVdatafile
' 2008-01-30

sCSVlokal = "d:/tsi/re_position.csv"

GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
sCSVdatei = ConvertToURL( sCSVlokal ) 

sMyInsert = " LOAD DATA INFILE '" & sCSVlokal & "' INTO TABLE wro1.re_position FIELDS TERMINATED BY ','"
msgbox sMyInsert

' Kontext holen
Dim oDBKontext 
oDBKontext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )

If IsNull( oDBKontext ) Then
	msgbox "kein DB Kontext" 
	exit sub
End If

' Datenquelle auswählen
' name of OOo registered data source
oDatenquelle = oDBKontext.getByName( "MySQL" )
 ' Verbindung zur DB herstellen
If Not oDatenquelle.IsPasswordRequired Then
	oVerbindung = oDatenquelle.getConnection( , )
Else
	oInteractionHandler = createUnoService( "com.sun.star.sdb.InteractionHandler" )
	oVerbindung = oDatenquelle.connectWithCompletion( oInteractionHandler ) 
End If 
 
' Statement erzeugen
oStatement = oVerbindung.createStatement

' Abfrage absetzen
oResultSet = oStatement.executeUpdate( sMyInsert )

End Sub
Das hilft?
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)
Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Re: csv in datenbank schreiben per sql befehl

Beitrag von Gabriel123 »

Das hilft schon mal weiter! aber leider "unexcepted token: LOAD in Statement[LOAD]" Was läuft denn da nicht rund in Zeile

Code: Alles auswählen

oResultSet = oStatement.executeUpdate( sMyInsert )
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: csv in datenbank schreiben per sql befehl

Beitrag von komma4 »

Das bedeutet "nur", dass der SQL-Befehl nicht ausgeführt wurde.


Den Fehler hast Du wahrscheinlich in der Codierung des SQLs selbst: lasse ihn Dir anzeigen - und zeige ihn uns, wenn Du den Fehler nicht siehst.

(Tippfehler beim Dateinamen, Tippfehler bei der Tabellenreferenzierung?)
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)
Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Re: csv in datenbank schreiben per sql befehl

Beitrag von Gabriel123 »

Sehr eigenartig...Meine Tabelle hat die Struktur ID(auto),1,2,3,4 und die csv datei 1,2,3,4

Alle Namen im Code sind richtig, der fehler ist immer

Code: Alles auswählen

oResultSet = oStatement.executeUpdate( sMyInsert )
, keine weiteren Infos zum Fehler.

Code: Alles auswählen

Sub base_insertCSVdatafile

sCSVlokal = "c:\tmp\01.csv"
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
sCSVdatei = ConvertToURL( sCSVlokal )
sMyInsert = "LOAD DATA INFILE '" & sCSVlokal & "' INTO TABLE Adressenleer FIELDS TERMINATED BY ';'"
msgbox sMyInsert
' Kontext holen
Dim oDBKontext
oDBKontext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
If IsNull( oDBKontext ) Then
   msgbox "kein DB Kontext"
   exit sub
End If
' Datenquelle auswählen
' name of OOo registered data source
oDatenquelle = oDBKontext.getByName( "DBImportF4" )
' Verbindung zur DB herstellen
   oVerbindung = oDatenquelle.getConnection("" ,"")
' Statement erzeugen
oStatement = oVerbindung.createStatement
' Abfrage absetzen
oResultSet = oStatement.executeUpdate( sMyInsert )
End Sub
Wie müsste ich denn den SQL Befehl umstricken um ihn per extras/sql manuell ohne Makro reinzuschießen? Vielleicht gibt das mehr hinweise auf den Fehler...
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: csv in datenbank schreiben per sql befehl

Beitrag von komma4 »

der Befehl sollte so (allerdings ohne die Basic-Variable) auch im Extras>SQL-Fenster einzugeben sein (ist nur blöde, dass dieses Fenster nur den RC darstellt, aber keine resultset tabellen):

Code: Alles auswählen

LOAD DATA INFILE 'c:\tmp\01.csv' INTO TABLE Adressenleer FIELDS TERMINATED BY ';'
Evtl. den Tabellennamen in (hier) in doppelte Anführungszeichen setzen.


Klappt das?
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)
Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Re: csv in datenbank schreiben per sql befehl

Beitrag von Gabriel123 »

Leider kein Erfolg per sql befehl, immerwieder unexepted token. Vielleicht kann nicht in die tabelle geschrieben werden?

hier ist aber glaube ich auch ein fehler

Code: Alles auswählen

sMyInsert = "LOAD DATA INFILE '" & sCSVlokal & "' 
da muss doch als Variable sCSVdatei hin oder? Aber auch das hilft mir nicht weiter. Dummerweise finde im netz nirgendwo was zur Arbeit mit dateien...oder ein anderes snipplet.

der fehler ist:
Basic Laufzeitfehler
Type com.sun.star.sdbc.SQLExeption
unexpected token: LOAD in statement [LOAD].
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: csv in datenbank schreiben per sql befehl

Beitrag von komma4 »

Das war ein guter Tipp!


Also: erste Erkenntnis aus den Tests: es wird KEINE url-Notation erwartet.
Zweite: die Dateinamen dürfen NICHT das Windows-backspace haben, sondern einen Vorwärts-slash!!!


so jedenfalls klappt das hier mit einem WinXP-Testrechner:

Code: Alles auswählen

sCSVlokal = "d:/tsi/kunden.csv"
[...]
sMyInsert = " LOAD DATA INFILE '" & sCSVlokal & "' INTO TABLE wro1.kunden FIELDS TERMINATED BY ','"
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)
Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Re: csv in datenbank schreiben per sql befehl

Beitrag von Gabriel123 »

gleicher Fehler, egal was ich mache. Kann es an der Datei 01.csv oder an der tabelle liegen? Oder bezieht sich der fehler nur auf den SQL Befehl. Vielleicht schickst Du mir mal deine komplette sub noch mal die du grad getestet hast=)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: csv in datenbank schreiben per sql befehl

Beitrag von komma4 »

siehe Posting vom 31.

Der Code importiert auf OOo 2.3.1/WinXP in eine registrierte HSQLDB(interne)-Datenquelle.

Bin inzwischen nicht mehr am anderen Standort - hier habe ich kein Windows....
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)
mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Re: csv in datenbank schreiben per sql befehl

Beitrag von mike6 »

Hallo,

ich klinke mich mal hier ein.
Da ich Datenbank-Anfänger bin , habe ich mal eine Frage.
Wie und wo genau, binde ich das hier vorgestellte Makro ein
damit ich eine csv Datei einlesen kann.
Habt Ihr eine Musterdatei?

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

Re: csv in datenbank schreiben per sql befehl

Beitrag von komma4 »

mike,

das Makro kann "irgendwo" (in einem Modul Deiner OOo Installation, bspw. "Meine Makros>Standard") stehen.
Die CSV-Datei, die eingelesen wird, muss die gleiche Struktur haben wie die Datenbanktabelle, deren Datenbereich es zu füllen gilt.

Da Du nicht die gleiche Zieltabelle hast - nützt Dir auch meine Testdaten.csv nichts.

ich stelle meinen Testdatensatz trotzdem mal hier hin:

Code: Alles auswählen

1,Harry Hübsch,Am Höfchen 1,55116 Mainz,2008-01-31 12:34:56,2008-01-31
2,Wilma Wandern,Weintorstr. 2,55118 Mainz,2008-01-31 12:34:56,2008-01-31
3,Fred D. Feuerstein,Frauenlobstrasse 6,55116 Mainz,2008-01-31 12:34:56,2008-01-31
4,J. Gutenberg-Universität_1,Fachbereich 04 Medizin,55099 Mainz,2008-01-31 12:34:56,2008-01-31
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)
mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Re: csv in datenbank schreiben per sql befehl

Beitrag von mike6 »

Hallo Winfried,

erst einmal vielen Dank für die Hilfe.
Das Makro bleibt bei:

Code: Alles auswählen

oDatenquelle = oDBKontext.getByName( "MySQL" )
hängen.

Meine Datenbank lautet test_datenbank.odb und ist unter
/net/nfs.xyz/space/export/home/mustermann/
angemeldet.



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

Re: csv in datenbank schreiben per sql befehl

Beitrag von komma4 »

die Stelle ist der Name der registrierten Datenquelle (nicht der Name der Base-Datei!), also was als Name im Datasourcebrowser erscheint, wenn Du F4 drückst
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)
Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Re: csv in datenbank schreiben per sql befehl

Beitrag von Gabriel123 »

Ich habe nun alles noch einmal versucht aber immer wieder mit der gleichen Fehlermeldung. Gibt es nicht einen weg über insert into oder ähnliches? Irgendwie finde ich dazu keine Literatur online=(
Antworten