MySql Tabelle aktualisieren

SQL Express von Boris Borzic

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

MySql Tabelle aktualisieren

Beitrag von Wolfgang Ciriack »

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.
Viele Grüße
Wolfgang
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8250
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 10 Mal
Danksagung erhalten: 41 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von Tom »

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):

Code: Alles auswählen

cConnectString := "DBQ="+<Datenbankname>+";DSN="+<DSN-Name>+";UID="+<Benutzername>+";PWD="+<Passwort>
Mit dem konnektierst Du zum Server:

Code: Alles auswählen

oConnection := SqlConnection():New()
oConnection:DriverConnect(NIL,cConnectString)
Dann baust Du Deine Statements ("UPDATE ... WHERE ...") und sendest sie an den Server:

Code: Alles auswählen

oStatement := oConnection:NewStatement()
oStatement:SQLString := <STATEMENT>
oStatement:Execute()
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.
Herzlich,
Tom
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von Wolfgang Ciriack »

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 :D
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15306
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 19 Mal
Danksagung erhalten: 8 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von brandelh »

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

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
Mein Exportprogramm von DBF nach MySQL mit sehr vielen Datensätzen ...

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
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von Wolfgang Ciriack »

Danke Hubert, werde das in aller Ruhe demnächst studieren.
Viele Grüße
Wolfgang
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von Wolfgang Ciriack »

Hm, scheint so, dass Strato keinen Zugriff von außen über ODBC erlaubt ?
Gibt es eine andere Möglichkeit des Zugriffs ?
Viele Grüße
Wolfgang
Dominik Krebs
UDF-Programmierer
UDF-Programmierer
Beiträge: 55
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 1 Mal

Re: MySql Tabelle aktualisieren

Beitrag von Dominik Krebs »

Hallo Wolfgang,
ist denn der Datenbank Nutzer für Zugriffe von außen freigegeben?
Gruß Dominik
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von Wolfgang Ciriack »

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:
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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2685
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 19 Mal
Danksagung erhalten: 1 Mal

Re: MySql Tabelle aktualisieren

Beitrag von georg »

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:
putty-tunnel.png
putty-tunnel.png (15.54 KiB) 1104 mal betrachtet
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von Wolfgang Ciriack »

Danke, Georg, werde ich morgen mal ausprobieren.
Viele Grüße
Wolfgang
Benutzeravatar
nightcrawler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 400
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 19 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von nightcrawler »

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/
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von Wolfgang Ciriack »

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.
Viele Grüße
Wolfgang
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1926
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 3 Mal
Danksagung erhalten: 12 Mal

Re: MySql Tabelle aktualisieren

Beitrag von ramses »

Hallo Wolfgang

kannst du den kein VPN Zugang zu deinem Server aufbauen? Darüber hättest du Zugriff.
Valar Morghulis

Gruss Carlo
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 884
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 4 Mal

Re: MySql Tabelle aktualisieren

Beitrag von HaPe »

Hallo Rames !
Muss ich erst beim Kunden nachfragen, habe nur die MySQL Zugangsdaten.
kannst du den kein VPN Zugang zu deinem Server aufbauen? Darüber hättest du Zugriff.
Das ist ja nicht sein Server sondern der des Kunden :wink:
--
Hans-Peter

Organisator der XUG Stuttgart
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1926
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 3 Mal
Danksagung erhalten: 12 Mal

Re: MySql Tabelle aktualisieren

Beitrag von ramses »

HaPe hat geschrieben: Mo, 19. Okt 2020 10:59 Das ist ja nicht sein Server sondern der des Kunden :wink:
Hallo Hans-Peter

ja, das dachte ich mir schon.
Genau in solchen Fälle verwenden wir immer VPN Verbindungen.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: MySql Tabelle aktualisieren

Beitrag von Wolfgang Ciriack »

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 :D
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
Antworten