Conversione Libreria di interfaccia a LibMySql.dll

Forum dedicato ai programmatori di X# in lingua italiana – Italian language forum

Moderator: wriedmann

Post Reply
User avatar
gianluca.pinoli
Posts: 36
Joined: Mon Nov 02, 2015 1:13 pm

Conversione Libreria di interfaccia a LibMySql.dll

Post by gianluca.pinoli »

Buongiorno a tutti.
da poco ho cominciato a sperimentare l'import dei miei progetti VO in X#.
Siccome la maggior parte dei progetti ha un utilizzo misto di DBF e MySql attraverso LibMySql ho cominciato subito da quest'ultimo componente.
Per l'interfaccia uso una vecchia classe che credo fosse stata scritta da Fabrice Foray.
La compilazione è andata a buon fine, ma usandola ho subito riscontrato un errore:

***************************************************************************************************
Error occurred in C:GDOshopPosExplorerGDOx-PosExplorer.exe at 20/03/2018 12:32:56------------------------------------------------------------
Impossibile effettuare il marshalling di 'return value': I puntatori non possono fare riferimento a strutture per le quali è stato eseguito il marshalling. Utilizzare ByRef.
Callstack:
in GDO-00-LoadSQLlib.Functions.mysql_fetch_row(_tcxMYSQL_RES* result)
in FabMySQLResult.get_fetch_row()
in GDOx-PosExplorer.Exe.Functions.MysqlDB_QueryResult(String sQuery) in C:XporterOutputGDOx-PosExplorerMysql x PosExp.prg:riga 197
in PosExplorerWin.CaricaTabelle(__Usual[] Xs$Args) in C:XporterOutputGDOx-PosExplorerForm PosExplorerWin.prg:riga 1417
in PosExplorerWin.PrimoInit(__Usual[] Xs$Args) in C:XporterOutputGDOx-PosExplorerForm PosExplorerWin.prg:riga 1457
in PosExplorerWin.Expose(__Usual[] Xs$Args) in C:XporterOutputGDOx-PosExplorerForm PosExplorerWin.prg:riga 1440
in Vulcan.VO.Window.Dispatch(__Usual[] $args)
in VulcanVOGUIClasses.Functions.__WCDialogProc(Void* hWnd, UInt32 uMsg, UInt32 wParam, Int32 lParam)
in VulcanVOWin32APILibrary.Functions.CallWindowProc(Void* lpPrevWndFunc, Void* hwnd, UInt32 Msg, UInt32 wParam, Int32 lParam)
in bTools_bBrowser.Functions.bEventHandler(Void* hWindow, UInt32 iMessage, UInt32 iWParam, Int32 iLParam)
**************************************************************************************************


l'errore sembra generato qui:

ACCESS fetch_row
LOCAL oRow AS FabMySQLRow
LOCAL pRow AS PTR
//
SELF:__Check_pMySQL_Res( #fetch_row )
pRow := mysql_fetch_row( SELF:pmySQL_RES )
IF ( pRow != NULL_PTR )
oRow := FabMySQLRow{ SELF, pRow }
ENDIF
//
RETURN oRow
GDO-00-LoadSQLlib.zip
(6.99 KiB) Downloaded 35 times
_DLL FUNCTION mysql_fetch_row( result AS _tcxMYSQL_RES ) AS PSZ PTR PASCAL:libmySQL.mysql_fetch_row



VOSTRUCT _tcxMYSQL_RES
MEMBER row_count AS REAL8
//
MEMBER field_count AS DWORD
MEMBER current_field AS DWORD
MEMBER fields AS _tcxMYSQL_FIELD
MEMBER data AS _tcxMYSQL_DATA
MEMBER data_cursor AS _tcxMYSQL_ROWS
MEMBER field_alloc IS _tcxMEM_ROOT
// If unbuffered read
MEMBER row AS PSZ PTR
// buffer to current row
MEMBER current_row AS PSZ PTR
// column lengths of current row
MEMBER lengths AS DWORD PTR
// for unbuffered reads
MEMBER handle AS _tcxMYSQL
// Used my mysql_fetch_row
MEMBER eof AS BYTE


Qualcuno riesce a capire dove sbaglio?

Grazie
Gianluca
User avatar
wriedmann
Posts: 3644
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Conversione Libreria di interfaccia a LibMySql.dll

Post by wriedmann »

Ciao Gianluca,

puntatori e .NET non vanno molto d'accordo.

Sembra che stai usando un puntatore su una struttura. In VO questo funziona, ma .NET avrà dei problemi.

La soluzione più facile sarebbe usare una libreria nativa di .NET e creare un'interfaccia tramite il programma VO e quest'ultima.

Se questo non è possibile dovrei fare delle prove.

Saluti

Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
softdevo@tiscali.it
Posts: 189
Joined: Wed Sep 30, 2015 1:30 pm

Conversione Libreria di interfaccia a LibMySql.dll

Post by softdevo@tiscali.it »

Scusami ma perché non usi il Net Connector di Mysql?
Ovvero la dll MySql.Data.dll, eviteresti così "codice non gestito"

Ecco un link per approfondire il concetto di codice gestito o non gestito.
https://docs.microsoft.com/it-it/dotnet ... naged-code

Danilo
User avatar
Chris
Posts: 4562
Joined: Thu Oct 08, 2015 7:48 am
Location: Greece

Conversione Libreria di interfaccia a LibMySql.dll

Post by Chris »

Ciao Gianluca,

As Danilo said, better use the dotnet classes for communication with the database, instead of using win api calls. But out of curiosity, please change your code to use REF like below, does it work this way?

(google translation: Come diceva Danilo, è meglio utilizzare le classi dotnet per la comunicazione con il database, invece di utilizzare le chiamate win api. Ma per curiosità, si prega di cambiare il codice per utilizzare REF come di seguito, funziona in questo modo?)

Code: Select all

_DLL FUNCTION mysql_fetch_row( result REF _tcxMYSQL_RES ) AS PSZ PTR PASCAL:libmySQL.mysql_fetch_row

pRow := mysql_fetch_row( REF SELF:pmySQL_RES )
Chris
Chris Pyrgas

XSharp Development Team test
chris(at)xsharp.eu
User avatar
gianluca.pinoli
Posts: 36
Joined: Mon Nov 02, 2015 1:13 pm

Conversione Libreria di interfaccia a LibMySql.dll

Post by gianluca.pinoli »

Danilo, Wolfgang,
Quello che stavo provando era un test di migrazione con il "minor sforzo possibile".
Purtroppo sembra che per la migrazione mi servirà integrare il MySql .NET Connector come mi consigliate.
Grazie ancora

Gianluca
User avatar
gianluca.pinoli
Posts: 36
Joined: Mon Nov 02, 2015 1:13 pm

Conversione Libreria di interfaccia a LibMySql.dll

Post by gianluca.pinoli »

Hi Chris,
I've tested my code with the suggested changes, but i get the same error.
I'll try testing Mysql .NET COnnector.

Regards
Gianluca
User avatar
gianluca.pinoli
Posts: 36
Joined: Mon Nov 02, 2015 1:13 pm

Conversione Libreria di interfaccia a LibMySql.dll

Post by gianluca.pinoli »

Hi Chris,
FYI, this way it seem to work:

ACCESS fetch_row
LOCAL oRow AS FabMySQLRow
LOCAL pRow AS PTR
//
SELF:__Check_pMySQL_Res( #fetch_row )
pRow := mysql_fetch_row( SELF:pmySQL_RES )
IF ( pRow != NULL_PTR )
oRow := FabMySQLRow{ SELF, pRow }
ENDIF
//
RETURN oRow

_DLL FUNCTION mysql_fetch_row( result AS _tcxMYSQL_RES ) AS PSZ PASCAL:libmySQL.mysql_fetch_row

Regards
Gianluca
User avatar
Chris
Posts: 4562
Joined: Thu Oct 08, 2015 7:48 am
Location: Greece

Conversione Libreria di interfaccia a LibMySql.dll

Post by Chris »

Hi Gianluca,

Aaah, right, it was the PSZ PTR in the return type! I had not spotted this before, thanks.

Chris
Chris Pyrgas

XSharp Development Team test
chris(at)xsharp.eu
Post Reply