Seite 1 von 3

csv in datenbank schreiben per sql befehl

Verfasst: Do, 31.01.2008 15:38
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!!

Re: csv in datenbank schreiben per sql befehl

Verfasst: Do, 31.01.2008 15:41
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?

Re: csv in datenbank schreiben per sql befehl

Verfasst: Do, 07.02.2008 14:54
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 )

Re: csv in datenbank schreiben per sql befehl

Verfasst: Do, 07.02.2008 16:53
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?)

Re: csv in datenbank schreiben per sql befehl

Verfasst: Fr, 08.02.2008 13:17
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...

Re: csv in datenbank schreiben per sql befehl

Verfasst: Fr, 08.02.2008 14:07
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?

Re: csv in datenbank schreiben per sql befehl

Verfasst: Fr, 08.02.2008 14:18
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].

Re: csv in datenbank schreiben per sql befehl

Verfasst: Fr, 08.02.2008 14:39
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 ','"

Re: csv in datenbank schreiben per sql befehl

Verfasst: Fr, 08.02.2008 15:35
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=)

Re: csv in datenbank schreiben per sql befehl

Verfasst: Fr, 08.02.2008 15:51
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....

Re: csv in datenbank schreiben per sql befehl

Verfasst: Di, 12.02.2008 07:46
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

Re: csv in datenbank schreiben per sql befehl

Verfasst: Di, 12.02.2008 08:43
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

Re: csv in datenbank schreiben per sql befehl

Verfasst: Di, 12.02.2008 09:04
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

Re: csv in datenbank schreiben per sql befehl

Verfasst: Di, 12.02.2008 09:15
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

Re: csv in datenbank schreiben per sql befehl

Verfasst: Mi, 13.02.2008 15:35
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=(