Posts
103
Comments
238
Trackbacks
4
March 2006 Blog Posts
Ottenere il valore Identity da un DBDirect method di un TableAdapter

Background

  • Tabella SQL Server Express 2005 chiamata Clienti, per semplicità due colonne, una chiave primaria identità IdCliente, e due varchar, Nome e Cognome.
  • DataSet tipizzato (Clienti.xsd), DataTable (Clienti), TableAdapter (ClientiTableAdapter) e metodi DBDirect generati automaticamente con drag and drop da Object Browser
  • Aggiunta di una query di SELECT identica a quella generata automaticamente ma che accetta un parametro "IdCliente" (chiave primaria e identity) su cui filtrare
  • Una pagina contenente una FormView (o DetailsView per quel che importa) con ObjectDataSource che ottiene il parametro della query di select suddetta da QueryString per visualizzare i dati del Cliente desiderato (ci si arriva da un'altra pagina con una GridView con un HyperLink per ogni riga)
  • Se il parametro da QueryString è null si va direttamente in inserimento:

    if(!IsPostBack && Request.QueryString["IdCliente"] == null)
    {
        FormView1.ChangeMode(FormViewMode.Insert);
    }

Problemi

  • Se chiamo la pagina senza parametro da QueryString (e quindi vado in inserimento), inserisco i dati e salvo, la FormView va in EmptyDataTemplate
  • Se vado in modalità inserimento partendo dall'ItemTemplate di un altro record, dopo aver inserito i dati di quello nuovo mi torna al record che stavo visualizzando prima.

Comportamento desiderato

Indipendentemente dal percorso seguito per inserire il nuovo record vorrei che dopo averlo inserito la FormView restasse su quel record andando in ItemTemplate, cioè visualizzando i dati che ho appena inserito.

Soluzione

Nel DataSet designer aggiungo una nuova query di inserimento che ritorni il valore Identity del record appena inserito al TableAdapter in questione:

  • Click destro nel DataSet designer su ClientiTableAdapter
  • Add query -> Use SQL Statements -> Insert query
  • Ottengo una cosa di questo tipo (che è identica a quella generata automaticamente)

    INSERT INTO [Clienti] ([Nome], [Cognome])
    VALUES (@Nome@Cognome);

    SELECT IdClienteNomeCognome
    FROM Clienti WHERE (IdCliente SCOPE_IDENTITY())

  • Togliamo la seconda query e riscriviamo in questo modo:

    INSERT INTO [Clienti] ([Nome], [Cognome])
    VALUES (@Nome@Cognome);

    SELECT SCOPE_IDENTITY();
  • Chiamiamo il metodo "InserisciCliente", lo salviamo e nelle sue proprietà cambiamo l'ExcecuteMode da NonQuery a Scalar
  • Ora andiamo al nostro ObjectDataSource e gli diciamo di utilizzare quel metodo come inserimento (smart tag -> Configure DataSource)
  • Nelle sue proprietà (tab eventi) facciamo doppio click sul campo Inserted per creare un EventHandler appropriato. L'oggetto ObjectDataSourceStatusEventArgs contiene una proprietà chiamata ReturnValue, che guarda caso contiene proprio il valore IdCliente del record appena inserito. Nel mio caso lo utilizzo per fare un redirect alla stessa pagina passandoglielo come parametro di QueryString:

    protected void ObjectDataSource1_Inserted(object sender, ObjectDataSourceStatusEventArgs e)
    {
       Response.Redirect("DettagliCliente.aspx?IdCliente=" + e.ReturnValue, 
    false);
    }

powered by IMHO 1.3

posted @ Monday, March 27, 2006 6:13 AM | Feedback (0)
Espressioni di DataBinding complesse con ASP.NET

Fritz Onion ha fatto un post interessante su come gestire le espressioni di DataBinding complesse con ASP.NET, per non impazzire nel codide della pagina aspx senza IntelliSense.

http://pluralsight.com/blogs/fritz/archive/2005/12/16/17507.aspx

powered by IMHO 1.3

posted @ Sunday, March 26, 2006 3:07 AM | Feedback (0)
Come generare automaticamente le query di Insert, Update e Delete con VS2005 in presenza di JOIN

C'è ingiro un gran quantità di tutorial che spiega come sia facile utilizzare i nuovi controlli DataSource assieme a GridView, FormView, DetailsView e giù di lì con i DataSet tipizzati generati automaticamente trascinando le tabelle dalla scheda Server Explorer.

In poche parole:

  1. Crei un database e gli aggiungi una tabella o due, senza uscire da VS2005. Per esempio le tabelle Clienti e Prenotazioni, che sono in relazione sulla chiave IdCliente (int), che è foreign key per Prenotazioni.
  2. Crei un DataSet tipizzato semplicemente aggiungendo un DataSet al progetto e trascinando le tabelle Clienti e Prenotazioni.
  3. Crei una nuova webform e gli tiri dentro una GridView, una DetailsView o una FormView, creando un nuovo ObjectdataSource che faccia riferimento ad un metodo di uno dei due TableAdapters creati automaticamente in precedenza.

Il gioco è fatto, in 2 minuti si possono visualizzare, modificare eliminare ed aggiungere tuple in abbondanza.

Il problema, penso già sollevato più volte, è che rendendo così facile effettuare queste semplici operazioni si rende più complicato di quanto non fosse prima effettuare delle deviazioni dal percorso forzato che in questo modo viene più o meno imposto.

Non fraintendetemi, in realtà le cose non diventano più difficili in sé stesse, ma bisogna capire come LUI vuole che le cose siano fatte adesso, che è una deviazione dal modo precedente di pensare che a volte non è così immediata. Mi spiego meglio.

Supponiamo di aver creato una pagina contenente una FormView che visualizza le Prenotazioni.

Abbiamo tutti i nostri bei dati della prenotazione ma abbiamo anche un campo IdCliente, che essendo un intero non ci dice molto.

Visualizzare (e selezionare) il nome del cliente in modalità modifica o inserimento non è difficile, perchè basta che al posto della TextBox di default si metta una DropDownList "bindata" in modo opportuno ed il gioco è fatto, ma in visualizzazione (ossia in ItemTemplate) con una label? Non si riesce, se non con giri strani (tipo mettere una DropDownList invisibile, ma mi è venuto in mente adesso, non so se in realtà si può fare...).

Per farlo bisogna modificare le query dei TableAdapters, andando in JOIN con la tabella Clienti e tirandosi dentro un dato, tipo il nome, che sia un po' più significativo dell'Id.

Bene, andiamo a modificare la query di select della classe PrenotazioniTableAdapter, che prima era semplicemente

SELECT *
FROM Prenotazioni

facendo un join con Clienti, del tipo:

SELECT Prenotazioni.*, Clienti.NomeCliente
FROM Prenotazioni INNER JOIN Clienti ON Prenotazioni.IdCliente Clienti.IdCliente

Bello no?... magari, e invece BOOM, le query di inserimento, modifica e cancellazione non vengono più autogenerate... E allora a che cavolo mi serve? Tanto vale che faccia tutto a mano!

In questo caso, per fortuna, c'è un workaround, insiegabile a mio avviso, ma che funziona. Non è di mia invenzione ma viene da un post di Scott Guthrie (i link sono alla fine). Appena l'ho visto infatti mi sono chiesto perchè mai avesse fatto la query in questo modo, a me non hanno mai insegnato a farle così; poi provando mi sono reso conto che evidentemente è l'unico modo per far si che VS2005 riesca a generate automaticamente le query di aggiornamento, cancellazione e inserimento.

La query sopra deve essere scritta in questo modo:

SELECT Prenotazioni.*,
       (
SELECT Clienti.NomeCliente
        
FROM Clienti
        
Where IdCliente Prenotazioni.IdClienteas NomeCliente
FROM Prenotazioni

Il risultato è equivalente, ma in questo modo VS2005 riesce a generare tutti gli altri comandi da solo. Sarà che non gli piacciono i JOIN...

Sapendolo è tutto facile, ma senza saperlo la strada è un po' più lunghina eh!

LINKS: Building a DAL using Strongly Typed TableAdapters and DataTables in VS 2005 and ASP.NET 2.0, Scott Guthrie.

powered by IMHO 1.3

posted @ Saturday, March 25, 2006 9:29 PM | Feedback (0)
Estrarre il contenuto di un file .msi | DateTimePicker webcontrol

Stavo cercando un webcontrol gratuito per selezionare date e orari e siccome avevo già usato BasicDatePicker in passato e mi era piaciuto ho scaricato l'ultima versione.

BasicDatePicker è una libreria di controlli web e contiene in particolare due DateTimePicker differenti, di cui uno completamente gratuito, BasicDatePickerLight, ed uno con funzionalità più avanzate a pagamento, ma anch'esso gratuito se usato da localhost.

Consigliato!

Il download del file è disponibile solo come .msi installer, che oltre a copiare l'assembly, gli script e tutti i file di contorno, aggiunge anche i controlli alla toolbox di Visual Studio. Siccome sembra che non sia ancora compatibile con Visual Studio 2005 e non volevo rischiare di compromettere la già effimera stabilità ho trovato un'applicazione che consente di estrarre il contenuto di un file .msi proprio come se fosse un file zippato.

Si chiama "Less MSIérables", un colpo di genio quello del nome.  I link sono i seguenti:

Usandola ho trovato un piccolo bug, che ad una prima occhiata impedisce di esportare i file perchè l'event handler del bottone fa un check sulla selezione degli items, invece che sulla "checkatura".

Per aggiustarlo basta sostituire, nel metodo private void btnExtract_Click

if (this.fileList.SelectedItems.Count == 0)

con

if (this.fileList.CheckedItems.Count == 0)

oppure semplicemente selezionare anche solo un item della lista prima di cliccare il bottone.

powered by IMHO 1.3

posted @ Saturday, March 25, 2006 7:48 PM | Feedback (0)
Risorse video per ASP.NET 2.0

Da un post update di Scott Guthrie una raccolta enorme di risorse multimediali per ASP.NET 2.0.

http://lvstechie.web1000.com/

powered by IMHO 1.3

posted @ Friday, March 24, 2006 1:34 AM | Feedback (3)
Sql Server Faqs

Un sito carino con domande e risposte pronte su SQL Server: http://www.sql-server-helper.com

powered by IMHO 1.3

posted @ Wednesday, March 22, 2006 8:38 AM | Feedback (2)
Pubblicazioni MsPress superscontate

UPDATE: purtroppo, anche se i prezzi sono allettanti, le spese di spedizione sono proibitive.

Ci sono molti libri MsPress scontati del 46% su http://www.bookpool.com!

Quali comprereste?

powered by IMHO 1.3

posted @ Monday, March 20, 2006 10:16 PM | Feedback (2)
Una panoramica e qualche link su librerie Javascript

Espongono una gran quantità di funzionalità già preconfezionate, che si prendono carico di gestire la compatibilità cross-browser e tutti quegli aspetti che esulano da quello che dobbiamo effettivamente fare.

Sono le librerie Javascript, ne esistono tantissime per tanti scopi specifici o per uso generale, come la gestione degli aspetti relativi a DOM, XMLHttp, effetti, eventi ecc...

Questi link sono a due post eccezionali che elencano e categorizzano le librerie più conosciute e ne fanno una panoramica:

Mentre questi altri sono link diretti alle librerie più diffuse e (a mio parere) migliori:

powered by IMHO 1.3

posted @ Wednesday, March 15, 2006 12:28 AM | Feedback (1)
NHibernate best practices con ASP.NET

E' uscito or ora su CodeProject un interessante articolo sull'utilizzo di NHibernate con ASP.NET. Alcune cose sono un po' scopiazzate da altre parti, ma il lato positivo è che fa un bel riassunto di tutto.

SOURCE: http://www.codeproject.com/useritems/NHibernateBestPractices.asp

powered by IMHO 1.3

posted @ Sunday, March 12, 2006 5:25 PM | Feedback (0)
The Definitive Guide to db4o

Come ho scritto a pié di un post di qualche giorno fa, http://blogs.ugidotnet.org/simone%20busoli/archive/2006/03/09/36507.aspx, Jim Paterson, un autore del libro The Definitive Guide to db4o edito da Apress, mi ha scritto chiedendo di poter pubblicare nel libro un modulo http che ho scritto per gestire creazione, apertura e chiusura di client e server di Db4o.

Il libro uscirà a maggio ma è già possibile ordinarlo su Amazon.

powered by IMHO 1.3

posted @ Saturday, March 11, 2006 12:34 PM | Feedback (0)
BusyBoxDotNet 0.1.5 Released!

Release minore con alcune bug fixes.

---------------------------------------------
Bug fixes:

- fixed Javascript errors when compressing scripts
- fixed documented ASP.NET 1.1 bug making scripts render out of order (thanks to Jeff Sig)

Changes:

- changed method in class BusyBoxDesigner to show a nicer placeholder at design time (thanks to Damiano)

Features:

- added three cool images, TwoGears, GearsBig and GearsSmall, check 'em out!
---------------------------------------------

La prossima dovrebbe essere una major release con alcune novità.

powered by IMHO 1.3

posted @ Friday, March 10, 2006 9:50 PM | Feedback (0)
Blog template project per VWD 2005

Dion Olsthoorn ha realizzato un modello di progetto per VWD 2005 per la creazione di un blog. Il risultato è molto carino, ma la cosa interessante è che, parole sue, ha creato il tutto in 4 ore, ed in più senza una sola riga di codice!

SOURCE: http://weblogs.asp.net/drnetjes/archive/2006/02/10/437868.aspx

powered by IMHO 1.3

posted @ Friday, March 10, 2006 10:05 AM | Feedback (0)
DataBind performance test updated
Aggiornamento performance databinding.
posted @ Friday, March 10, 2006 9:40 AM | Feedback (0)
Value types, reference types e passaggio di parametri

Lo ammetto, conosco C# da poco e molte cose ancora mi sfuggono, soprattutto perchè il mio - abbastanza povero - background è tutto di C puro e tantissimi concetti proprio non hanno niente a che fare; ma va beh, non si smette mai di imparare. Certo che se mi concentrassi un pò più ad imparare il linguaggio invece che sbizzarrirmi solo con ASP.NET forse farei prima...

Ad ogni modo ecco due link interessanti su value e reference types ed il loro passaggio. Ci sono sfumature che sinceramente ignoravo, come la possibilità di passare entrambi per valore o per riferimento indipendendemente dal loro tipo:

Una nota off-topic, ho ricevuto un messaggio da uno degli autori di un libro su Db4o di prossima pubblicazione, "The Definitive Guide to db4o", con la richiesta di pubblicare una classe che ho creato e postato sul forum di Db4o tempo fa per la gestione delle connessioni usando ObjectClient ed ObjectServer.
In realtà non è niente di complesso, semplicemente implementa l'interfaccia IHttpModule, un pò come le best practice di NHibernate per ASP.NET, però in effetti credo sia il modo migliore di gestire il tutto e risulta molto utile.

Non mi era mai successo di vedere qualcosa scritto da me riportato su di un libro... vedremo!

powered by IMHO 1.3

posted @ Thursday, March 9, 2006 11:23 PM | Feedback (0)
Che Paura!!

Che paura, i click sui post dei blog ritornano pagine bianche... qualcuno sa cosa succede?!

powered by IMHO 1.3

posted @ Monday, March 6, 2006 11:56 PM | Feedback (9)
ASP.NET web controls ed utilities toolbox by Peter Blum

Grazie ad una segnalazione di un bug di ASP.NET 1.1 che influenza il comportamento di BusyBoxDotNet ho trovato un sito pieno di controlli web ed utilities eccezionali per ASP.NET e .NET in generale.

Molti sono gratuiti, altri a pagamento, con diverse licenze. Quelli gratuiti sono decisamente interessanti.

Una panoramica veloce di quelli (gratuiti) a cui ho potuto dare un'occhiata:

  • AutoSortArrayList:un'ArrayList con la possibilità di ordinare gli elementi;
  • Color Selectors: controlli web derivati da DropDownList che permettono di selezionare i colori; meno funzionali di quelli che ho utilizzato nella pagine di demo di BusyBoxDotNet perchè non mostrano il colore ma solo il nome, ma in compenso molto più leggeri dal punto di vista del rendering nella pagina;
  • PropertyEditor: un controllo web utilissimo che tramite reflection consente di impostare direttamente dalle pagine web le proprietà di altri controlli della pagina. Ineguagliabile per chi sviluppa controlli web e vuole creare pagine di demo; SUPER CONSIGLIATO
  • RegisterScripts: una classe che sostituisce i metodi di registrazione degli script lato client dell'oggetto Page, esposti al bug suddetto.
  • UITypeEditor classes: classi per creare editor di proprietà di controlli web, per intenderci quelle TextBox, DropDownList ecc... dell'editor di Visual Studio che consentono di impostare i valori delle proprietà dei controlli web a design time.

Il creatore di tutto ciò si chiama Peter Blum ed il suo sito è http://www.peterblum.com/Home.aspx

powered by IMHO 1.3

posted @ Monday, March 6, 2006 11:38 PM | Feedback (0)
Passare a Visual Studio 2005 ed ASP.NET 2.0

Per chi come me ha iniziato da poco l'approccio a Visual Studio 2005 c'è un'uscita dell'MSDN Magazine eccezionale per entrare nell'ottica velocemente, che fornisce una veloce panoramica delle principali novità e dei compiti comuni, completa di codice sorgente e scaricabile in formato pdf:

http://msdn.microsoft.com/msdnmag/issues/06/00/default.aspx

powered by IMHO 1.3

posted @ Sunday, March 5, 2006 12:47 AM | Feedback (0)
Web task list manager da Scott Guthrie

Un'applicazione per la gestione di liste di task scritta da nientemeno che ScottGu! Interessante soprattutto per l'utilizzo di ATLAS.

http://weblogs.asp.net/scottgu/archive/2005/12/26/433997.aspx

powered by IMHO 1.3

posted @ Saturday, March 4, 2006 8:51 AM | Feedback (0)
Rilasciato BusyBoxDotNet 0.1.4

Questo il changelog:

Bug fixes:

- fixed compatibility with ASP.NET 2.0 validation controls

- fixed overlay size, box centering and scrollbars problems

- fixed box shifting in Firefox And Netscape

- fixed opaque overlay in Opera, now a mono color transparent png is shown (in the future I will include chance to choose the background's color)

- fixed null reference exception when using helper controls with masterpages (iteration through controls)

Changes:

- lightened browser sniffing script

Features:

- added a public property, CompressScripts, which allows to choose whether to compress the scripts sent to the client. Average 6kB saved.

http://busybox.sourceforge.net

NOTE: Dalla prossima versione la compatibilità con ASP.NET 2.0 sarà decisamente maggiore, e ci saranno notevoli modifiche, tra cui la possibilità di scegliere dei template per il layout del controllo BusyBox oltre a quelli presenti ora e quella di posizionare il controllo all'interno della pagina.

Per suggerimenti e richieste non esitate a scrivermi!

powered by IMHO 1.3

posted @ Thursday, March 2, 2006 1:37 AM | Feedback (7)
[OT] Survey Ebay

Oggi ho ricevuto un messaggio email dal servizio clienti di Ebay.it che mi proponeva di rispondere alle domande di un breve questionario per dare una valutazione in merito allo stesso servizio clienti ed alla qualità dell'assistenza ricevuta.

I due link presenti nella mail consentivano rispettivamente di compilare il questionario in modo standard oppure in modo anonimo. Vi riporto i due link pari pari (ho solo sostituito il mio user_id con uno fittizio):

  • Link standard:

http://surveys.benchmarkportal.com/ebayeu/survey.taf?survey_id=670&user_id=xxxxxx

  • Link per la compilazione anonima:

http://surveys.benchmarkportal.com/ebayeu/survey.taf?survey_id=670&user_id=xxxxxx&anon=yes

UHM....

powered by IMHO 1.3

posted @ Thursday, March 2, 2006 12:17 AM | Feedback (0)
Trovare un controllo nella gerarchia della pagina

Con ASP.NET 2.0 la gerarchia della pagina è molto più frequentemente multilivello di quanto non succedesse con la versione predecende, soprattutto quando si utilizzano le masterpages. Di conseguenza, quando si vuole ottenere un riferimento ad un controllo della pagina dato il suo ID, non è sufficiente utilizzare il metodo FindControl() dell'oggetto Page perchè esso effettua una ricerca solo tra i diretti discendenti della pagina, e non effettua una ricerca ricorsiva all'interno di controlli che a loro volta ne contengono altri.

Per ottenere un riferimento ad un controllo posizionato in un livello arbitrario all'interno della pagina si può utilizzare questo metodo, che effettua una ricerca ricorsiva in tutti i controlli della pagina.

Non ho avuto modo di verificare questa affermazione, ma in pagine con tanti controlli innestati, ad esempio quando abbiamo DataGrid o DataList, può essere che un metodo di questo tipo introduca un certo overhead.

public static Control FindControl(string controlID, ControlCollection controls)
{
    
foreach (Control control in controls)
    {
        
if(control.ID == controlID)
            
return control;

        
if(control.HasControls())
        {
            Control nestedControl = FindControl(controlID, control.Controls);

            
if(nestedControl != null)  
                
return nestedControl;
        }
    }
    
return null;
}

I parametri che accetta sono naturalmente una stringa contenente l'ID del controllo da trovare ed una ControlCollection all'interno della quale cercare. Per cercare all'interno della ControlCollection principale, ossia quella della pagina, la chiamata al metodo dovrà essere di questo tipo:

Control foundControl = FindControl(foundControlID, Page.Controls);

powered by IMHO 1.3

posted @ Wednesday, March 1, 2006 10:26 AM | Feedback (2)
News

Scopri CS2, il mio progetto universitario per l'indicizzazione e la ricerca di codice sorgente personale costruito su Lucene.Net.

Windows Developer Power Tools

Potete trovare il mio progetto BusyBoxDotNet nel libro Windows Developer Power Tools, pubblicato da O'Reilly, per il quale ho scritto l'intero capito dedicato.

Sono stato nominato dVP 2008, un riconoscimento per l'apporto fornito alla comunità del progetto db4o.