Articoli con tag Snippet
Esportare schema del db da NHibernate – NHibernate SchemaExport
Pubblicato da Diadema Sinergie in Informatica il 26/03/2012
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
Nascondere una proprietà in datagridview – hide property in datagridview – C#
Pubblicato da Diadema Sinergie in Informatica il 27/02/2012
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à
Visualizzare le query effettuate da un report Crystal Reports e da tutti i suoi sottoreport
Pubblicato da Diadema Sinergie in Informatica il 23/02/2012
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
NextSet myReport = Nothing
Set crAPP = Nothing
Exit Suberr_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
Passare il contenuto di un file in standard input -stdin- ad un’applicazione
Pubblicato da Diadema Sinergie in Informatica il 23/02/2012
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 secondiif (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;
}
Jquery – Aggiungi target _blank a specifici link – add target _blank to link
Pubblicato da Diadema Sinergie in Informatica il 24/01/2012
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’).attr(‘target’, ‘_blank’);
A tutti i link, presenti nel testo del div “quadroContenuti”, che iniziano per “http://” (ovvero che non puntano, presumibilmente, a pagine interne del sito) viene aggiunto il nuovo target.
NHibernate, utilizzo di liste comma separated per clausola WHERE IN – setParameter
Pubblicato da Diadema Sinergie in Informatica il 30/12/2011
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();
Aggiornamento textbox in binding, quando si modifica il valore dell’oggetto – update textbox binding
Pubblicato da Diadema Sinergie in Informatica il 20/12/2011
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.
Qualora sia necessario forzare il valore di un oggetto messo in Binding con una textbox e si voglia riscontrare immediatamente tale cambiamento nel testo del controllo, eseguire il comando “ReadValue()”
i_assegnazione.qtaRendere = qtaRendereOriginale;
txtQtaRendere.DataBindings[0].ReadValue();
Backup Mysql con mysqldump.exe – Parametri dell’applicazione
Pubblicato da Diadema Sinergie in Informatica il 24/11/2011
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 secondiif (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;
}
Inserire in una colonna di datagridview una immagine
Pubblicato da Diadema Sinergie in Informatica il 27/10/2011
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.
Questo stralcio di codice consente di inserire, in una datagridview (C# – Windows Forms), una colonna contenente immagini.
Nell’esempio sono stati utilizzati dei pallini colorati, per indicare lo stato dei singoli record visualizzati.
Viene inoltre fornito il codice per modificare, a runtime, l’immagine della specifica riga nella colonna di immagini.
DataGridViewImageColumn colonna = new DataGridViewImageColumn();
colonna.ImageLayout = DataGridViewImageCellLayout.Normal;
colonna.Image = new System.Drawing.Bitmap(Properties.Resources.pallino_rosso);
dgvConvocazioni.Columns.Insert(1, colonna);
dgvConvocazioni.Columns[1].HeaderText = “”;
dgvConvocazioni.Columns[1].Width = 20;
Modifica a RunTime
dgvConvocazioni.Rows[1].Cells[5].Value = New System.Drawing.Bitmap(Properties.Resources.pallino_verde)
Se il DataSource della dgv è una lista (Ilist) di oggetti, è sufficiente inserire tra le proprietà della classe una Bitmap.
Segue il codice di definizione della classe, la cui lista rappresenta il DataSource.
public class DatagridListElementConvocazioni
{
public int id { get; set; }
[DisplayName(” “)] // Richiede: using System.ComponentModel;
public System.Drawing.Bitmap stato { get; set; }
[DisplayName(“Data Invio”)]
public string dataInvio { get; set; }
…
public DatagridListElementConvocazioni(……)
{
….
this.stato = new System.Drawing.Bitmap(Properties.Resources.pallino_bianco);
…
}
}