Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Creare client mysql in Visual Basic 6.0

    Salve ragazzi, era da tanto che non scrivevo una nuova discussione perché ho sempre trovato la soluzione al mio problema cercando in questo grande portale! Ma purtroppo, dopo una settimana di dure, lunghe e impazientiate ricerche ho deciso di arrendermi e postare qui il mio problema:

    Sono disperato, non riesco a creare un client MySQL in Visual Basic 6.0, monto Windows 7 Ultimate 32bit.

    Ho provato a creare l'applicazione usando i driver ODBC, aggiungendo nei Riferimenti del progetto la libreria "Microsoft Remote Data Object 2.0", qui di seguito il source:


    Private Sub Connetti_Click()
    Dim cnMySql As New rdoConnection
    Dim rdoQry As New rdoQuery
    Dim rdoRS As rdoResultset

    ' set up a remote data connection
    ' using the MySQL ODBC driver.
    ' change the connect string with your username,
    ' password, server name and the database you
    ' wish to connect to.

    cnMySql.CursorDriver = rdUseOdbc
    cnMySql.Connect = "uid=root;pwd=passwordmia; server=localhost;" & _
    "driver={MySQL ODBC 3.51 Driver} database=test;dsn=;"
    cnMySql.EstablishConnection

    ' set up a remote data object query
    ' specifying the SQL statement to run.

    With rdoQry
    .Name = "selectUsers"
    .SQL = "select * from segnale"
    .RowsetSize = 1
    Set .ActiveConnection = cnMySql
    Set rdoRS = .OpenResultset(rdOpenKeyset, rdConcurRowVer)
    End With

    ' loop through the record set
    ' processing the records and fields.

    Do Until rdoRS.EOF
    With rdoRS

    ' your code to process the fields
    ' to access a field called username you would
    ' reference it like !username

    rdoRS.MoveNext
    End With
    Loop

    ' close record set
    ' close connection to the database

    rdoRS.Close
    cnMySql.Close
    End Sub

    "debuggando" mi ritrovo nella linea di codice cnMySql.CursorDriver = rdUseOdbc il codice di errore "Errore di run-time '429': Il componente Activex non può creare l'oggetto"

    Ho provato a risolvere il problema aggiungendo nei Riferimenti anche la libreria "Microsoft DAO 3.6 Object Library" ma niente.
    Ho provato anche con la 3.51 e a registrare nuovamente la libreria dll tramite il comando regsvr32 con una risposta di conferma positiva di registrazione ma che non risolve ancora il problema dell'errore 429.

    Disperato, cerco di crearmi il client con ADODB, seguo questa guida passo per passo, scaricandomi sia i driver OLDEDB che il progetto per intero ma ancora niente.
    Posto qui il codice:


    Public conn, rs

    'Variabili MySQL
    Public mysql_host As String
    Public mysql_userid As String
    Public mysql_password As String
    Public mysql_database As String
    Public mysql_query As String
    Public mysql_port As String

    Public id_update As Integer

    'Tasto Connetti
    Private Sub Command1_Click()
    Call do_connect
    End Sub
    'Tasto Disconnetti
    Private Sub Command2_Click()
    Call do_disconnect
    End Sub

    Private Sub Command3_Click()
    Dim query As String
    Set rs = CreateObject("ADODB.Recordset") 'setta rs come un record per ADO
    List1.Clear

    'Esegue solo se la connessione è attiva
    If (conn.State = adStateOpen) Then
    query = "SELECT * FROM anagrafe"
    rs.Open query, conn
    'Visualizza il numero di recor trovati
    Debug.Print "Numero di record trovati " & rs.RecordCount
    'Visualizza i record trovati
    If (rs.RecordCount > 0) Then

    Do While Not (rs.EOF) 'Esegue il ciclo fino alla fine
    List1.AddItem rs("id") & " - " & rs("nome") & " - " & rs("cognome")
    List1.ItemData(List1.NewIndex) = rs("id")
    rs.MoveNext 'Passa al record successivo
    Loop

    End If
    End If
    Set rs = Nothing

    End Sub

    Private Sub Command4_Click()
    Dim query As String
    If (conn.State = adStateOpen) Then 'Esegue solo se si è connessi
    query = "INSERT INTO anagrafe (id, nome, cognome) VALUES ('', '" & TextNome.Text & "', '" & TextCognome.Text & "')"
    conn.Execute query
    Debug.Print "Inserimento del record riuscito"
    Call Command3_Click 'Rieffettua la select
    End If
    End Sub

    Private Sub Command5_Click()
    If (id_update > 0) And (conn.State = adStateOpen) Then
    query = "DELETE FROM anagrafe WHERE id = '" & Str(id_update) & "'"
    conn.Execute query
    Debug.Print "Rimozione del record " & id_update & " riuscita"
    Call Command3_Click 'Rieffettua la select
    End If
    End Sub

    Private Sub Command6_Click()
    If (id_update > 0) And (conn.State = adStateOpen) Then
    query = "UPDATE anagrafe SET nome = '" & TextNome.Text & "', cognome = '" & TextCognome.Text & "' WHERE id = '" & Str(id_update) & "'"
    conn.Execute query
    Debug.Print "Aggiornamento del record " & id_update & " riuscito"
    Call Command3_Click 'Rieffettua la select
    End If

    End Sub

    Private Sub Form_Load()

    Set conn = CreateObject("ADODB.Connection")

    'Inizializza le variabili
    mysql_host = "127.0.0.1"
    mysql_userid = "root"
    mysql_password = "passwordmia"
    mysql_database = "test"
    mysql_port = "3306"


    'Crea la stringa di connessione
    connect_string = "Provider=MySqlProv;Data Source=mysql_odbc_dsn" & Chr(34) & "server=" & mysql_host & ";DB=" & mysql_database & ";User=" & mysql_userid & ";Password=" & mysql_password & ";Option=131088; Stmt=;Port=" & mysql_port & "" & Chr(34)
    conn.Provider = "MySqlProv"
    conn.ConnectionString = connect_string
    conn.CommandTimeout = 1000
    conn.ConnectionTimeout = 1000 'Tempo in mS prima che il tentativo di connessione vada in TimeOut
    conn.CursorLocation = adUseServer

    End Sub
    Public Sub do_connect()
    'On Error GoTo Connect_Error

    If Not (conn.State = adStateOpen) Then
    'Evita la comparsa della finestra POPUP del provider di MySQL
    conn.Properties("PROMPT") = adPromptNever
    conn.Open 'Instaura la connessione con il Database"
    Debug.Print "Connessione con il server MySQL riuscita"
    End If
    Exit Sub

    Connect_Error:
    MsgBox "Connessione con il server MySQL " & mysql_host & " fallita", vbCritical, "Attenzione"

    End Sub
    'Termina la connessione con il server MySQL
    Public Sub do_disconnect()
    If conn.State = adStateOpen Then 'Esegue solo se si connessi
    conn.Close 'Chiude la connessione con MySQL
    Debug.Print "Disconnessione da MySQL riuscita"
    End If
    End Sub
    'Termina l'applicazione
    Private Sub Form_Unload(Cancel As Integer)
    Call do_disconnect
    Set conn = Nothing
    Unload Me
    End Sub


    Private Sub List1_DblClick()
    Set rs = CreateObject("ADODB.Recordset") 'setta rs come un record per ADO
    id_update = List1.ItemData(List1.ListIndex)
    If (conn.State = adStateOpen) Then
    query = "SELECT * FROM anagrafe WHERE id ='" & id_update & "' LIMIT 1"
    rs.Open query, conn
    'Visualizza i record trovati
    If (rs.RecordCount > 0) Then
    TextNome.Text = rs("nome")
    TextCognome.Text = rs("cognome")
    End If
    End If

    End Sub

    Eseguo l'applicazione e nella riga conn.Properties("PROMPT") = adPromptNever mi da questo errore: Errore di run-time '37606'. Impossibile trovare il provider. E' possibile che non sia installato correttamente.
    Dunque reinstallo i driver OLEDB e l'errore precedente non esce ma nella riga successiva, ossia conn.Open 'Instaura la connessione con il Database" mi esce questo altrettanto errore: Errore di run-time '-2147467259 (8004005)': Errore non specificato.

    Sono disperato... la mia pazienza è finita!
    Ho scaricato un Freeware Navicar Lite (client mysql) per connettermi nel mio database locale e funziona tutto correttamente. Anche dalla pagina phpMyAdmin tutto regolare.
    Il problema sussiste quindi nella programmazione e non so più davvero dove sbattere la testa
    Non mi importa in che modo o usando quale driver posso collegarmi tramite un applicazione VB6, l'importante è che funzioni!
    Spero di essere stato chiaro e tecnico, grazie in anticipo per chi sa darmi qualche dritta e una soluzione.
    http://raspada.it

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    N.B. Il codice fa formattato e indentato (come da Regolamento) utilizzando l'apposito pulsante [ CODE ]

    Stai facendo un gran casino, mescolando RDO e ADO.

    Lascia perdere RDO, vecchia tecnologia completamente abbandonata (che ha avuto vita breve), e lascia perdere pure DAO (ancor più vecchio).

    ADO basta e avanza, dato che racchiude entrambe le tecnologie, e le migliora di molto!

    Altra cosa: NON, ripeto NON, usare CreateObject() per gestire oggetti di ADO.
    Invece, devi aggiungere al progetto il riferimento alla libreria:
    Microsoft ActiveX Data Object 2.8.


    Dunque, riparti da zero e tieni presente è necessario aver installato il driver ODBC 5.1 di MySQL (oltre a MySQL 5.x)

    Io ad esempio faccio così:

    codice:
        Dim sConn As String
        Dim CN As ADODB.Connection
        Set CN = New ADODB.Connection
    
        sConn = "Driver={MySQL ODBC 5.1 Driver}"
        sConn = sConn & ";Server=localhost"
        sConn = sConn & ";Database=" & sDBName
        sConn = sConn & ";User=" & sUser
        sConn = sConn & ";Password=" & sPwd
        sConn = sConn & ";Option=3;Port=3306;"
    
        With CN
            .ConnectionString = sConn
            .CursorLocation = adUseClient
            .Open
        End With
    Naturalmente tu userai i "tuoi" parametri.

    Poi per i recordset procedi normalmente.

    Consiglio: lascia perdere le guide in Internet, perchè nel 90% dei casi sono vecchie, non vengono mai aggiornate, quindi incomplete e causano spesso più problemi che altro.
    Meglio un buon testo ufficiale (es. MySQL 5 - Guida completa - M.Kofler - APOGEO).


  3. #3
    Originariamente inviato da gibra
    N.B. Il codice fa formattato e indentato (come da Regolamento) utilizzando l'apposito pulsante [ CODE ]

    Stai facendo un gran casino, mescolando RDO e ADO.

    Lascia perdere RDO, vecchia tecnologia completamente abbandonata (che ha avuto vita breve), e lascia perdere pure DAO (ancor più vecchio).

    ADO basta e avanza, dato che racchiude entrambe le tecnologie, e le migliora di molto!

    Altra cosa: NON, ripeto NON, usare CreateObject() per gestire oggetti di ADO.
    Invece, devi aggiungere al progetto il riferimento alla libreria:
    Microsoft ActiveX Data Object 2.8.


    Dunque, riparti da zero e tieni presente è necessario aver installato il driver ODBC 5.1 di MySQL (oltre a MySQL 5.x)

    Io ad esempio faccio così:

    codice:
        Dim sConn As String
        Dim CN As ADODB.Connection
        Set CN = New ADODB.Connection
    
        sConn = "Driver={MySQL ODBC 5.1 Driver}"
        sConn = sConn & ";Server=localhost"
        sConn = sConn & ";Database=" & sDBName
        sConn = sConn & ";User=" & sUser
        sConn = sConn & ";Password=" & sPwd
        sConn = sConn & ";Option=3;Port=3306;"
    
        With CN
            .ConnectionString = sConn
            .CursorLocation = adUseClient
            .Open
        End With
    Naturalmente tu userai i "tuoi" parametri.

    Poi per i recordset procedi normalmente.

    Consiglio: lascia perdere le guide in Internet, perchè nel 90% dei casi sono vecchie, non vengono mai aggiornate, quindi incomplete e causano spesso più problemi che altro.
    Meglio un buon testo ufficiale (es. MySQL 5 - Guida completa - M.Kofler - APOGEO).

    Davvero grazie gibra...!!!
    Mi scuso per aver dimenticato di formattare il codice... ho seguito le tue istruzioni e tutto funziona alla grande! Mi è stato d'aiuto, volevo solo avere conferma per quanto riguarda l'istruzione CreateObject() ho usato la clausura set CN = New ADODDB.Connection . E' questo il modo consigliato vero ?
    Per curiosità inoltre volevo sapere perché è sconsigliato usare CreateObject() ?

    Grazie infinite ancora per la disponibilità!
    http://raspada.it

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da darkuss
    Davvero grazie gibra...!!! ho seguito le tue istruzioni e tutto funziona alla grande! Mi è stato d'aiuto,
    Prego

    Originariamente inviato da darkuss
    volevo solo avere conferma per quanto riguarda l'istruzione CreateObject() ho usato la clausura set CN = New ADODDB.Connection . E' questo il modo consigliato vero ?
    Sì, gli oggetti vanno PRIMA dichiarati, POI istanziati ed infine distrutti quando non servono più, quindi:

    codice:
        Dim CN As ADODB.Connection
        Set CN = New ADODB.Connection
        '// codice
        CN.Close
        Set CN = Nothing
    
        Dim rs As ADODB.Recordset
        Set rs = New ADODB.Recordset
        '// codice che usa il recordset
        rs.Close
        Set rs = Nothing
    Ovviamente il 'quando' eseguire le istruzioni di 'distruzione' dipende da diversi fattori (esigenze, scenario, etc...)


    Originariamente inviato da darkuss
    Per curiosità inoltre volevo sapere perché è sconsigliato usare CreateObject() ?
    Il CreateObject() è una modalità di utilizzo di una libreria chiamata late-binding (associazione tardiva) ed ha i suoi vantaggi/svantaggi. In genere va utilizzata quando non è possibile usare l'early-binding (associazione preventiva) ovvero quando non si è certi che la versione installata nel PC corrisponda a quella utilizzata dallo sviluppatore.

    Per chi deve utilizzare un oggetto almeno all'inizio (come te) deve poter usufruire dell'intellisense (hai presente quando digiti il punto dopo il nome di un oggetto e VB ti elenca proprietà e metodi dell'oggetto? Esempio Form1. ) cosa che puoi avere solo se crei un riferimento diretto alla libreria.

    Comunque c'è un modo per utilizzare entrambi:
    - l'early-binding in fase di progettazione
    - il late-binding in fase di esecuzione del programma eseguibile.

    Puoi vedere i miei articoli con progetto di esempio qui:
    VB6 - Early-Late Binding con Outlook
    http://nuke.vbcorner.net/Articoli/VB...T/Default.aspx

    VB.NET 2010 - Early-Late Binding in VB.NET + Excel
    http://nuke.vbcorner.net/Progetti/NE...T/Default.aspx

    Ma con ADODB preferisco sempre utilizzare il riferimento diretto.
    La sola accortezza è che se si sviluppano applicazioni che devono girare anche su Windows 2000 (nelle aziende è ancora molto presente) allora basta usare la versione 2.5 invece della 2.8, oppure (come faccio io) si aggiunge il setup dell'MDAC 2.8, fornito da Microsoft, nell'installazione della tua applicazione.


  5. #5
    Originariamente inviato da gibra

    Il CreateObject() è una modalità di utilizzo di una libreria chiamata late-binding (associazione tardiva) ed ha i suoi vantaggi/svantaggi. In genere va utilizzata quando non è possibile usare l'early-binding (associazione preventiva) ovvero quando non si è certi che la versione installata nel PC corrisponda a quella utilizzata dallo sviluppatore.

    Per chi deve utilizzare un oggetto almeno all'inizio (come te) deve poter usufruire dell'intellisense (hai presente quando digiti il punto dopo il nome di un oggetto e VB ti elenca proprietà e metodi dell'oggetto? Esempio Form1. ) cosa che puoi avere solo se crei un riferimento diretto alla libreria.

    Comunque c'è un modo per utilizzare entrambi:
    - l'early-binding in fase di progettazione
    - il late-binding in fase di esecuzione del programma eseguibile.

    Puoi vedere i miei articoli con progetto di esempio qui:
    VB6 - Early-Late Binding con Outlook
    http://nuke.vbcorner.net/Articoli/VB...T/Default.aspx

    VB.NET 2010 - Early-Late Binding in VB.NET + Excel
    http://nuke.vbcorner.net/Progetti/NE...T/Default.aspx

    Ma con ADODB preferisco sempre utilizzare il riferimento diretto.
    La sola accortezza è che se si sviluppano applicazioni che devono girare anche su Windows 2000 (nelle aziende è ancora molto presente) allora basta usare la versione 2.5 invece della 2.8, oppure (come faccio io) si aggiunge il setup dell'MDAC 2.8, fornito da Microsoft, nell'installazione della tua applicazione.
    Molto chiaro! Grazie davvero per avermi delucidato un po di cose tra l'altro molto interessanti e utili... visiterò i tuoi articoli appena posso

    Ancora grazie e Buona Domenica
    http://raspada.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.