Articoli con tag MySql

Passare il contenuto di un file in standard input -stdin- ad un’applicazione

Qualche tempo fa, quando il DOS e la riga di comando la facevano ancora da padrone, era frequente l’uso del reindirizzamento dello standard input/output/error (stdin, stdout, stderr) per passare il contenuto di un file ad un applicativo e farlo elaborare.

Mi capita ancora di utilizzare questa tecnica con i tool da riga di comando del database MySql.

Per esempio, per importare un dump o uno script sql in un db, è sufficiente digitare (da cmd.exe) il seguente testo

mysql -h 192.168.1.1 -u user -ppwd dbname < C:\updateDb.sql

Questo fa si che lo script contenuto nel file updateDb.sql venga interpretato dal mysql come se immesso a mano da tastiera.

Qualche giorno fa, invece, ho avuto la necessità di automatizzare questo processo all’interno di un’applicazione C#.

Di seguito riporto il codice utilizzato ed al suo interno i commenti necessari

            //Aggiornamento db
            try
            {               
                FileInfo file = new FileInfo(Config.sqlUpdateScript); //sqlUpdateScript è il percorso di updateDb.sql
                if (file.Exists)
                {

                    //Config.applicazioneDbUpdate rappresenta il file dell’applicazione da eseguire: mysql.exe
                    ProcessStartInfo appDump = new ProcessStartInfo(Config.applicazioneDbUpdate);
                    appDump.WindowStyle = ProcessWindowStyle.Hidden;
                    appDump.UseShellExecute = false;
                    appDump.RedirectStandardError = true;
                    appDump.RedirectStandardOutput = true;
                    appDump.RedirectStandardInput = true;
                    //Le credenziali vengono passate come stringhe e concatenate da string.Format
                    appDump.Arguments = string.Format(“-h {0} -u {1} -p{2} {3}”, server, userid, password, database);
                    Process p = Process.Start(appDump);

                    //Apro lo StreamReader verso il file di script sql
                    using (var streamReader = new StreamReader(Config.sqlUpdateScript))
                    {
                       //QUESTA E’ LA PARTE PRINCIPALE: passo il file allo StandardInput del processo “p”
                        p.StandardInput.Write(streamReader.ReadToEnd());
                        p.StandardInput.Flush();
                        p.StandardInput.Close();
                    }

                   //Verifico eventuali output del programma o messaggi di errore
                    string output = p.StandardOutput.ReadToEnd();   //Lettura prima di WaitForExit, altrimenti si blocca
                    string outerr = p.StandardError.ReadToEnd();
                    p.WaitForExit(60000); //60 secondi

                    if (p.ExitCode != 0)
                    {
                        //LogMe.log(…) è un metodo di una -mia- classe di log
                        LogMe.log(LogLevel.Error, outerr);
                        LogMe.log(LogLevel.Error, appDump.Arguments);
                        MessageBox.Show(“Impossibile completare il backup\n” + outerr, Config.titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return false;
                    }
                }
                else
                {
                    LogMe.log(LogLevel.Error, “Script di aggiornamento non trovato!”);
                    MessageBox.Show(“Script di aggiornamento non trovato!\nAggiornamento non riuscito.”, Config.titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch (Exception exe)
            {
                LogMe.log(LogLevel.Error, exe);
                MessageBox.Show(“Errore generico\n” + exe.Message, Config.titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

Annunci

, , ,

Lascia un commento

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;
}

, , ,

1 Commento