mercoledì 31 agosto 2011

familyFinance.NET - sorgente - gestire le finanze familiari con C#

Vi propongo un software semplice semplice da me sviluppato per testare il funzionamento del C# con la tecnologia Sqlite.
Prendetelo così com'è, con i suoi bug e i suoi difetti (vuole essere semplicemente un test). I sorgenti sono scaricabili direttamente dal mio sito: http://www.stefanobianchini.net/familyfinance.net/familyfinance.net.zip
Tra le caratteristiche:
  • Sviluppato in C# (Framework 2.0)
  • Database Sqlite
  • Gestione movimenti (entrate, uscite) con data, note, descrizione, categoria (testuali)
  • Gestione saldo iniziale e opzioni basilari
  • Grafico a torta entrate / uscite
Alcuni screenshots:

martedì 2 agosto 2011

C# - un file browser personalizzato, riutilizzabile!

In questi giorni mi sono dedicato allo sviluppo di un piccolo componente (uno user control, utilizzando la terminologia .NET) che si occupa di fare da "file browser", ossia di navigare tra cartelle e file, effettuando le operazioni più comuni (apertura, nuova cartella, eliminazione, spostamento mediante drag & drop ecc.).
Ne è uscita fuori una libreria DLL riutilizzabile, scaricabile a questo indirizzo:
Ora vediamo come importare questo componente, contenuto nella libreria DLL, all'interno di un progetto C#:
  1. per prima cosa cliccare con il tasto destro sulla casella degli strumenti (quella con i componenti più comuni) e selezionare "Scegli elementi";
  2. cliccare su "Sfoglia" e selezionare la libreria dll. Abilitare il componente (chiamato in questo caso filebrowser) tramite il check a sinistra dello stesso;
  3. trascinare infine il componente dalla casella degli strumenti al form nel quale si intende avvalersi dei suoi servigi;
  4. impostare la proprietà che specifica la cartella da cui partire come radice (nell'esempio, il disco c:\)
    fileBrowser1._ROOT = @"c:\";
    
Spero che questo mio lavoro sia utile anche ad altri :-)
Qui potete vedere il risultato finale:

lunedì 1 agosto 2011

Php: una comoda libreria per interagire con MySql

Pubblico una comoda libreria da utilizzarsi per interagire con un database MySql. Fa parte del codice di Opencart che, come al solito, si rivela per me fonte di ottimo codice Php. Nella realtà sarebbe un driver, ossia un codice specifico per DBMS; Opencart in realtà usa una classe wrapper (chiamata db.php) non interessandosi dell'implementazione. A seconda del DBMS utilizzato, viene incluso un driver oppure un altro (ad esempio, MySql.php oppure Mssql.php e così via).
Dopo questa precisazione, diamo una occhiata al codice:
<?php
final class MySQL {
 private $connection;

 public function __construct($hostname, $username, $password, $database) {
  if (!$this->connection = mysql_connect($hostname, $username, $password)) {
   exit('Error: Could not make a database connection using ' . $username . '@' . $hostname);
  }

  if (!mysql_select_db($database, $this->connection)) {
   exit('Error: Could not connect to database ' . $database);
  }

  mysql_query("SET NAMES 'utf8'", $this->connection);
  mysql_query("SET CHARACTER SET utf8", $this->connection);
  mysql_query("SET CHARACTER_SET_CONNECTION=utf8", $this->connection);
  mysql_query("SET SQL_MODE = ''", $this->connection);
 }

 public function query($sql) {
  $resource = mysql_query($sql, $this->connection);

  if ($resource) {
   if (is_resource($resource)) {
    $i = 0;
     
    $data = array();

    while ($result = mysql_fetch_assoc($resource)) {
     $data[$i] = $result;
      
     $i++;
    }

    mysql_free_result($resource);

    $query = new stdClass();
    $query->row = isset($data[0]) ? $data[0] : array();
    $query->rows = $data;
    $query->num_rows = $i;

    unset($data);

    return $query;
   } else {
    return TRUE;
   }
  } else {
   exit('Error: ' . mysql_error($this->connection) . '<br />Error No: ' . mysql_errno($this->connection) . '<br />' . $sql);
  }
 }

 public function escape($value) {
  return mysql_real_escape_string($value, $this->connection);
 }

 public function countAffected() {
  return mysql_affected_rows($this->connection);
 }

 public function getLastId() {
  return mysql_insert_id($this->connection);
 }

 public function __destruct() {
  mysql_close($this->connection);
 }
}
?>
Notate il costruttore (che si occupa di creare la connessione) ma soprattutto il distruttore (__destruct) che avrà il compito di chiudere la connessione (cosa che, diciamolo, viene spesso dimenticata).
L'utilizzo di questa classe è semplice e immediato:
//creo l'oggetto con i parametri desiderati 
$db = new MySql("localhost","user","password","test_db");
//ottengo il risultato della query
$result = $db->query("SELECT * FROM users");
//se il numero di righe è maggiore di zero
if($result->num_rows) { 
//Ciclo nelle righe del risultato stampando il campo "name"
   foreach ($result->rows as $user_row) {
      echo $user_row['name'];
   }
}