PDA

View Full Version : [C#]Lavorare con le classi


RaouL_BennetH
24-08-2005, 16:28
Altro problema della giornata :(

Allora,sono riuscito a trovare degli esempi che mi hanno consentito di collegarmi tramite C# ad un db mysql e di leggerne da console il contenuto e fare qualche piccola operazione.Ora,non contento di questo,mi era venuta la malsana idea di creare anche una piccola interfaccia grafica.Ad ogni modo,il grande e paziente vicius mi ha consigliato di cominciare a pensare a crearmi delle classi,per scomporre il problema in tanti problemini più piccoli.

Allora,per quanto riguarda la connessione al database,ho fatto così:

using System;
using System.Data;
using ByteFX.Data.MySqlClient;


class Connessione
{
public Connessione(string[] args)
{

public string connectionString =

"Server=localhost;" +
"Database=presenze;" +
"User ID=raoul;" +
"Password=quellochevolete;";

IDbConnection dbcon;
dbcon = new MySqlConnection(connectionString);
dbcon.Open();
IDbCommand dbcmd = dbcon.CreateCommand();

public string sql = "SELECT codice, MIN(orario) AS Ingresso, MAX(orario) AS Uscita, (MAX(orario) - MIN(orario)) " +
" AS ore FROM rilievi" +
" WHERE codice = '0017' " +
" GROUP BY codice" ;

dbcmd.CommandText = sql;

IDataReader reader = dbcmd.ExecuteReader();

while(reader.Read()) {
string Codice = (string) reader["codice"];
string Ingresso = (string) reader["ingresso"].ToString();
string Uscita = (string) reader["uscita"].ToString();
string Ore = (string) reader["ore"].ToString();


}
// chiudi le connessioni
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
dbcon.Close();
dbcon = null;
}
}


E questo l'ho salvato in un file che ho chiamato connessione.cs
Ora, nel file Main.cs ho:


using System;
using System.Data;
using ByteFX.Data.MySqlClient;
using Gtk;
using Glade;


public class Test
{
public static void Main(string[] args)
{


Console.WriteLine("Name: " + Codice + Ingresso + Uscita + " " + "Totale: " + Convert.ToDouble(Ore));


}
}


Allora, se lavoro in un unico file, ad esempio il Main.cs non ho problemi e funziona.

Nel caso quindi di una classe contenuta in un altro file,come dico al main di prendermi i valori da li?

RaouL.

RaouL_BennetH
24-08-2005, 16:31
opporc!! :doh:

Ho sbagliato sezione :cry:

Si può spostare per favore moderatori?

Thx.


RaouL.

ilsensine
25-08-2005, 07:52
Spostato

Brazorv
25-08-2005, 09:27
ciao
ho provato a modificare la tua classe però non la posso provare ora

using System;
using System.Data;
using ByteFX.Data.MySqlClient;

namespace ProvaMysql{
class Connessione
{

private string connectionString;
private IDbConnection dbcon;
private IDbCommand dbcmd;
private string sql;
private IDataReader reader;


public Connessione()
{

connectionString = "Server=localhost;" +
"Database=presenze;" +
"User ID=raul;" +
"Password=quellochevolete;";


dbcon = new MySqlConnection(connectionString);
dbcon.Open();



}

public void Comando(){
dbcmd = dbcon.CreateCommand();
sql = "SELECT codice, MIN(orario) AS Ingresso, MAX(orario) AS Uscita, (MAX(orario) - MIN(orario)) " +
" AS ore FROM rilievi" +
" WHERE codice = '0017' " +
" GROUP BY codice" ;

dbcmd.CommandText = sql;

reader = dbcmd.ExecuteReader();

while(reader.Read()) {
Console.WriteLine(reader["codice"] + " " +
" " + reader["ingresso"] + " " + reader["uscita"] +
" " + reader["ore"]);
}
}
// chiudi le connessioni
~Connessione(){
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
dbcon.Close();
dbcon = null;
}
}
}


ho diviso il tuo codice in 3 metodi
il costruttore crea la connessione
il metodo comando esegue il comando contenuto nella stringa sql e stampa il risultato
il metodo ~Connessione() è il distruttore dovrebbe chiudere la connessione e liberare le risorse
il main è così

using System;

namespace ProvaMysql
{
class MainClass
{
public static void Main(string[] args)
{
Connessione con = new Connessione();

con.Comando();


}
}
}

creo un nuovo oggetto di tipo Connessione, quando chiami il costruttore dovrebbe anche aprire la connessione al database
con.comando() esegue il comando e stampa
quando l'oggetto con viene distrutto dal Garbage Collector, viene chiamato il distruttore che libera le risorse
Provalo spero che funzioni io ora non ho un server MySql per provarlo
P.S. Che libro usi per studiare C#?
P.P.S. dove trovo la documentazione di ByteFX?

VICIUS
25-08-2005, 09:35
Io avrei separato il codice in questo modo.
using System;
using System.Data;
using ByteFX.Data.MySqlClient;


class Connessione
{
private IDbConnection conn;

public Connessione(string host, string db, string user, string passwd)
{
string connectionString = "Server="+host+";" +
"Database="+db+";" +
"User ID="+user+";" +
"Password="+passwd+";" ;

conn = new MySqlConnection (connectionString);
conn.Open();
}

public IDataReader EseguiQuery()
{
string sql = "SELECT codice, MIN(orario) AS Ingresso, " +
" MAX(orario) AS Uscita, (MAX(orario) - MIN(orario)) " +
" AS ore FROM rilievi" +
" WHERE codice = '0017' " +
" GROUP BY codice" ;

IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;

return cmd.ExecuteReader();
}

}
Certo pero Connessione e EseguiQuery non sono due nomi molto significativi.

ciao ;)

Brazorv
25-08-2005, 09:53
ho provato il codice che ho scritto sopra e mi da un eccezione:

Unhandled Exception: ByteFX.Data.MySqlClient.MySqlException: Client does not sup
port authentication protocol requested by server; consider upgrading MySQL client

uso Mysql 4.1 e ByteFx 0.76 su Windows
sapete dirmi come risolvere il problema?

RaouL_BennetH
25-08-2005, 14:03
@ Brazorv:

Io ho le stesse versioni tue ma non è che ti da un'eccezione perchè usi delle parole chiave che fanno parte della libreria ByteFx per dichiarare variabili?!?

Inoltre:

Grazie ad entrambi per i suggerimenti ma sono ancora abbastanza confuso :(

Non riesco a trovare una guida (in qualsiasi lingua) che tratti il concetto di "classi" partendo dal presupposto che non le si sia mai affrontate prima.Su tutte le guide che sto seguendo,è come se il concetto di classe sia qualcosa di talmente scontato che non lo trattano "per newbie" :(

^TiGeRShArK^
25-08-2005, 15:28
...in qualke libro di c++ hai provato??? o magari di java...
se nn sbaglio in quello di bruce eckel thinking in java ne parla.....
cmq puoi vedere la definizione di una classe come la definizione formale e completa di un oggetto, con tutte le variabili globali utilizzabili dall'oggetto (ad esempio per un libro potrebbero essere num di pagine, autore, titolo, ecc.), quindi c'è il costruttore ke è il metodo primario che si occupa della corretta inizializzazione della classe, e anzi ci possono essere un certo numero di costruttori che differiscono solo per il tipo o il numero dei parametri.
Ad esempio nella classe che dovevi usare tu per accedere a mysql la cosa migliore è crearsi la connessione al server nel costruttore.
Se fosse stato una classe Libro avresti dovuto inizializzare tutte le informazioni ke lo caratterizzano (le variabili di cui sopra), magari utilizzando dei parametri ke hai passato al costruttore.
Inoltre ogni classe che si rispetti deve anche avere dei metodi (anche se non è per nulla obbligatorio). Questi metodi sono delle particolari "funzioni" che agiscono sull'istanza dell'oggetto creato modificandone lo stato o facendolo agire su altri oggetti.....
Infine c'è il distruttore che si occupa di liberare le risorse occupate dal tuo oggetto una volta che il suo scopo è finito.
A questo punto dovrei spiegarti perchè prima ho parlato di "istanza" di classe.....
Praticamente quella che hai fatto tu e che hai chiamato genericamente classe è in realtà la definizione della classe.
Quando invece viene invocato il costruttore (Libro dune=new Libro("Frank Herbert")) viene istanziata la classe che hai definito, creando un oggetto dune avente tutte le caratteristiche dichiarate nella tua classe e che lo inizializza sfruttando il costruttore che riceve come parametro una stringa.
In questo modo il tuo oggetto dune sarà un istanza della classe Libro e la sua variabile privata "autore" avrà il valore "Frank Herbert".
Nulla ti vieta di utilizzare degli altri oggetti di tipo libro (sacraBibbia, starWars) che dovranno seguire sempre le specifiche di base dettate dalla definizione della classe, ma che avranno i VALORI di queste caratteristiche diversi l'uno dall'altro.
Ora....perchè t ho smarruggiato i neuroni x spiegarti che un oggetto è un'istanza della definizione di una classe da te specificata?????
perchè vi sono delle particolari variabili o dei particolari metodi di una classe che sono chiamati "statici".
Ovvero questi metodi non cambiano dinamicamente a seconda dell'oggetto che stiamo utilizzando (dune, robinHood), ma sono uguali x tutte le istanze delle classi.....
Ad esempio... la costante Pi Greco può essere definita come una costante statica, poichè essa DEVE avere lo stesso valore per tutte le differenti istanze della classe.
O ad esempio il metodo coseno (dato ke siamo in tema :D) avrà un implementazione comune per tutte le classi.
L'utilizzo di questi metodi statici è ad esempio il seguente:
Math.sin(3.14)
ke richiama il metodo statico sin della classe Math.
Inoltre anche il metodo main è un metodo statico, questo perchè non è variabile a seconda delle istanze della classe, ma deve essere uguale per tutte.
...Probabilmente mi sto dimenticando una marea di cose.....quasi certamente ti ho confuso ancora di più........
cmq prova a guardare nei libri che ti dicevo prima.... magari riesci a chiarirti un pò meglio il concetto di classe! ;)

Brazorv
25-08-2005, 18:59
io sto usando questo libro "C# How to Program" di Deitel & Deitel. spiega bene la programmazione ad oggetti, ed è pieno di esempi.