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

    [c#] Classe: concettuale

    Stavo cimentandomi nella stesura di una classe che raggruppasse in modo semplice le principali funzioni per utilizzare un database.
    Mi stavo chiedendo una cosa: ho creato il metodo costruttore che, ricevuti in input alcuni parametri, li assegna ai valori privati della classe. Però volevo che facesse qualcosa in più: connettersi al database (stavo pensando, dato che vengo dal php, di semplificarmi la vita utilizzando funzioni simili a quelle del php appunto). Per connettermi al database ho creato una funzione di tipo "private". Concettualmente volevo sapere se è giusto il procedimento che sto applicando.
    Posto anche il codice che sto usando.

    codice:
    [supersaibal]using MySQLDriverCS;
    using System.Data
    
    namespace DataBase {
     class MySql {
      
      string dbUser;
      string dbHost;
      string dbPassword;
      string dbDataSource;
      MySQLConnection temp;
      // costruttore
      
      public MySQLConnection Connect(string hostname, string datasource, string user, string password) {
       dbUser = user;
       dbPassword = password;
       dbHost = hostname;
       dbDataSource = datasource;
       temp = Open();
       return temp;
     }
     
     private MySQLConnection Open() {
      MySQLConnection tmp = new MySQLConnection("Database="+ dbHost +";Data Source="+ dbDataSouce +";User Id="+ dbUser +";Password="+ dbPassword +"");
      tmp.Open();
      return tmp;
     } 
    
    
    }[/supersaibal]
    Ha senso così come lo sto progettando?

  2. #2

    Re: [c#] Classe: concettuale

    Originariamente inviato da VaLvOnAuTa
    ...ho creato il metodo costruttore che, ricevuti in input alcuni parametri, li assegna ai valori privati della classe. Però volevo che facesse qualcosa in più: connettersi al database ...
    Ha senso così come lo sto progettando?
    Non mi sembra di vedere un costruttore per la classe che stai creando. Per quello che vedo, non mi sembra che le due funzioni che hai scritto possano aiutarti molto. Fossi in te, non proverei a creare una funzione che ritorna una connection (aperta o chiusa poi fa poca differenza). Penserei a creare funzioni che svolgano delle operazioni ripetitive come ad esempio una funzione MyExecuteNonQuery che accetta come parametro una query sql e al suo interno istanzia una connection, un command ed esegue il metodo executenonquery di quest'ultimo oggetto. Una funzione siffatta potrebbe anche essere static (shared in vb) e quindi non necessitare di una istanza di classe per essere eseguita.
    Saluti a tutti
    Riccardo

  3. #3
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003

    Re: Re: [c#] Classe: concettuale

    Originariamente inviato da riccardone
    Non mi sembra di vedere un costruttore per la classe che stai creando. Per quello che vedo, non mi sembra che le due funzioni che hai scritto possano aiutarti molto. Fossi in te, non proverei a creare una funzione che ritorna una connection (aperta o chiusa poi fa poca differenza). Penserei a creare funzioni che svolgano delle operazioni ripetitive come ad esempio una funzione MyExecuteNonQuery che accetta come parametro una query sql e al suo interno istanzia una connection, un command ed esegue il metodo executenonquery di quest'ultimo oggetto. Una funzione siffatta potrebbe anche essere static (shared in vb) e quindi non necessitare di una istanza di classe per essere eseguita.
    Sì hai ragione... è che mi sto avvicinando per la prima volta alla programmazione di una classe che non avevo manco notato di non aver creato alcun costruttore
    Ti ringrazio per la dritta effettivamente è più comodo eseguire una query con un'unico comando anzichè ripetere 25 comandi ogni volta.

  4. #4
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    codice:
    [supersaibal]using MySQLDriverCS;
    using System.Data;
    
    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;
      }
    
      public int nonQuery(string query) {
       MySQLConnection myConnection = new MySQLConnection("Database="+ dbHost +";Data Source="+ dbDataSource +";User Id="+ dbUser +";Password="+ dbPassword +"");
       myConnection.Open();
       MySQLCommand myCommand = new MySQLCommand(query, myConnection);
       return myCommand.ExecuteNonQuery();
      }
    
      public string Version() {
       return "0.0.0.1";
      }
     }
    }[/supersaibal]
    Fino ad adesso ho fatto questo e sembra funzionare bene. C'è un solo problema. Nella pagina che mi richiama la classe devo comunque dichiarare il namespace "MySQLDriverCS" perchè il MySQLDataReader è un tipo che si trova in quella classe. E' possibile esportarla dalla classe che ho fatto io senza dover richiamare quel namespace?

  5. #5
    Se usi una libreria esterna non puoi fare a meno di referenziarla dal tuo progetto (importando o meno il namespace).
    Per il resto, guardando il codice che hai postato ti consiglio di non cercare di restituire un datareader come risultato di una funzione. Questo perche' il datareader e' un oggetto legato alla sua connessione e quindi nasce (cmd.executereader) vive (dr.read) e muore (dr.close) insieme alla connessione associata al command che lo ha generato e quindi non esce dalla funzione (in questo caso pensa a che fine dovrebbe fare la sua connection?). Semmai, se hai bisogno di una funzione che restituisca un contenitore con i dati proveniente da un db, puoi utilizzare una datatable che per sua natura e' disconnessa.
    Saluti a tutti
    Riccardo

  6. #6
    ...aggiungo che nella funzione nonQuery non ti preoccupi di chiudere la connessione dopo averla usata
    codice:
    myConnection.Close();
    questa operazione e' importante per ottimizzare l'uso delle risorse ed e' consigliabile utilizzare il blocco try e in particolare mettere il suddetto comando nel blocco finally in modo che venga sempre e comunque eseguita anche se c'e' stato un qualche errore.
    Saluti a tutti
    Riccardo

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.