using System; using System.Data.SqlClient; namespace SteamWare { /// /// classe di gestione dei db x creazione/update alla versione richiesta /// public class dbUpdateManager { /// /// oggetto connessione /// protected SqlConnection conn = null; /// /// stringa di connessione /// protected string _connString; /// /// dir che contiene gli script da eseguire... /// protected string _sqlScriptDir; /// /// formato del file SQL impiegato (nel senso di formato come iFormat del tipo "App_{0:0000}.sql" --> da App_0001.sql ad App_9999.sql) /// protected string _sqlFileFormat; /// /// avvio protected della classe /// public dbUpdateManager(string connectionString, string sqlDir, string sqlFileFormat) { // salvo valori di avvio _sqlFileFormat = sqlFileFormat; _connString = connectionString; try { _sqlScriptDir = fileMover.getFilePath(sqlDir); } catch { _sqlScriptDir = sqlDir; } //logger.lg.scriviLog(_sqlScriptDir, tipoLog.INFO); } /// /// esegue gli script di sql di update dal file richiesto /// /// /// /// public bool execSql(string nomeFile, int timeout) { bool answ = false; // avvio connessione conn = new SqlConnection(_connString); // apro il file in lettura fileMover.obj.setDirectory(_sqlScriptDir); string sqlCmd = fileMover.obj.scaricaFileString(nomeFile).Replace("???", ""); try { // apro connessione conn.Open(); // creo e popolo comando logger.lg.scriviLog(string.Format("Inizio esecuzione comandl SQL del file {0}", nomeFile), tipoLog.INFO); DateTime inizio = DateTime.Now; SqlCommand comando = conn.CreateCommand(); // eseguo un comando alla volta (fino al GO...) string singleSqlCmd = ""; int i_GO = sqlCmd.IndexOf("GO\r\n"); while (i_GO != -1) { // prendo stringa... escluso GO... singleSqlCmd = sqlCmd.Substring(0, i_GO); // tolgo dalla string la parte eseguita... escluso GO... sqlCmd = sqlCmd.Substring(i_GO + 2, sqlCmd.Length - i_GO - 2); // eseguo singolo comando comando.CommandText = singleSqlCmd; comando.CommandTimeout = timeout; // eseguo comando.ExecuteNonQuery(); // ricaolco posizione prox GO... i_GO = sqlCmd.IndexOf("GO\r\n"); } logger.lg.scriviLog(string.Format("Completata esecuzione SQL {0} in {1} msec", nomeFile, DateTime.Now.Subtract(inizio).TotalMilliseconds), tipoLog.INFO); // segno come fatto answ = true; } catch (Exception e) { logger.lg.scriviLog(string.Format("Errore durante l'esecuzione SQL {0}, errore \n\r {1}", nomeFile, e), tipoLog.EXCEPTION); } finally { // chiude connessione if (conn != null) { try { conn.Close(); conn.Dispose(); } catch (Exception e) { logger.lg.scriviLog(string.Format("Errore durante la chiusura della connessione, errore:\n\r {0}", e), tipoLog.EXCEPTION); } } } return answ; } /// /// Aggiorna il db eseguendo gli script dalla versione di partenza a quella di arrivo /// /// NB: per definizione rev 0 = resetta svuotando DB, rev 1 crea tabelle iniziali, rev 2 inserisce i valori di default /// /// nome DB di cui cercare script /// revisione di partenza /// revisione di arrivo /// timeout max per ogni operazione /// public bool updateDbToRev(string nomeDB, int revFrom, int revTo, int timeout) { bool answ = false; // ciclo tra le revisioni richieste e chiedo esecuzione... for (int i = revFrom; i < revTo + 1; i++) { execSql(string.Format(_sqlFileFormat, nomeDB, i), timeout); } return answ; } /// /// verifica se il db indicato esiste o meno... /// /// /// /// public bool checkDbExisting(string dbname, string connectionString) { bool answ = false; // !!!FARE!!! return answ; } /// /// crea il db indicato con i parametri di connessione specificati /// /// /// /// public bool createDb(string dbname, string connectionString) { bool answ = false; // !!!FARE!!! per ora non c'è creazione ma SOLO fasi di update... return answ; } } }