Archivio per novembre 2011

Backup Mysql con mysqldump.exe – Parametri dell’applicazione

Nota: Articoli etichettati come Snippet non contengono codice completo ma solo parti di esso, recuperate da appunti. Per cui, potrebbe essere necessario modificarne alcuni nomi o indici. Per ogni chiarimento, lasciate un commento all’articolo.

Per effettuare il dump di un database MySql all’interno di una applicazione C#, mediante l’applicazione ufficiale mysqldump.exe.

Sono stati commentati i pezzi relativi al redirect dello standard output perchè nella prima versione, l’output del programma veniva poi salvato su file. Il problema è che in tal modo eventuali caratteri UTF (es: °) non venivano correttamente esportati perchè il redirect non gestisce la codifica UTF-8, mentre tutto viene esportato correttamente mediante “–result-file”.

string dumpFileName = “backupDb_” + String.Format(“{0:yyyy_MM_dd_HH_mm}”, DateTime.Now) + “.sql”;

string applicazioneDbDump = @”c:\………..\mysqldump.exe”;

try
{
ProcessStartInfo appDump = new ProcessStartInfo(applicazioneDbDump);
appDump.WindowStyle = ProcessWindowStyle.Hidden;
appDump.UseShellExecute = false;
appDump.RedirectStandardError = true;
//appDump.RedirectStandardOutput = true;
//–skip-lock-tables >> Senza questo parametro, in vecchie versioni di MySql server, genera errore [mysqldump: Got error: 1044: Access denied for user ‘utente’@’%’ to database ‘nomedb’ when using LOCK TABLES]
appDump.Arguments = string.Format(“-h {0} –database {1} -u {2} -p{3} –skip-add-drop-table –skip-disable-keys –skip-set-charset –skip-lock-tables –result-file=\”{4}\””, server, database, userid, password, Config.percorsoApplicazione + “\\BackupDb\\” + dumpFileName);

Process p = Process.Start(appDump);
//string output = p.StandardOutput.ReadToEnd();   //Lettura deve essere effettuata prima di WaitForExit, altrimenti si blocca
string outerr = p.StandardError.ReadToEnd();
p.WaitForExit(60000); //60 secondi

if (p.ExitCode != 0)
{
LogMe.log(LogLevel.Error, outerr);
LogMe.log(LogLevel.Error, appDump.Arguments);
Func.disattivaProgressBar();
MessageBox.Show(“Impossibile completare il backup\n” + outerr, Config.titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
catch (Exception e)
{
LogMe.log(LogLevel.Error, e);
Func.disattivaProgressBar();
MessageBox.Show(“Impossibile avviare il backup\n” + e.Message, Config.titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}

Annunci

, , ,

1 Commento

Utilizzare un Enum come DataSource per una ComboBox – Enums as DataSource

Eccomi ancora una volta a riportare sul blog la soluzione di un problemino di programmazione che mi ha appena fatto perdere un paio d’ore…

Preciso subito quali sono le fonti; il codice è stato preso e riadattato da due siti web, i quali trattavano l’argomento ma con delle piccole differenze rispetto a quanto servisse a me, e da un riferimento a msdn Microsoft.

http://stackoverflow.com/questions/1177915/binding-a-datasource-with-some-enum-values
http://developcode.blogspot.com/2006/12/dropdownlists-with-enums-as-datasource.html
http://msdn.microsoft.com/it-it/library/5tbh8a42%28v=VS.90%29.aspx

Il problema è il seguente: utilizzare un Enum in C# per popolare una ComboBox, visualizzando gli alias testuali ma utilizzando i valori numerici sottostanti per eseguire l’associazione manuale con un oggetto, da persistere mediante NHibernate.

L’oggetto in gestione è “Utente”, che ha diversi permessi per l’accesso all’applicazione. Di seguito la definizione dell’Enum:

public enum LivelloAccesso { Magazzino = 1, Ufficio = 2, Amministratore = 3};

Notare che ho esplicitato il valore delle costanti in Enum, al fine di essere sicuro di quali valori NH avrebbe poi salvato sul database.

Per completezza, nel mapping di NH ho indicato la proprietà come Int32

<property name=”livelloAccesso” column=”livelloAccesso” type=”Int32″ />

mentre nel codice

public virtual LivelloAccesso livelloAccesso { get; set; }

in modo che NH fosse in grado di effettuare automaticamente il mapping tra valori enum e gli Int32 associati.

Tornando all’argomento principale, questo è il codice utilizzato per mappare l’enum LivelloAccesso su una ComboBox in grafica:

List<KeyValuePair<int, string>> listaLivelliAccesso = new List<KeyValuePair<int, string>>();
foreach (Enum enumValue in Enum.GetValues(typeof(LivelloAccesso)))
{
listaLivelliAccesso.Add(new KeyValuePair<int, string>(Convert.ToInt16(enumValue),
enumValue.ToString()));
}
cmbLivelloAccesso.DataSource = listaLivelliAccesso;
cmbLivelloAccesso.DisplayMember = “Value”;
cmbLivelloAccesso.ValueMember = “Key”;

Questo il risultato grafico:

Da notare che non ho usato il termine Binding perchè l’associazione tra la combo e la proprietà dell’oggetto viene effettuata “a mano” mediante il seguente codice:

cmbLivelloAccesso.SelectedValue = Convert.ToInt32(i_utente.livelloAccesso);

Ovviamente conversione inversa dovrà essere fatta in fase di salvataggio dell’oggetto. Al momento non ho ancora completato il codice, per cui non riporto tale conversione, rimandando la sua scrittura su un eventuale commento successivo.

Una evoluzione potrebbe essere quella di eseguire il vero e proprio Binding tra la combo e l’oggetto… Chi mi aiuta? 😉

,

Lascia un commento