161 lines
6.0 KiB
C#
161 lines
6.0 KiB
C#
using System;
|
|
using System.Data.SqlClient;
|
|
|
|
namespace SteamWare
|
|
{
|
|
/// <summary>
|
|
/// classe di gestione dei db x creazione/update alla versione richiesta
|
|
/// </summary>
|
|
public class dbUpdateManager
|
|
{
|
|
/// <summary>
|
|
/// oggetto connessione
|
|
/// </summary>
|
|
protected SqlConnection conn = null;
|
|
/// <summary>
|
|
/// stringa di connessione
|
|
/// </summary>
|
|
protected string _connString;
|
|
/// <summary>
|
|
/// dir che contiene gli script da eseguire...
|
|
/// </summary>
|
|
protected string _sqlScriptDir;
|
|
/// <summary>
|
|
/// 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)
|
|
/// </summary>
|
|
protected string _sqlFileFormat;
|
|
/// <summary>
|
|
/// avvio protected della classe
|
|
/// </summary>
|
|
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);
|
|
}
|
|
/// <summary>
|
|
/// esegue gli script di sql di update dal file richiesto
|
|
/// </summary>
|
|
/// <param name="nomeFile"></param>
|
|
/// <param name="timeout"></param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
/// <summary>
|
|
/// 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
|
|
/// </summary>
|
|
/// <param name="nomeDB">nome DB di cui cercare script</param>
|
|
/// <param name="revFrom">revisione di partenza</param>
|
|
/// <param name="revTo">revisione di arrivo</param>
|
|
/// <param name="timeout">timeout max per ogni operazione</param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
/// <summary>
|
|
/// verifica se il db indicato esiste o meno...
|
|
/// </summary>
|
|
/// <param name="dbname"></param>
|
|
/// <param name="connectionString"></param>
|
|
/// <returns></returns>
|
|
public bool checkDbExisting(string dbname, string connectionString)
|
|
{
|
|
bool answ = false;
|
|
|
|
// !!!FARE!!!
|
|
|
|
return answ;
|
|
}
|
|
/// <summary>
|
|
/// crea il db indicato con i parametri di connessione specificati
|
|
/// </summary>
|
|
/// <param name="dbname"></param>
|
|
/// <param name="connectionString"></param>
|
|
/// <returns></returns>
|
|
public bool createDb(string dbname, string connectionString)
|
|
{
|
|
bool answ = false;
|
|
|
|
// !!!FARE!!! per ora non c'è creazione ma SOLO fasi di update...
|
|
|
|
return answ;
|
|
}
|
|
}
|
|
}
|