MySql Tabelle aktualisieren
Moderator: Moderatoren
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
MySql Tabelle aktualisieren
Hallo,
Bisher schreibe ich aus einem Dienst alle paar Minuten Daten in eine lokale CSV-Datei.
Dieses soll jetzt geändert werden, indem ich aus diesem Dienst die Daten ständig direkt in einer SQL-Tabelle auf einem bei Strato laufendem Server aktualisiere.
Frage: Wie baue ich die Verbindung zum Server auf und wie aktualisiere ich immer die gleichen 3 Datensätze ?
SQLExpress ist vorhanden.
Bisher schreibe ich aus einem Dienst alle paar Minuten Daten in eine lokale CSV-Datei.
Dieses soll jetzt geändert werden, indem ich aus diesem Dienst die Daten ständig direkt in einer SQL-Tabelle auf einem bei Strato laufendem Server aktualisiere.
Frage: Wie baue ich die Verbindung zum Server auf und wie aktualisiere ich immer die gleichen 3 Datensätze ?
SQLExpress ist vorhanden.
Viele Grüße
Wolfgang
Wolfgang
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Hallo, Wolfgang.
Du brauchst ein DSN (ODBCAD32.EXE) für den SQL-Server, das auf den installierten Server verweist und die ODBC-Treiber für MySQL nutzt (dürfte standardmäßig vorhanden sein). Über dieses DSN und die entsprechenden Zugangsdaten erzeugst Du eine Connection, die einen Connection-String verwendet, der ungefähr so aussieht ("DSN-Name" ist dann der Name des DSN, das Du mit ODBCAD32 angelegt hast):
Mit dem konnektierst Du zum Server:
Dann baust Du Deine Statements ("UPDATE ... WHERE ...") und sendest sie an den Server:
Wie das Statement genau auszusehen hat, hängt davon ab, welche Spalten Du nach welchen Kriterien wie zu befüllen hast. Es wäre aber in jedem Fall ein Update-Statement.
Du brauchst ein DSN (ODBCAD32.EXE) für den SQL-Server, das auf den installierten Server verweist und die ODBC-Treiber für MySQL nutzt (dürfte standardmäßig vorhanden sein). Über dieses DSN und die entsprechenden Zugangsdaten erzeugst Du eine Connection, die einen Connection-String verwendet, der ungefähr so aussieht ("DSN-Name" ist dann der Name des DSN, das Du mit ODBCAD32 angelegt hast):
Code: Alles auswählen
cConnectString := "DBQ="+<Datenbankname>+";DSN="+<DSN-Name>+";UID="+<Benutzername>+";PWD="+<Passwort>
Code: Alles auswählen
oConnection := SqlConnection():New()
oConnection:DriverConnect(NIL,cConnectString)
Code: Alles auswählen
oStatement := oConnection:NewStatement()
oStatement:SQLString := <STATEMENT>
oStatement:Execute()
Herzlich,
Tom
Tom
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Danke Tom, werde ich mich demnächst mit beschäftigen. Da habe ich aber erst einmal einen Ansatz. Danke.
Komme vermutlich nochmal darauf zurück
Komme vermutlich nochmal darauf zurück
Viele Grüße
Wolfgang
Wolfgang
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Man kann auch direkt über den MySQL Treiber gehen, wobei es neuerdings da zwei Versionen gibt A = Ansi (den wollen wir) und einen für Unicode.
Der Vorteil ist, dass man den einzelnen Rechner nicht angreifen muss, dafür kann man beim ODBC Manager sicher sein, wenn er durch geht stimmt die Verbindung grundsätzlich.
Dieser Code sucht nach dem Treiber, aus der Liste kannst du dir dann den richtigen suchen oder per Cut & Paste suchen ... ich meine das war dabei im SQLXpp Verzeichnis
Mein Exportprogramm von DBF nach MySQL mit sehr vielen Datensätzen ...
Der Vorteil ist, dass man den einzelnen Rechner nicht angreifen muss, dafür kann man beim ODBC Manager sicher sein, wenn er durch geht stimmt die Verbindung grundsätzlich.
Dieser Code sucht nach dem Treiber, aus der Liste kannst du dir dann den richtigen suchen oder per Cut & Paste suchen ... ich meine das war dabei im SQLXpp Verzeichnis
Code: Alles auswählen
#include "sql.ch"
#include "sqlext.ch"
#define CRLF chr(13)+chr(10)
procedure main()
local oConn, x:=0
set alternate to ListDriver.txt
set alternate on
cls
? "Treiber:"
?
oConn := SQLConnection():new()
aeval(oConn:GetDrivers(),{|aDriver|qout(++x,aDriver)})
wait
return
Code: Alles auswählen
#include "sql.ch"
#include "sqlext.ch"
#define CRLF chr(13)+chr(10)
procedure main()
local oConn,oStmt,oCursor,i,cConnectString
local cTxt1,cTxt2,nLen1,nLen2,cDatei := ""
local cStart,cStop,nStart,nDauer
local nMaxAnzahl := 3000000
local aStructure
local cFields := "RECNO INT not null primary key auto_increment,"
local cParameter,p
local cUser, cKennwort, cDNS
local getlist := {}
local nRecPerSek := 0
set charset to ansi // das ist sinnvoll.
set date german
set century on
set epoch to year(date())-80
set alternate to MySQLTest.txt
set alternate on
cls
cUser := "ODBC "
cKennwort := "odbc "
cDNS := " "
@1,1 say "User: " get cUser
@2,1 say "Kennwort: " get cKennwort color "R/R"
@3,1 say "DNS ?: " get cDNS picture "!" valid cDNS$"JN "
set cursor on
read
set cursor off
cUser := alltrim(cUser)
cKennwort := alltrim(cKennwort)
? "Einfügen von",nMaxAnzahl,"Datensätzen"
?
? "Zuerst die DBF Info lesen"
if .f. // file(cMeineDateiVorlage+".DBF")
use (cMeineDateiVorlage) alias MYDBF
aStructure := DbStruct()
* aeval(aStructure,{|aF|cFields += " "+strTran(aF[1],"_","")+" char("+ntrim(aF[3])+"), "})
aeval(aStructure,{|aF|cFields += " "+aF[1]+" char("+ntrim(aF[3])+") default ' ', "})
cFields := strTran(cFields,"ALTER","AGE") // Feldname ist in MySQL nicht erlaubt
cFields := left(cFields,len(cFields)-2)
close MYDBF
else
TEXT INTO cFields TRIMMED
RECNO INT not null primary key auto_increment,
IMP_DAT char(8),
......
InfoText char(10) ,
InfoDate char(8)
ENDTEXT
endif
if cDNS="J"
oConn := SQLConnection():new('MySQL', cUser, cKennwort) // entweder vorher definiert
else
oConn := SQLConnection():new() // oder aus den Treibern zusammen bauen
// neuere Treiber haben eine A Version : 'MySQL ODBC 8.0 ANSI Driver' so sehen die aus
cConnectString := "DRIVER=MySQL ODBC 3.51 Driver;SERVER=localhost;UID="+cUser+;
";PWD="+cKennwort+";DATABASE=test"
oConn:displayErrors := .t.
oConn:driverConnect(nil, @cConnectString,SQL_DRIVER_COMPLETE)
endif
if oConn:isConnected
? "Connected, nun DROP TABLE"
oStmt := oConn:NewStatement()
oStmt:DisplayErrors := .t.
oStmt:SQLString := 'DROP TABLE MYDBF'
oStmt:Execute()
? "Nach DROP TABLE"
wait
oStmt:SQLString := 'CREATE TABLE MYDBF ('+cFields+')'
nStart := seconds()
cStart := time()
cls
? "INSERT starten"
? "Startzeit", cStart
set cons off
@20,1 say "aktuell:"
if oStmt:Execute() != SQL_XPP_ERROR
* oStmt:Prepare()
for i := 1 to nMaxAnzahl
@20,10 say i
cParameter := "('"+ntrim(i)+"-Start','Autor Hubert Müller')"
for p := 1 to 99
cParameter += ","+CRLF+"('"+ntrim(i)+"-"+ntrim(p)+"','Testzeile:"+ntrim(i+p)+"')"
next
oStmt:SQLString := "INSERT INTO MYDBF (..Felder...) VALUES "+cParameter
if oStmt:Execute() = SQL_XPP_ERROR
msgbox("Fehler beim Schreiben","Abbruch")
exit
endif
i += 99 // eines wird ja vom nächsten NEXT erhöht !
/* if right(ntrim(i),2)="00"
@20,10 say i
oStmt:Execute( LTrim(Str(i)), "Autor Hubertus Müller" )
else
? oStmt:Execute( LTrim(Str(i)), ntrim(i)+" äöü ß ÄÖÜ ^$§&/", "Test","INFO" )
endif
*/
next
set cons on
cStop := time()
nDauer := (seconds()-nStart)/60
nRecPerSek := nMaxAnzahl/(nDauer*60)
? "EndeZeit:",cStop," Dauer:",nDauer,"Minuten",nRecPerSek,"Rec/Sek."
else
? "Fehler bei CREATE TABLE: MYDBF"
msgbox(oStmt:errorMessage+chr(13)+chr(10)+"Aufruf:"+chr(13)+chr(10)+'CREATE TABLE MYDBF ('+cFields+')',"ODCB - Fehlermeldung:")
endif
oStmt:Destroy()
// we don't need the statement object any more, so let's kill it
? "Here's the contents of the new table...."
// now create a cursor to 'browse' the new table...
? "Alle Datensätze Anfordern",time()
oCursor := oConn:Cursor("SELECT count(*) FROM MYDBF")
? "count: ",oCursor:Execute()," geladen ",time()
? time(),"Anzahl angelegter und nun geladener Datensätze",oCursor:RecCount()
? "LastRec():"+str(oCursor:FieldGet(1))
endif
? "disconnecting..."
?
? "Ladezeiten:"
? "von",cStart
? "bis",cStop
oConn:destroy() // this will also drop the cursor
keyboard ""
wait
return
function ntrim(nZahl)
return alltrim(str(nZahl))
Gruß
Hubert
Hubert
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Danke Hubert, werde das in aller Ruhe demnächst studieren.
Viele Grüße
Wolfgang
Wolfgang
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Hm, scheint so, dass Strato keinen Zugriff von außen über ODBC erlaubt ?
Gibt es eine andere Möglichkeit des Zugriffs ?
Gibt es eine andere Möglichkeit des Zugriffs ?
Viele Grüße
Wolfgang
Wolfgang
-
- Rekursionen-Architekt
- Beiträge: 205
- Registriert: Mo, 15. Apr 2019 16:19
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 4 Mal
Re: MySql Tabelle aktualisieren
Hallo Wolfgang,
ist denn der Datenbank Nutzer für Zugriffe von außen freigegeben?
ist denn der Datenbank Nutzer für Zugriffe von außen freigegeben?
Gruß Dominik
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Muss ich erst beim Kunden nachfragen, habe nur die MySQL Zugangsdaten.
Nachdem mit ODBCAD32 der Zugang nicht klappte, habe ich nur unter Strato die Beschränkungen gelesen:
Nachdem mit ODBCAD32 der Zugang nicht klappte, habe ich nur unter Strato die Beschränkungen gelesen:
Einschränkungen gibt es nur zu Ihrer eigenen Sicherheit: Aus Sicherheitsgründen können MySQL-Clients nur innerhalb des Netzwerks (SSH-Server, Webserver) auf die MySQL Datenbank zugreifen. Ein Zugriff per remote (also vom eigenen PC aus), z. B. per ODBC*, ist somit nicht möglich.
Viele Grüße
Wolfgang
Wolfgang
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 98 Mal
- Danksagung erhalten: 13 Mal
Re: MySql Tabelle aktualisieren
Hallo, Wolfgang -
wenn Du von extern Zugriff mittels putty hast, dann kann man das einrichten: man richtet in Putty ein Port Forwarding ein, z.B. den lokalen Port 12345 => 3306 auf dem Server. Dann trägst Du bei der Verbindung als Port 12345 ein. Wenn das Programm startet, sollte Putty aktiv sein und eine Verbindung zu dem Server bestehen. Dann kannst Du über diese Verbindung auf die MySQL-Datenbank zugreifen - ich mache das fast täglich.
Wenn das für Dich eine Option ist:
Unter Connection -> SSH -> Tunnels muss so ein Eintrag rein:
wenn Du von extern Zugriff mittels putty hast, dann kann man das einrichten: man richtet in Putty ein Port Forwarding ein, z.B. den lokalen Port 12345 => 3306 auf dem Server. Dann trägst Du bei der Verbindung als Port 12345 ein. Wenn das Programm startet, sollte Putty aktiv sein und eine Verbindung zu dem Server bestehen. Dann kannst Du über diese Verbindung auf die MySQL-Datenbank zugreifen - ich mache das fast täglich.
Wenn das für Dich eine Option ist:
Unter Connection -> SSH -> Tunnels muss so ein Eintrag rein:
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Danke, Georg, werde ich morgen mal ausprobieren.
Viele Grüße
Wolfgang
Wolfgang
- nightcrawler
- 1000 working lines a day
- Beiträge: 655
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 96 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
ansonsten bliebe Dir noch der Weg eines Webservices: Du schreibst (oder besorgst) Dir ein PHP Programm, welches die MySQL Schnittstelle nach außen entsprechend anbietet. Vergiss aber nicht die Sicherheit
Edit: Beispiel https://codinginfinite.com/restful-web- ... urce-code/
Edit: Beispiel https://codinginfinite.com/restful-web- ... urce-code/
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Hallo Joachim,
ja, ich denke, das ist der bessere Weg, wenn das aus meinem Dienst heraus passieren soll. So mache ich das auch schon mit anderen Daten.
Mit Putty ist das evtl. für einmaligen Zugriff ok, aber nicht, wenn das alle 5 Minuten erfolgen soll.
Werde mal sehen, dass mir jemand so ein php-Script erstellt.
ja, ich denke, das ist der bessere Weg, wenn das aus meinem Dienst heraus passieren soll. So mache ich das auch schon mit anderen Daten.
Mit Putty ist das evtl. für einmaligen Zugriff ok, aber nicht, wenn das alle 5 Minuten erfolgen soll.
Werde mal sehen, dass mir jemand so ein php-Script erstellt.
Viele Grüße
Wolfgang
Wolfgang
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: MySql Tabelle aktualisieren
Hallo Wolfgang
kannst du den kein VPN Zugang zu deinem Server aufbauen? Darüber hättest du Zugriff.
kannst du den kein VPN Zugang zu deinem Server aufbauen? Darüber hättest du Zugriff.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- HaPe
- 1000 working lines a day
- Beiträge: 996
- Registriert: So, 15. Nov 2015 17:44
- Wohnort: 71665 Vaihingen-Enz
- Hat sich bedankt: 17 Mal
- Danksagung erhalten: 15 Mal
Re: MySql Tabelle aktualisieren
Hallo Rames !
Muss ich erst beim Kunden nachfragen, habe nur die MySQL Zugangsdaten.
Das ist ja nicht sein Server sondern der des Kundenkannst du den kein VPN Zugang zu deinem Server aufbauen? Darüber hättest du Zugriff.
--
Hans-Peter
Hans-Peter
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: MySql Tabelle aktualisieren
Hallo Hans-Peter
ja, das dachte ich mir schon.
Genau in solchen Fälle verwenden wir immer VPN Verbindungen.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: MySql Tabelle aktualisieren
Vielen Dank erst mal für die vielen Vorschläge, ich muss das erst mal mit dem Kunden besprechen, ob er den Aufwand auch bezahlen möchte
Evtl. mache ich auch nur einen FTP-Upload, dann kann er mit den Daten in der Datei anstellen, was er möchte.
Evtl. mache ich auch nur einen FTP-Upload, dann kann er mit den Daten in der Datei anstellen, was er möchte.
Viele Grüße
Wolfgang
Wolfgang