Alaska Software Inc. - ODBC / MySQL / MsSQL
Username: Password:
AuthorTopic: ODBC / MySQL / MsSQL
Gerd BaumgartenODBC / MySQL / MsSQL
on Fri, 05 Dec 2014 14:22:31 +0100
Hi,

für einen WebShop Connect muss ich mich mit einem MySQL Server 
verbinden. Leider klappt das nicht so richtig. Anbei mein ODBC 
Testprogramm. Mit dem MsSQL Server funktioniert das Programm. Mit dem 
MySQL Server (entsprechenden ODBC-Connect String aktivieren) klappt es 
nicht.

Es gibt probleme bei dbcreate(), Feldinhalte zu schreiben etc. Es klappt 
allerdings Felder zu lesen, reccount() u.a.

Wie ist denn der Stand mit MySQL?
Gibt es eine Möglichkeit anders vorzugehen?

Grüße






#include "pgdbe.ch"
#include "odbcdbe.ch"

#pragma library( "xbtbase1.lib" )
#pragma library( "xbtbase2.lib" )

PROCEDURE Main
   local aDbStruct   := {}
   LOCAL cConnect, cField
   local nI, nSeconds
   LOCAL oSessionPG, oSessionODBC

   ? "ODBC Testprogramm"
   ?

    Load the PostgreSQL DatabaseEngine
   IF(!DbeLoad("pgdbe"))
     Alert( "Unable to load the PostgreSQL DatabaseEngine", {"Quit"} )
     QUIT
   ENDIF
   ? "PGDBE geladen"

    Establish the PostgreSQL connection
   cConnect   := 
"DBE=pgdbe;SERVER=localhost;DB=zoom_msp-it;UID=postgres;PWD=postgres"
    cConnect   := 
"DBE=pgdbe;SERVER=localhost;DB=zoom_caf_pg;UID=postgres;PWD=postgres"
   oSessionPG := DacSession():New( cConnect )

    Check for connection success
   IF oSessionPG:isConnected()
       ? "PGDBE Verbindung hergestellt"

   else
     ? oSessionPG:GetLastMessage()
     Alert( "Unable to establish connection to PostgreSQL server", 
{"Quit"} )
     QUIT
   ENDIF

   ? "Tabelle anlegen"

   nCols    := abs( 512 / 3 )

   ? "Spalten               : " + str( nCols, 4 )

   for nI := 1 to nCols
     aadd( aDbStruct, { "STRING" + right( "0000" + ltrim( str( nI, 4 ) 
), 4 ), "M", 10, 0 } )
     aadd( aDbStruct, { "NUMBER" + right( "0000" + ltrim( str( nI, 4 ) 
), 4 ), "N", 10, 3 } )
     aadd( aDbStruct, { "MEMO"   + right( "0000" + ltrim( str( nI, 4 ) 
), 4 ), "M", 0, 0 } )
   next

   dbcreate( "test", aDbStruct, oSessionPG )

   ? "Tabelle ”ffnen"

   dbusearea( .t., oSessionPG, "test" )

   nRows    := 1024
   ? "Zeilen                : " + str( nRows, 4 )

   nSeconds := seconds()
   ? "Startzeit             : " + time()

    Zeilen bzw. Datens„tze
   for nI := 1 to nRows
     dispoutat( row() +2,  0, repl( chr( 219 ), abs( nI * 79 / nRows ) 
+1 ) )
     dbappend()

      Spalten
     for nJ := 1 to nCols
       fieldput( fieldpos( "STRING" + right( "0000" + ltrim( str( nJ, 4 
) ), 4 ) ), "Testtext12" )
       fieldput( fieldpos( "NUMBER" + right( "0000" + ltrim( str( nJ, 4 
) ), 4 ) ), 123.123 )
       fieldput( fieldpos( "MEMO"   + right( "0000" + ltrim( str( nJ, 4 
) ), 4 ) ), "Testtext12" )
     next

   next

   dispoutat( row() +2, 0, space( 255 ) )
   dispoutat( row() +3, 0, space( 255 ) )

   ? "Endzeit               : " + time()
   ? "Zeitdauer in Sekunden : " + str( seconds() - nSeconds )
   ? "Zeitdauer pro Zeile   : " + str( ( seconds() - nSeconds ) / nCols )

   ?

    Load the ODBC DatabaseEngine
   IF(!DbeLoad("odbcdbe"))
     Alert( "Unable to load the ODBC DatabaseEngine", {"Quit"} )
     QUIT
   ENDIF
   ? "ODBCDBE geladen"

    Establish the ODBC connection
   cConnect     := "DBE=odbcdbe; "                            + ;
                   "DRIVER={SQL Server Native Client 11.0}; " + ;
                   "Server=localhost; "                       + ;
                   "Database=zoom_msp-it; "                   + ;
                   "UID=mssql; "                              + ;
                   "PWD=mssql;"

  cConnect     := "DBE=odbcdbe; "                    + ;
                  "Driver={MySQL ODBC 5.1 Driver}; " + ;
                  "Server=192.168.10.1; "            + ;
                  "Port=3306; "                      + ;
                  "Database=dema; "                  + ;
                  "User=dema; "                      + ;
                  "Password=dema;"

   oSessionODBC := DacSession():New( cConnect )

    Check for connection success
   IF oSessionODBC:isConnected()
     ? "ODBCDBE Verbindung hergestellt"

   else
     ? oSessionODBC:GetLastMessage()
     Alert( "Unable to establish connection to ODBC server", {"Quit"} )
     QUIT
   ENDIF

   ? "Tabelle anlegen"

   nCols    := abs( 512 / 3 )

   ? "Spalten               : " + str( nCols, 4 )

   for nI := 1 to nCols
     aadd( aDbStruct, { "STRING" + right( "0000" + ltrim( str( nI, 4 ) 
), 4 ), "M", 10, 0 } )
     aadd( aDbStruct, { "NUMBER" + right( "0000" + ltrim( str( nI, 4 ) 
), 4 ), "N", 10, 3 } )
     aadd( aDbStruct, { "MEMO"   + right( "0000" + ltrim( str( nI, 4 ) 
), 4 ), "M", 0, 0 } )
   next

   dbcreate( "test", aDbStruct, oSessionODBC )

   ? "Tabelle ”ffnen"

   dbusearea( .t., oSessionODBC, "test" )

   nRows    := 1024
   ? "Zeilen                : " + str( nRows, 4 )

   nSeconds := seconds()
   ? "Startzeit             : " + time()

    Zeilen bzw. Datens„tze
   for nI := 1 to nRows
     dispoutat( row() +2,  0, repl( chr( 219 ), abs( nI * 79 / nRows ) 
+1 ) )
     dbappend()

      Spalten
     for nJ := 1 to nCols
       fieldput( fieldpos( "STRING" + right( "0000" + ltrim( str( nJ, 4 
) ), 4 ) ), "Testtext mit 20 Zeichen" )
       fieldput( fieldpos( "NUMBER" + right( "0000" + ltrim( str( nJ, 4 
) ), 4 ) ), 123.123 )
       fieldput( fieldpos( "MEMO"   + right( "0000" + ltrim( str( nJ, 4 
) ), 4 ) ), "Testtext mit 20 Zeichen" )
     next

   next

   dispoutat( row() +2, 0, space( 255 ) )
   dispoutat( row() +3, 0, space( 255 ) )

   ? "Endzeit               : " + time()
   ? "Zeitdauer in Sekunden : " + str( seconds() - nSeconds )
   ? "Zeitdauer pro Zeile   : " + str( ( seconds() - nSeconds ) / nCols )

    Disconnect from server
   oSessionODBC:disconnect()
   oSessionPG:disconnect()

   ?

RETURN
Hubert BrandelRe: ODBC / MySQL / MsSQL
on Mon, 08 Dec 2014 10:18:54 +0100
Am 05.12.2014 14:22, schrieb Gerd Baumgarten:

> MySQL Server (entsprechenden ODBC-Connect String aktivieren) klappt es
> nicht.
>   cConnect     := "DBE=odbcdbe; "                    + ;
>                   "Driver={MySQL ODBC 5.1 Driver}; " + ;
>                   "Server=192.168.10.1; "            + ;
>                   "Port=3306; "                      + ;
>                   "Database=dema; "                  + ;
>                   "User=dema; "                      + ;
>                   "Password=dema;"

als ich meinen MySQL server zuletzt aktualisiert habe, hatte ich ein 
Problem mit den 5.x ODBC Treibern, da sie UNICODE Daten wollten.
Nach der ersten Verwirrung kamen dann neue Versionen und die ANSI 
Version hat ein "A" oder "Ansi" im Namen.

Xbase++ benötigt die ANSI Version !
Gerd BaumgartenRe: ODBC / MySQL / MsSQL
on Mon, 08 Dec 2014 10:29:28 +0100
Danke für die Hilfe.

Der MySQL-ODBC-Treiber 5.1 hat keine Unterscheidung, der in der Version 
5.3 sehr wohl. Mit der ANSI Version kann ich die Daten sehen, ein 
browse() verhält sich leicht komisch. Wenn man die Sätze rauf und runter 
geht, so bekomme ich den 1. Satz öfter angezeigt und kann nicht mehr auf 
den letzten Satz stellen.

Ein Update eines Feldes bringt: Internal data structures corrupted


Grüße

On 08.12.14 10:18, "Hubert Brandel" wrote:
> Am 05.12.2014 14:22, schrieb Gerd Baumgarten:
>
>> MySQL Server (entsprechenden ODBC-Connect String aktivieren) klappt es
>> nicht.
>>   cConnect     := "DBE=odbcdbe; "                    + ;
>>                   "Driver={MySQL ODBC 5.1 Driver}; " + ;
>>                   "Server=192.168.10.1; "            + ;
>>                   "Port=3306; "                      + ;
>>                   "Database=dema; "                  + ;
>>                   "User=dema; "                      + ;
>>                   "Password=dema;"
>
> als ich meinen MySQL server zuletzt aktualisiert habe, hatte ich ein
> Problem mit den 5.x ODBC Treibern, da sie UNICODE Daten wollten.
> Nach der ersten Verwirrung kamen dann neue Versionen und die ANSI
> Version hat ein "A" oder "Ansi" im Namen.
>
> Xbase++ benötigt die ANSI Version !
>
Hubert BrandelRe: ODBC / MySQL / MsSQL
on Tue, 09 Dec 2014 09:35:19 +0100
Am 08.12.2014 10:29, schrieb Gerd Baumgarten:> Der MySQL-ODBC-Treiber 
5.1 hat keine Unterscheidung, der in der Version
 > 5.3 sehr wohl.

Hat der aber auch ANSI oder nur stillschweigend UNICODE ?

Ich kann mich nur erinnern, dass ich Anfangs den 3.x weiter nutzen 
musste um noch was zu sehen (meine Programmanmeldung lief auch auf die 
sql Datenbank und natürlich war das Kennwort nicht gleich  )

Ich nutzte daher Anfangs den 3.x weiter, danach dann den passenden 5.x 
Ansi.

 > browse() verhält sich leicht komisch. Wenn man die Sätze rauf und runter
 > geht, so bekomme ich den 1. Satz öfter angezeigt und kann nicht mehr auf
 > den letzten Satz stellen.

die Browser gehen davon aus, dass es einen EOF() Satz gibt, den gibt es 
bei SQL Servern nicht, außerdem verhalten sich die Resultsets sehr 
unterschiedlich, daher lese ich alles in Arrays ein und zeige die an 
(eventuell begrenzt auf einige Hundert Zeilen).

 > Ein Update eines Feldes bringt: Internal data structures corrupted
 > 

Internal Error ist eindeutig ein "unerwarteter Fehler im Xbase++ / 
ODBCDBE Code ...
Ich habe vor Jahren mit der ODBCDBE experimentiert und für mich ein für 
alle mal !!! festgelegt, dass SQLexpress() die richtige Zugriffsmethode 
ist 

Ich persönlich will über Objekte zugreifen und keine Nebenwirkungen mit 
alten Clipper Befehlen ... auch wenn das Alaska anders sieht.