Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003

    [c#] Classe per query al database.

    Premettendo che uso un namespace esterno per fare la connessione etc. Ho semplicemente progettato una classicina che mi seplifichi (e di molto) le operazioni di connessione-estrazione dati-disconnessione da un database mysql, questa è la mia classe (o comunque parte di essa):
    codice:
    [supersaibal]namespace DataBase {
     public class MySql {
    
      string dbUser;
      string dbHost;
      string dbPassword;
      string dbDataSource;
    
      public MySql(string host, string user, string password, string database) {
       dbUser = user;
       dbPassword = password;
       dbHost = host;
       dbDataSource = database;
      }
    
     public MySQLDataReader Select(string query) {
       MySQLConnection myConnection = new MySQLConnection("Database="+ dbHost +";Data Source="+ dbDataSource +";User Id="+ dbUser +";Password="+ dbPassword +"");
       myConnection.Open();
       MySQLCommand myCommand = new MySQLCommand(query, myConnection);
       MySQLDataReader myReader = myCommand.ExecuteReaderEx();
       myReader.Read();
       return myReader;
       myConnection.Close();
      }
     }
    }[/supersaibal]
    Mi domando se l'operazione messa DOPO il return della funzione venga eseguita, dato che dopo un pò di prove (con continuo aggiornamento della pagina) mi dice che "MySQLDriverCS Exception: MySQLDriverCS Error: can't connect.Too many connections".

  2. #2
    Normalmente il codice dopo il return di una funzione non viene eseguito. Pero', se hai la necessita' di chiudere una connection, allora puoi utilizzare un blocco try/finally mettendo appunto nel finally la chiusura della connessione. Infatti, indipendentemente dal punto di uscita (es. return o errore) della funzione, il codice presente nel finally viene sempre eseguito prima di uscire definitivamente.
    Per il resto, se non ricordo male qualche giorno fa avevi gia' postato qualcosa di simile e ti avevo gia' consigliato di non creare una funzione che restituisce come valore di ritono un datareader per il semplice motivo che il datareader e' legato alla connessione. Quindi ripeto il consiglio che se hai bisogno di un contenitore per i dati puoi usare una datatable che e' invece un oggetto disconnesso e una volta riempito puo essere tranquillamente restituito e usato da altre funzioni.
    Saluti a tutti
    Riccardo

  3. #3
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Ti ringrazio per il consiglio, però mi sorge un dubbio.
    Ho modificato la funzione in modo che la connessione si chiuda prima del return. Però il datareader è registrato e mi viene restituito nello script correttamente. Se no che altro metodo ho per estrarre successivamente i campi singolarmente? Col datatable si può fare?

  4. #4
    Hai due soluzioni: o il DataTable che non ha bisogno di connessioni aperte, oppure utilizzare la tecnica che usi adesso con un piccolo accorgimento: dare l'opzione CommandBehavior.CloseConnection con il datareader.
    codice:
    public MySQLDataReader Select(string query) {
       MySQLConnection myConnection = new MySQLConnection("Database="+ dbHost +";Data Source="+ dbDataSource +";User Id="+ dbUser +";Password="+ dbPassword +"");
       myConnection.Open();
       MySQLCommand myCommand = new MySQLCommand(query, myConnection);
       MySQLDataReader myReader = myCommand.ExecuteReaderEx(CommandBehavior.CloseConnection);
       myReader.Read();
       return myReader;
      }
    Questo ti consente, dopo la lettura del datareader, di chiudere insieme al datereader anche la connessione del database con un solo comando:
    codice:
    nome_tuo_datareader.Close();
    L'unico dubbio è che non conoscendo quella dll per la connessione del database non so se supporta quell'opzione. In caso negativo l'uso del datatable ti risolve tutti i problemi

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  5. #5
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Originariamente inviato da AndreaZani
    L'unico dubbio è che non conoscendo quella dll per la connessione del database non so se supporta quell'opzione. In caso negativo l'uso del datatable ti risolve tutti i problemi

    Ciao
    Infatti, aggiungendo quell'opzione che mi hai consigliato, nel compilare la classe mi da errore.
    Ma se chiudo la connessione al database prima del return e mi faccio restituire il datareader la connessione non viene chiusa? No perchè non mi dà errori e comunque riesco ad estrapolare i dati tranquillamente.

  6. #6
    No, con il close in quel caso chiudi solo il datareader, ma la connessione rimane aperta.

    Nel tuo caso il datatable è l'ideale.

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  7. #7
    Stavo guardando ora i metodi di quella classe. Ho visto che la funzione "ExecuteReader" permette l'aggiunta di quel parametro (link), mentre l'ExcuteReaderEx non lo permette.

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  8. #8
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Non uso quella dll lì, però quella che uso ha la stessa funzionalità (e dovrebbe accettare il parametro, a meno che non hanno fatto cut/paste da altre documentazioni )

    Nel compilare la classe mi dice "database.cs(25,31): error CS0029: Impossibile convertire implicitamente il tipo 'System.Data.IDataReader' in 'MySQLDriverCS.MySQLDataReader'."

    Nella documentazione mi dice
    codice:
    [C#]
    protected IDataReader ExecuteReader(
       bool CloseConnection
    );

  9. #9
    Ok, è ancora più semplice, devi usare:
    codice:
    MySQLDataReader myReader = myCommand.ExecuteReaderEx(true);
    In questo modo ti sarà sufficiente chiudere il datareader per chiudere anche la connessione.

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  10. #10
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Originariamente inviato da AndreaZani
    Ok, è ancora più semplice, devi usare:
    codice:
    MySQLDataReader myReader = myCommand.ExecuteReaderEx(true);
    In questo modo ti sarà sufficiente chiudere il datareader per chiudere anche la connessione.

    Ciao
    Avevo messo myCommand.ExecuteReaderEx(1) ma mi dava errore. Mo provo con true
    Ti fo sapere dopo

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.