# Über WinCC flexibel 2005 eine Datenbank bei MYSQL erstellen



## BMW (4 Juni 2009)

Hallo Leute,
ich habe folgendes Problem und hoffe auf eure Hilfe.
Ich soll über VBS Skripte auf einen MYSQL Server zugreifen und dort eine Datenbank erstellen. Ich benutze WinnCC flexible 2005 Standard. Der MYSQl Server ist 5.0. Als Datenquelle habe ich MYSQL ODBC Driver 3.51 angelegt.
Im MYSQL ODBC Driver 3.51 (in der Datenquelle) sind folgende Werte festgelegt: Server = localhost; User = root; Password = pactec; Port =3306; DataSourceName = WinCCflexible.

Ich starte das Skript über einen Button. 
Der Inhalt meines Skriptes sieht wie folgt aus:

On Error Resume Next ' aktiviert die Fehlerbehebung bei Laufzeitfehlern
Dim dbuser, dbpw, conn, rst, server, port 
Dim strConnectString
Dim table
dbuser = "root"
dbpw = "pactec"
server = "localhost"
Set conn = CreateObject("ADODB.Connection") ' Verbindung zur Datenquelle herstellen
Set rst = CreateObject("ADODB.Recordset") 'Datenbanken oder Tabellen anlegen, verändern oder löschen 
' Öffnen der Datenquelle über methode "open" der Objektvariablen (hier conn) 
strConnectString = "DRIVER={MySQL ODBC 3.51 Driver};"_
& "SERVER=" & server & ";"_
& "UID=" & dbuser & "; PWD=" & dbpw &"; OPTION=3" 
conn.Open strConnectString
table = "CREATE DATABASE" & db_test 
Set rst = conn.Execute(table)
conn.Close

Ich erhalte beim Überprüfen des Skriptes immer eine Fehlermeldung an der Stelle wo steht & db_test. (also beim Erstellen der Datenbank)
db_test soll der Name der Datenbank sein.
Was ist an dieser Anweisung fehlerhaft?Steckt noch irgendwo ein Fehler im Skript?


----------



## Human (4 Juni 2009)

Ich würde noch ein Leerzeichen nach DATABASE machen also


```
table = "CREATE DATABASE " + db_test
```
 
und irgendwo oben noch ein


```
dim db_test
```
 
und darunter irgendwo


```
db_test = "Name_der_Datenbank"
```


----------



## BMW (4 Juni 2009)

Danke für die schnelle Antwort. Deine Ideen waren Gold Wert. Das Leerzeichen hinter Create Database ist zwingend erforderlich. Und den Namen der Datenbank dann noch in eine Variable zu schreiben hat zum Erfolg geführt. Danke


----------



## bastimeister (4 Juni 2009)

Hallo BMW,

Da ich mich selbst gerade mit diesem Thema befassen, wollt ich dir mal nen Link zu meinem Beitrag zu dem Thema reinstellen:

http://www.sps-forum.de/showthread.php?t=27744&page=2

vieleicht kannst du mich ja auch an deinen Erfahrungen teilhaben lassen und mir was dazu schreiben....

Ich hätte noch einen ganz interessanten Link vom Siemens-Support für dich, der dir sicher weiterhilft:

http://support.automation.siemens.c...=WW&load=content&csQuery0=SQL&subtype= 133000

Ich wünsche viel erfolg beim DB-Zugriff und hoffe ich konnte auch ein bisschen helfen...


----------



## BMW (9 Juni 2009)

Hallo Leute ich bins nochmal,

nachdem ich mitlerweile ein gutes Stück voran gekommen bin, hänge ich nun beim nächsten Problem. Ich möchte eine Textdatei in eine Tabelle einfügen. Wenn ich den Befehl direkt bei MYSQL eingebe wird er auch ausgeführt. Leider aber nicht über WinCC und mein Script.

Statement bei Mysql: load data infile "C:/mit.txt" into table kollegen;

Script:

On Error Resume Next ' aktiviert die Fehlerbehebung bei Laufzeitfehlern
Dim conn, rst, datenquel, schreib, datei, pfad
Dim dbuser, dbpw,server, db_test, tabelle

dbuser = "root"
dbpw = "pactec"
server = "localhost"
db_test = "mitarbeiter" 'Name der Datenbank
tabelle = "kollegen"
pfad = "C:/mit.txt"

Set conn = CreateObject("ADODB.Connection")
Set  rst = CreateObject("ADODB.Recordset") 

datenquel = "DRIVER={MySQL ODBC 3.51 Driver};"_
                                      & "SERVER=" & server & ";"_
                                      & "DATABASE=" & db_test & ";"_
                                      & "UID=" & dbuser & "; PWD=" & dbpw &"; OPTION=3" 

conn.Open datenquel
schreib = "load data infile " + pfad & "into table " + tabelle
Set rst = conn.Execute(schreib)
conn.close


Ich habe schon tausend Sachen ausprobiert, z.B. das Versetzen von Leerzeichen,... 
Ich kann irgendwie keinen Fehler finden.
Vielen Dank schon mal für eure Hilfe


----------



## Human (9 Juni 2009)

Da gibt es ein Tool für MySQL das heißt MySQL-Query Browser (oder phpMyAdmin gäbe es da auch noch brauchst aber einen Webserver mit PHP auf der Maschine).

Geh doch dort einfach mal hin und schreibe dein Statement OHNE Variablen rein und führe es aus, das gibt dann auch zum Gegensatz zu Flex eine Fehlermeldung heraus.


```
load data infile C:\mit.txt into table kollegen
```
 
Wenn du das dann mal hast dann kannst du ja mal in Flexible kopieren und deine Variablen einstzen:


```
schreibe = "load data infile " + pfad + " into table " + tabelle
```
 
Ob der Befehl so funktioniert kann ich dir leider nicht sagen, da ich den ehrlichgesagt nicht kenne!


----------



## BMW (9 Juni 2009)

Erstmal vielen Dank,
ich arbeitet mittlerweile auch schon mit phpmyadmin und dort funktioniert mein Befehl. Wir wollen diese Befehle aber auch über WinnCC und Scripten abdecken, da nicht jeder Zugang zu einem Rechner bekommen soll. Der Bediener soll am OPxxx nur ein Paar Tasten im Display drücken und dann soll das Script ausgeführt werden.
Ich weiß das ist umständlich und kompliziert, aber es muss machbar sein.

Habe deine Tipps ausprobiert, das Ergebnis ist das selbe wie vorher, also weiter experimentieren. Trotzdem danke.


----------



## Human (9 Juni 2009)

Ist vielleicht dein Server auf einem anderen Rechner oder ist der lokal auf dem Rechner mit dem Programm?


----------



## BMW (9 Juni 2009)

Der Server ist lokal auf meinem Rechner.
Ich glaube das liegt aber nicht am Server, da alle meine anderen Befehle (Datenbank erstellen, löschen, Tabelle erstellen, löschen, Datensätze updaten) funktionieren/ausgeführt werden, die ich in WinCC flexible schreibe.


----------



## Human (9 Juni 2009)

Ich mein nur wegen der Datei, ich neheme mal an, dass der Server die nicht von dem Clientrechner holt sondern vom Serverrechner, aber wenn das das gleiche ist, dann sollte das eigentlich funktionieren!


----------



## BMW (9 Juni 2009)

Das läuft alles auf einem Rechner. Habe mir neben WinCC flexible das Paket XAMPP 1.7.1 (von Apache) installiert. Das enthält den Webserver, PHP, MYSQL und phpmyAdmin. Ich kann also alles nachverfolgen, über phpmyAdmin, was in der Datenbank gerade los ist, so dass ich immer auf dem aktuellsten Stand bin, was die von mir veränderte Datenbank (über WinCC) angeht.
Wie schon gesagt, es müsste eigentlich funktionieren.


----------



## Human (9 Juni 2009)

```
schreib = "load data infile " + pfad & "into table " + tabelle
```
 
Kann es sein, dass vielleicht nach 'pfad & "' anstatt dem i zuerst ein Leerzeichen kommen sollte? 

[EDIT]
Könntest dir wenn Flexible nichts macht auch eine kleine Anzeige machen, die letzte SQL-Anfrage zeigt:

Zuerst in der Variablenliste ein interne Variable anlegen vom Typ String.
Dann ein Ausgabefeld auf dein Bedienpult, das den Inhalt von der Stringvariable anzeigt
Und zu guter letzt das noch in dem Script einbinden:


```
conn.Open datenquel
schreib = "load data infile " + pfad & " into table " + tabelle
SmartTags("neueStringVariable") = schreib
Set rst = conn.Execute(schreib)
conn.close
```
 
Dann siehst du gleich was da schiefgelaufen ist oder kannst es zumindest nachvollziehen indem du das dann in phpMyAdmin kopierst und dir das dann eine Fehlermeldung ausgibt!
[/EDIT]


----------



## BMW (10 Juni 2009)

Dank deiner Tipps funktioniert es jetzt endlich :-D, erstmal ein fettes Dankeschön.
Was habe ich gemacht. Habe deinen Vorschlag mit der Variable vom Typ String angewandt. Habe dadurch gesehen, das ein Leerzeichen vor into table erforderlich war (hattest du auch schon erwähnt). Dann sah ich außerdem das es ein Fehler bei der Pfadangabe gab.

pfad = "C:/mit.txt" -> deklaration der Variablen -> beim Verwenden der Variablen wurde dann ja nur C:/mit.txt eingesetzt. Gefordert wird aber "C:/mit.txt" oder 'C:/mit.txt'. -> habe dann folgendes geschrieben: 
pfad = "'C:/mit.txt'" (Anführungszeichen(") gefolgt von einem Hochstrich(')+pfad+Hochstrich(') gefolgt von Anführungszeichen("))
Was aber nicht geht ist so etwas: ""C:/mit.txt"" (doppelte Anführungszeichen), da auf den Inhalt zwischen den Anführungszeichen geschaut wird und der hierbei leer ist -> C:/mit.txt wird dann als unbekannt ausgewiesen.

Hier abschließend nochmal der aktuelle Quelltext:

On Error Resume Next ' aktiviert die Fehlerbehebung bei Laufzeitfehlern
Dim conn, rst, datenquel, schreib, datei, pfad
Dim dbuser, dbpw,server, db_test, tabelle

dbuser = "root"
dbpw = "pactec"
server = "localhost"
db_test = "mitarbeiter" 'Name der Datenbank
tabelle = "kollegen"
pfad = "'C:/mit.txt'" 

Set conn = CreateObject("ADODB.Connection")
Set  rst = CreateObject("ADODB.Recordset") 

datenquel = "DRIVER={MySQL ODBC 3.51 Driver};"_
                                      & "SERVER=" & server & ";"_
                                      & "DATABASE=" & db_test & ";"_
                                      & "UID=" & dbuser & "; PWD=" & dbpw &"; OPTION=3" 

conn.Open datenquel
schreib = "load data infile " + pfad & " into table " + tabelle
SmartTags("test") = schreib 
Set rst = conn.Execute(schreib)
conn.close


----------



## Human (10 Juni 2009)

Hab da noch zwei kleine Kleinigkeiten:



> ```
> pfad = "'C:/mit.txt'"
> ...
> schreib = "load data infile " + pfad & " into table " + tabelle
> ```


 
Bei Pfadangaben wird unter Windows normalerweise ein Backslash genommen und warum schreibst du die Hochkommas in deine Variable hinein, das musst du falls du das mal dynamisch machst jedes Mal auf's Neue hineinschreiben, warum nicht dort hin wo sie hingehören?


```
pfad = "C:\mit.txt" 
...
schreib = "load data infile '" + pfad & "' into table " + tabelle
```


----------



## BMW (10 Juni 2009)

Bemerkungen zu den Kleinigkeiten.

Es stimmt das für die Pfadangabe bei Windows ein Backslash verwendet wird, doch bei MYSQL muss es ein Slash sein (ist von MysYSQL so vorgegeben, funktioniert mit Backslash nicht).

An das dynamische hatte ich noch nicht gedacht. Ich war erstmal froh, dass es funktioniert. Werde es jetzt aber dynamisch machen. 
Nochmals vielen Dank für deine Hilfe.


----------

