Esportare schema del db da NHibernate – NHibernate SchemaExport

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.

Dopo aver configurato correttamente NHibernate con tutti i file di mapping ed aver definito correttamente i parametri di connessione, è possibile lasciare al framework l’onere di costruire il database.

Un vincolo importante (nel caso decidiate di eseguire l’export) è che il database (vuoto) esista sul DBMS e che l’utente sia autorizzato alla creazione di tabelle e vincoli.

A mio parere questa funzionalità andrebbe utilizzata solo come metodo di verifica della correttezza del mapping (ad esempio facendo creare un db parallelo per i confronti) e non per una generazione da “produzione”, almeno se non seguita da un profondo controllo manuale…

private static string mappingFilePath = “Mapping\\hibernate.cfg.xml”;

NHibernate.Tool.hbm2ddl.SchemaExport se = new NHibernate.Tool.hbm2ddl.SchemaExport(new NHibernate.Cfg.Configuration().Configure(mappingFilePath));

se.Create(true, false);

Ho inserito il percorso completo dei Namespace, ovviamente è possibile utilizzare normalmente la direttiva “using”.
I due parametri del metodo .Create indicano se si desidera generare lo scritpt in console e se si desidera esportare il mapping sul db (creare fisicamente le tabelle & co…)

Per info più approfondite, il link di riferimento (su Hibernate) è:
http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/tool/hbm2ddl/SchemaExport.html

Annunci

, ,

Lascia un commento

Gestione password di rete – Windows XP – Windows networking passwords

Quando si effettua l’accesso ad una cartella condivisa, protetta da password, sulla rete locale è possibile memorizzare le credenziali in modo da non doverle inserire ad ogni accesso.

In alcune situazioni, però, può essere necessario rimuovere tali informazioni.

Per gestire le password salvate, cliccare su “Esegui…” dal menu Start e digitare il seguente comando:

rundll32.exe keymgr.dll, KRShowKeyMgr

Si aprirà una finestra con l’elenco delle password memorizzate: a questo punto sarà possibile modificarle o eliminarle!

 

Lascia un commento

Nuova sezione del Blog

Da ieri, 09 marzo 2012, è attiva la nuova sezione del blog relativa ai link utili. E’ posizionata nella barra destra del blog, sotto il widget di Facebook.

Per ora, sono tutti raggruppati sotto un’unica categoria, ma appena avrò un po’ di tempo, provvederò a suddividerli.

Bye

Lascia un commento

Nascondere una proprietà in datagridview – hide property in datagridview – C#

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.

Quando si effettua un binding diretto tra una IList (risultato da una query su database) di oggetti ed una Datagridview, automaticamente tutte le proprietà pubbliche della classe di cui gli oggetti fanno parte vengono visualizzate come colonne della dgv stessa.

In alcuni casi può essere necessario nascondere alcune colonne. I metodi sono due anche se personalmente preferisco il secondo.

//dgvElenco è il nome della DataGridView e “id” è la proprietà da nascondere
dgvElenco.Columns[“id”].Visible = false;  

Questo primo metodo porta l’impostazione di una colonna del controllo a visible = false e quando la uso, inserisco questo codice subito dopo la procedura di binding. In tal modo, però, la definizione di colonna “nascosta” viene portata nel codice, nella logica dell’applicazione, piuttosto che nella definizione della classe. Questa è invece la seconda strada percorribile.

[Browsable(false)]
public bool nonPersistente { get; set; }

Utilizzando l’attributo “Browsable” del namespace System.ComponentModel è possibile definire all’interno della classe stessa il “nascondimento” (!!!) della specifica proprietà

 

,

Lascia un commento

Aggiornare la sorgente dati – Update data source fields – Crystal Reports

Situazione: Si ha un report impostato ed associato ad una fonte dati (tabella o query). E’ necessario aggiungere/modificare campi nella fonte dati e si vuole che tale variazione si rifletta sul report. In automatico, Crystal Reports non è in grado di riflettere le modifiche effettuate sulla sorgente, neanche se si utilizza il tasto “Aggiorna”.

Vi sarebbe la possibilità di disconnettere e riconnettere la fonte dati dal report, perdendo numerose impostazioni e formattazioni.

Oppure, consigliato, è sufficiente utilizzare la funzione “Verifica Database”, accessibile dal menu “Database”. In tal modo vengono aggiornati automaticamente tutti i fields ed è poi possibile importarli sul report in modo corretto.

Nella maggior parte dei casi sarà necessario inserire le credenziali di accesso al db per avviare l’aggiornamento, a meno che il vostro database manager non lo preveda (cfr: Microsoft Access).

, ,

Lascia un commento

Visualizzare le query effettuate da un report Crystal Reports e da tutti i suoi sottoreport

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 visualizzare le query esatte che un report .rpt (creato in Crystal Reports) e tutti i suoi sottoreport generano sul database è sufficiente utilizzare all’interno dell’applicazione (Visual Basic 6, nello specifico), il seguente codice.

Nota: questo snippet è utile qualora non si disponga dell’accesso ai log del DBMS o esso non li generi (es: DB Access).

Private Sub cmdAnteprimaLibretto_Click()
Dim crAPP As CRAXDRT.Application
Dim myReport As CRAXDRT.Report
On Error GoTo err_cmdAnteprimaLibretto_Click
   
    Set crAPP = New CRAXDRT.Application
    Set myReport = crAPP.OpenReport(gen.rptLibretto)
    myReport.DiscardSavedData
    myReport.FormulaSyntax = 0
    myReport.RecordSelectionFormula = “{0Frontespizio.Matricola} = ‘” + gen.personaAttiva.Matricola
    myReport.ParameterFields.GetItemByName(“versioneApp”).AddCurrentValue gen.versioneApp
    
    ‘STAMPA DELLA QUERY PRINCIPALE <<<<<<<<
    Debug.Print myReport.SQLQueryString
    
    Dim crxSections As CRAXDRT.Sections
    Dim crxSection As CRAXDRT.Section
    Dim CRXReportObject As Object
    Dim crxSubreportObject As SubreportObject
    Dim crxSubreport As CRAXDRT.Report
     
    Set crxSections = myReport.Sections
    For Each crxSection In crxSections
        For Each CRXReportObject In crxSection.ReportObjects
           If CRXReportObject.Kind = crSubreportObject Then
             Set crxSubreportObject = CRXReportObject
             Set crxSubreport = crxSubreportObject.OpenSubreport
             ‘STAMPA DELLA SOTTOQUERY <<<<<<<<
             Debug.Print crxSubreport.SQLQueryString
             Set crxSubreport = Nothing
           End If
        Next
    Next

    Set myReport = Nothing
    Set crAPP = Nothing
    Exit Sub

err_cmdAnteprimaLibretto_Click:
    errDescr = Err.Description
    Set myReport = Nothing
    Set crAPP = Nothing
    MsgBox “Problemi durante la visualizzazione del documento” + vbCrLf + errDescr, vbCritical, gen.titolo
End Sub

, ,

Lascia un commento

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

, , ,

Lascia un commento

Jquery – Aggiungi target _blank a specifici link – add target _blank to link

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 aggiungere in modo dinamico, mediante jquery, il target=”_blank” ad alcuni link di una pagina, presenti in uno specifico contenitore (es: un <div>), ma filtrando solo i link che portano a siti esterni, utilizzare il seguente codice:

$(‘#quadroContenuti a[href^=”http://”%5D&#8217;).attr(‘target’, ‘_blank’);

A tutti i link, presenti nel testo del div “quadroContenuti”, che iniziano per “http://&#8221; (ovvero che non puntano, presumibilmente, a pagine interne del sito) viene aggiunto il nuovo target.

, ,

Lascia un commento

VBA: Indice non incluso nell’intervallo – Problema EuroTool tra file 2003 e office 2007

Riporto brevemente un problema che ho avuto e la sua (non elegantissima, lo ammetto) soluzione.

Ho un file Excel 2003 (.xls) con una macro che, al suo richiamo, apre un file di testo (csv) per importarne dati ed elaborarli.

All’interno della macro, l’esecuzione del comando “Workbooks.Open nomedelfile.txt” esegue correttamente l’apertura ma genera l’errore (valorizzazione della variabile Err) numero 9 – Indice non incluso nell’intervallo. Poichè la macro controlla che Err = 0, l’esecuzione si blocca. Controllando tra le “Espressioni di controllo”, ho notato che il componente che genera l’errore è “EuroTool”.

Poichè il file xls ha tra i suoi riferimenti (da quando è stato creato in 2003) il componente EuroTool, Excel cerca in qualche modo di caricare anche per il nuovo file aperto tale componente. Da quanto ho letto qui e li, mi è sembrato di capire che le due versioni (2003 e 2007) non siano compatibili.

Ok, ecco la drastica soluzione: dal pannello di controllo, modificare l’installazione di Office e rimuovere il componente per la conversione dell’Euro dai componenti installati in Excel.

Problema (brutalmente) risolto. 😉

 

 

, ,

1 Commento

NHibernate, utilizzo di liste comma separated per clausola WHERE IN – setParameter

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.

Se vi è la necessità di utilizzare, all’interno di una query HQL (Hibernate Query Language), la clausola “WHERE qualcosa IN”, Nhibernate fornisce la possibilità di utilizzare (anche per questo caso) le query parametriche, ovvero di evitare la creazione di query mediante concatenazione del testo.

Esempio:/* Lista di id: 3, 5, 9 */

— Concatenazione — Metodo poco elegante e poco “object oriented”

string listaId = “3, 5, 9”;  // Stringa creata mediante funzioni di concatenazione, es: string.join(…)
string myQuery = “UPDATE Assegnazione a SET a.qtaRendere = null WHERE a.id IN (” + listaId + “)”;

— Query parametrica — Bel metodo!

ArrayList listaIdAssegnazioni = new ArrayList();
listaIdAssegnazioni.Add((int)mle.idAssegnazione);  //Ripetuta per ogni id!

string myQuery = “UPDATE Assegnazione a SET a.qtaRendere = null WHERE a.id IN (:elencoId)”;
var qry = [ISession].CreateQuery(myQuery);  //con [ISession] si intende l’oggetto di tipo ISession già creato precedentemente
qry.SetParameterList(“elencoId”, listaIdAssegnazioni.ToArray(typeof(int)));
qry.ExecuteUpdate();

 

, ,

Lascia un commento