Search  
Saturday, February 11, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Win32 API  VFP MySQL direc...
 VFP MySQL direct prin libmysql
 
 1/20/2009 1:56:12 PM
User is offlinerediac
9 posts


VFP MySQL direct prin libmysql
 (Bulgaria)
Daca intereseaza pe cineva, un alt fel de acces la un server MySQL se poate face folosind biblioteca libmysql.dll care vine cu mysql.... Avantaje ar fi rapiditatea si controlul asupra codului... de asemenea nu se mai fol ODBC sau OleDB...
 1/21/2009 9:51:08 AM
User is offlinerediac
9 posts


Re: VFP MySQL direct prin libmysql
 (Bulgaria)
Am pus postarea aici, pentru ca se folosesc functii API. In rest .... seamana cu PHP
 1/21/2009 9:32:48 PM
User is offlineGrigore Dolghin
3522 posts
www.class-software.eu
1st






Re: VFP MySQL direct prin libmysql
 (Romania)
Si un exemplu de cod ai la indemana? pentru ca sunt tare curios sa vad cum se face un cursor din rezultatul unei functii api....

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 1/22/2009 11:08:19 AM
User is offlinerediac
9 posts


Re: VFP MySQL direct prin libmysql
 (Bulgaria)
Uite un exemplu de cod (s-ar putea sa aiba unele greseli...l-am luat din niste proceduri... )
Mai intai precizez ca rezultatul intors de functia API trebuie prelucrat... e o mica procedura mysql2vfp_lib (acolo am explicitat cat am putut... si cat am avut timp )
Iata progr. principal (numit de mine mysql2vfp.prg - normal, fiecare il denumeste cum vrea el)

&& exemplu
SET PROCEDURE TO mysql2vfp_lib
DO DeclareDLL
*   MyID = - ID catre mysql
myID = 0
myID = mysql_init(myID)
If myID = 0
   MESSAGEBOX("Eroare initializare MySQL "+ myID)
   CLEAR DLLS
   RETURN
Endif
&& se introduc datele specifice
Host = "localhost"
User = "user"
Pass = "parola"
DB = "..."
Port = 3306
&& conectare MySQL
res = ConectMySQL(myID,Host, User, Pass, DB,Port)
IF res=0
    MESSAGEBOX("Eroare conectare MySQL")
    CLEAR DLLS
    RETURN
ENDIF

res = table2cursor(myID,'select * from vali','tabel')
IF res <> 0
   MESSAGEBOX("Eroare ...")
   CLEAR DLLS
   RETURN
Endif

*
=mysql_close (myID)
CLEAR DLLS
SET PROCEDURE TO
RETURN
****
Scriu in continuare si procedura:
&& declaratii

PROCEDURE DeclareDLL
Declare Integer mysql_init In libmySQL.Dll ;
Integer mID

Declare Integer mysql_store_result In libmySQL ;
INTEGER lMYSQL ;

Declare Integer mysql_num_fields In libmySQL ;
INTEGER nInt ;

Declare Integer mysql_fetch_fields In libmySQL ;
INTEGER nInt1 ;

Declare Integer mysql_num_rows In libmySQL ;
INTEGER nInt2 ;

Declare Integer mysql_fetch_row In libmySQL ;
INTEGER nInt3 ;

Declare Integer mysql_free_result In libmySQL ;
INTEGER nInt4;

declare integer mysql_fetch_lengths IN libmySQL ;
integer nInt5;

Declare Integer mysql_query In libmySQL ;
INTEGER lMYSQL, ;
STRING cString

Declare Integer mysql_real_connect In libmySQL ;
INTEGER lMYSQL, ;
STRING sHostName ,;
STRING sUserName,;
STRING sPassword ,;
STRING sDbName ,;
INTEGER lPortNum,;
STRING sSocketName ,;
INTEGER lFlags

DECLARE RtlMoveMemory IN Kernel32 As CopyMemory;
STRING @Dest, INTEGER Src, INTEGER nLength

Declare Integer mysql_close In libmySQL.Dll ;
Integer nID

DECLARE integer mysql_list_fields IN libmySQL ;
INTEGER lMySQL, ;
string cTABLE, ;
string cWild
&& sfarsit declaratii
RETURN

FUNCTION ConectMySQL
PARAMETERS _id,_host,_user,_pass,_db,_port
result=mysql_real_connect(_id,_Host, _User, _Pass, _DB,_Port,"",0)
RETURN result
*
FUNCTION table2cursor as Integer
PARAMETERS myID, _sql, _cursor
fxml = _cursor+'.xml'
res = mysql_query(myID, _sql)
If ( res = 0)                                                     && daca avem rezultat
    && pregatim xml
    DELETE FILE &fxml
    IF FILE(fxml) 
       hnd = FOPEN(fxml,12) 
    ELSE
       hnd = FCREATE(fxml) 
    ENDIF
    =FPUTS(hnd,'<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>')
    =FPUTS(hnd,'<VFPData>')

     pMyRES = mysql_store_result(myID)
     If (pMyRES <> 0)
             nNrCamp = mysql_num_fields(pMyRES)                        && nNrCamp = nr campuri in tabela
             If nNrCamp > 0
                 For i = 0 To mysql_num_rows(pMyRES) - 1
                    pMyROW = mysql_fetch_row(pMyRES)                && pointer la inregistrare
                    pmylung =  mysql_fetch_lengths(pMyRES)            && pointer la inreg. ce contine lungimea campurilor
                    *-
                    lbuf1 = 4*(nNrCamp+1)                            && marime buffer
                    cBuffer1 = REPLICATE(CHR(0),lbuf1)
                    = CopyMemory(@cBuffer1, pMylung, LEN(cBuffer1))    && copiem biti
                    && aflam lung campurilor
                    DECLARE lung[nNrCamp+1]
                    STORE 0 TO lung
                    lung[1]=(nNrCamp+1)*4                            && de unde incepe prima pozitie
                    &&
                    nLungTot = 0                                    && Lung totala a cmp. (necesara pt calcul bufer)
                    FOR z =1 TO nNrCamp
                        lung[z+1]=ASC(SUBSTR(cBuffer1,(z-1)*4+1,1))
                        nLungTot = nLungTot + lung[z+1]
                    ENDFOR
                     *
                    marbuf = nLungTot+(nNrCamp+1)*4+100   
                    cBuffer = REPLICATE(CHR(0),marbuf)
                    z= CopyMemory(@cBuffer, pMyROW, marbuf)
                    =FPUTS(hnd,CHR(9)+'<'+_cursor+'>')
                    &&  campurile
                    FOR z =1 TO nNrCamp
                        cmp = '<'+'camp'+ALLTRIM(STR(z))+'>'
                        cmp_END = '</'+'camp'+ALLTRIM(STR(z))+'>'
                         nLungLocal = 0
                         FOR j = 1 TO z
                             nLungLocal = nLungLocal + lung[j]
                         ENDFOR
                         =FPUTS(hnd,;
                         CHR(9)+CHR(9)+cmp+SUBSTR(cBuffer,nLungLocal+z,lung[z+1])+cmp_end)
                    ENDFOR
                    =FPUTS(hnd,CHR(9)+'</'+_cursor+'>')
                 ENDFOR
             ENDIF
         ENDIF
         && eliberam memoria
         mysql_free_result (pMyRES)
    =FPUTS(hnd,'</VFPData>')
    =FCLOSE(hnd)
    XMLTOCURSOR(fxml,'mycursor',512)
    BROWSE
    CLOSE DATABASES
ENDIF
&&
RETURN  res
*
Cateva comentarii:
- acest exemplu creaza simplu un xml  cu functii low level ; nu foloseste schema pentru xml
- denumirile campurilor le-am pus arbitrar (camp0,1,2,...)
- folosesc VFP 9.0 (de fapt nu prea il mai folosesc  - "cercetarea" privind o conexiune directa cu mysql-ul am facut-o acum cativa ani -scuzati cuvantul "cercetare")
Obs.
Nu prea am vazut pe net prea multe exemple in acest sens (vreo 2 articole prin reviste, vreo 2 exemple...). De aia am si postat...
Daca intereseaza pe cineva, se poate face o biblioteca care sa cuprinda toate functiile exportate de libmysql.dll
Ma rog, acum ca am scris aici, sunt curios ce reactii au cei ce viziteaza forumul, programatorii in VFP...
Astept un raspuns de la cei interesati....nu promit ca o sa pot raspunde tot timpul (timpul... )
 1/22/2009 4:29:41 PM
User is offlineGrigore Dolghin
3522 posts
www.class-software.eu
1st






Re: VFP MySQL direct prin libmysql
 (Romania)
Multumesc. Nu mi-o lua in nume de rau, dar personal o sa continui sa folosesc ODBC-ul.

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
  Visual FoxPro  Win32 API  VFP MySQL direc...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement