The official Fatica Labs Blog! RSS 2.0
# Wednesday, 19 May 2010

In the spirit of “Release early. Release often. And listen to your customers” ( cit. ), even if not so early in term of time since the preview, I decided to release a first drop of the “HQL Intellisense thing” I’m working on. The current version is just able to load an existing mapping assembly, a configuration, help us to write an hql query, submit it to NH and see some results. Here an overall screenshot:

s1

To use it you need to download the bits, and then “create a project” a project is, in the NH Workbench world, a bounch of file representing what we are working on ( and actually is a project in the MSBUILD world. To use the tool now we need at least a working NH configuration file ( your app.config or web config ) and one or more mapping assembly(ies). You add the files to the project by right clicking the project tree:s2

After you added the file you can save the project, so it can be reopened when needed. Please note that the mapping assembly has to be opened from a location containing all the required dependencies ( usually the application folder, or the bin folder ).

After the project is created, you need to compile it before starting to write the queries:

s3

You can compile the project by clicking the button on the toolbar as shown in the picture Fig3

 

 

 

Compiling the project should produce a report in the log area:

s4

If you find the report too verbose, you can uncheck some of the button in the log toolbar. After a successful compilation, we can open a query (hql) document:

s5

This will open a pane in the document area in which we can write HQL queries with some intellisense/auto-completion. Plaese note that, for have the entity completion, after the “from” keyword we need to press ctrl+space to see the completion combo.

 

 

 

 

 

 

s6

Here an example HQL document. After a valid query is done we can submit it to NH and see the result:

 

The “play” button is enabled only if a valid query ( no errors ) is written in the document. The first and count places are useful to limit the query results.

s7 By pressing the play button, you will be able to se the query results ( if any ):

s8

Next steps:

  • Solve the bugs till now
  • Add supports for hbm2net, so user can write mapping and immediately see it at works.

Enjoy !

Wednesday, 19 May 2010 16:30:52 (GMT Daylight Time, UTC+01:00)  #    Comments [10] - Trackback
Code GEneration | NHibernate

There was a bug in the many-to-many strategy, causing a null reference exception. The bug was solved, and a current snapshot of db2hbm can be found here as usual.

db2hbm

Wednesday, 19 May 2010 10:13:46 (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Code GEneration | NHibernate

# Friday, 14 May 2010

Un problema veramente divertente: collegandomi ad Oracle Express, ma probabilmente lo stesso accade con l’edizione ufficiale, la connessione mi falliva con:


Oracle.DataAccess.Client.OracleException : ORA-12154: TNS: impossibile risolvere l'identificativo di connessione specificato

 

ovvero

 

TNS:could not resolve service name

sulla stessa macchina un’altra applicazione, con la medesima connection string funzionava perfettamente. Ora l’applicazione non funzionante era un test con NUnit, e sulle macchine a 64 bit il setup installa in ProgramFiles( x86 ). Pare che il client Oracle faccia qualche considerazione sulla directory in cui si trova il chiamante, e questo fallisca se ci sono dei caratteri strani ( secondo Oracle ) come le parentesi.Spostando NUnit in un percorso senza parentesi nel nome, tutto funziona. Indagando sul web, ho trovato una conferma al problema ivi descritto. Ho perso la mattinata appresso ad una stupidaggine :-~.

Friday, 14 May 2010 13:18:52 (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Programmin

# Thursday, 13 May 2010

clip_image001

 

Fabio Maulo propone un sondaggio per la versione di NH in uscita. Dovrà compilare su Fx 3.5 o 4.0 ?

Personalmente preferirei ancora un uscita in 3.5. Votate!

Thursday, 13 May 2010 07:53:23 (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
NHibernate

# Thursday, 06 May 2010

Può essere interessante, quando si sviluppano e si utilizzano in modalità test servizi di windows, avere una modalità di funzionamento “Console”, che ci permetta di lanciare il nostro servizio come una console application per vedere “cosa fa” senza stare lì ad aprire ogni secondo il file di log. Ovviamente dobbiamo prevedere un sistema di logging che scriva anche sulla console  (se per loggare usate log4net, allora basta mettere un ConsoleAppender, o meglio ancora, un ColoredConsoleAppender). Per farlo basta creare la solita WindowsServiceApplication, avendo però cura di impostare il progetto come console:

consoleapp

Il main dovrà essere modificato in questoi modo

   1:          static void Main(string[] args)
   2:          {
   3:              if (!Environment.UserInteractive)
   4:              {
   5:                  log.Info("Starting as a service...");
   6:                  ServiceBase[] ServicesToRun;
   7:                  ServicesToRun = new ServiceBase[] 
   8:                  { 
   9:                      new Service1() 
  10:                  };
  11:                  ServiceBase.Run(ServicesToRun);
  12:              }
  13:              else
  14:              {
  15:                  log.Info("Starting as a console...");
  16:                  var s = new Service1(log);
  17:                  s.GetType().GetMethod(   "OnStart"
  18:                                          ,BindingFlags.Instance|BindingFlags.NonPublic
  19:                                          ).Invoke(s,new object[]{args});
  20:                  Console.WriteLine("Press enter to exit the console mode");
  21:                  Console.ReadLine();
  22:                  s.GetType().GetMethod(      "OnStop"
  23:                                              , BindingFlags.Instance | BindingFlags.NonPublic
  24:                                              ).Invoke(s, null);
  25:              }
  26:          }
 
 
 

Alla linea 3 il codice che ci permette di capire se siamo stati lanciati da uno user “vero” o dal sistema,e quindi scegliamo se partire nel modo tradizionale oppure in modalità console. Se a questo codice aggiungiamo anche la possibilità di interpretare la command line e di autoinstallarsi, abbiamo un buon segmento di codice da riusarsi per ogni WindowService.

Thursday, 06 May 2010 08:23:11 (GMT Daylight Time, UTC+01:00)  #    Comments [3] - Trackback
Recipes

# Monday, 03 May 2010

Quando andiamo in deploy con un servizio C# abbiamo l’opzione di utilizzare installutil.exe per “installare” il servizio, ovvero far si che compaia nel Service Control Manager. Tuttavia è possibile fare la stessa cosa programmaticamente, e farlo semplifica la vita a chi installera il vostro servizio. L’idea è che il main del servizio risponda a dei comandi sulla cmd line, per esempio “—install” o “—uninstall” in modo  che l’unico strumento che serve in fase di deploy sia il servizio stesso.

Ecco dunque la ricetta: si deve intendere “ricetta” come un segmento di codice troppo piccolo da essere messo in una libreria, ma troppo importante per essere dimenticato :-)

La ricetta in oggetto è quindi composta di due funzioni:

Install()

   1:          private static void Install()
   2:          {
   3:              ServiceProcessInstaller ProcesServiceInstaller = new ServiceProcessInstaller();
   4:              ProcesServiceInstaller.Account = ServiceAccount.LocalSystem;
   5:             
   6:              ServiceInstaller ServiceInstallerObj = new ServiceInstaller();
   7:              InstallContext Context = new System.Configuration.Install.InstallContext();
   8:              String path = String.Format("/assemblypath={0}", Assembly.GetExecutingAssembly().Location);
   9:              String[] cmdline = { path };
  10:   
  11:              Context = new System.Configuration.Install.InstallContext("", cmdline);
  12:              ServiceInstallerObj.Context = Context;
  13:              ServiceInstallerObj.DisplayName = "Nome da visualizzare in SCM";
  14:              ServiceInstallerObj.Description = "Descrizione del servizio";
  15:              ServiceInstallerObj.ServiceName = "NomeDelServizio";
  16:              ServiceInstallerObj.StartType = ServiceStartMode.Automatic;
  17:              ServiceInstallerObj.Parent = ProcesServiceInstaller;
  18:   
  19:              System.Collections.Specialized.ListDictionary state = new System.Collections.Specialized.ListDictionary();
  20:             
  21:              ServiceInstallerObj.Install(state);
  22:          }

Uninstall()

   1:          private static void Uninstall()
   2:          {
   3:              ServiceProcessInstaller ProcesServiceInstaller = new ServiceProcessInstaller();
   4:              ProcesServiceInstaller.Account = ServiceAccount.LocalSystem;
   5:   
   6:              ServiceInstaller ServiceInstallerObj = new ServiceInstaller();
   7:              InstallContext Context = new System.Configuration.Install.InstallContext();
   8:              String path = String.Format("/assemblypath={0}", Assembly.GetExecutingAssembly().Location);
   9:              String[] cmdline = { path };
  10:   
  11:              Context = new System.Configuration.Install.InstallContext("", cmdline);
  12:              ServiceInstallerObj.Context = Context;
  13:              ServiceInstallerObj.ServiceName = "ServiceName";
  14:              ServiceInstallerObj.Uninstall(null);
  15:   
  16:          }
 

Importante: Per entrambe le funzioni, ServiceName deve essere uguale alla proprietà ServiceName del servizio che si vuole installare.

Monday, 03 May 2010 10:46:55 (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Recipes

My Stack Overflow
Contacts

Send mail to the author(s) E-mail

Tags
profile for Felice Pollano at Stack Overflow, Q&A for professional and enthusiast programmers
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2017
Felice Pollano
Sign In
Statistics
Total Posts: 157
This Year: 0
This Month: 0
This Week: 0
Comments: 124
This blog visits
All Content © 2017, Felice Pollano
DasBlog theme 'Business' created by Christoph De Baene (delarou) and modified by Felice Pollano
Nike Winkels Nederland Outlet Nike Nederland Store Outlet Nike Nederland 2015 Outlet Nike Outlet Online Nike Sneakers Outlet