lunedì 16 marzo 2009

Web Control .. no Span

Perchè arrabbiarsi quando non è il caso di farlo ?

Il web control, se usato bene, è uno strumento potente e affidabile, ma ha i suo oscuri limiti. Il primo fra tutti e che annida tutto quello che avete implementato in uno span.

Chiaramente c'e' qualcosa che non va. Ma per tutto c'e' una spiegazione, efficente o meno.

Lo span <>testo non è altro che il tag individuato come base. Appare evidente che un tag di questo tipo non ha grande scopo ne tanto meno possa esprimere vere potenzialità.

Per implementare un web control che ne meriti di diritto il valore bisogna tuttavia partire da un controllo più concreto che un semplice span.

se da così ...
public class LoginPanel : WebControl

si passa a così ...
public class LoginPanel : Panel

Si ottiene un output sicuramente differente, il tag span scompare...

Per ogni soluzione è necessario individuare le grandezze che ne sono coinvolte, implementare un Web Control, ha i suoi benefici è può sicuramente essere riutilizzato, ma potrebbe anche essere eccessivo.

mercoledì 4 marzo 2009

Optional Attribute C#

Come posso implementare un Attributo Opzionale in una firma di un metodo ?

In C# è concettualmente difficile pensare ad una forma opzionale, ma chi arriva da VB, qualche domanda se la pone, probabilmente perchè può ancora ritenere che un parametro sia e rimanga un entità FLUTTUANTE.

Supponiamo di trovarci nella situazione di dover implementare noi un parametro opzionale.

Firma
private void Foo(string param1, string param2)
{
if ( param1 == null) {param1 ="";}
if ( param2 == null) {param2 ="";}

// resto del codice...
}

Chiamata
Foo("A","b")

Oppure
Foo("A",null)

Tecnicamente funziona, e non ci fa perdere troppo tempo.

Possiamo però trovarci nella spiacevole situazione di dover effettuare una chiamata ad un metodo già esistente non implementato da noi ...

SampleFoo sf = new SampleFoo();

sf.DoFooFoo(param1, param2);

Possiamo .. e per fortuna estendere SampleFoo e trasformare il nostro metodo sperando che tutto vada... perchè
del codice altri non v'e' certezza...

public class MyFooFoo :SampleFoo();

public void new DoFooFoo(string param1, string param2)
{
if ( param1 == null) {param1 ="";}
if ( param2 == null) {param2 ="";}
base.DoFooFoo ( param1, param2 );
}

Ed ecco fatto ..

Come sempre va data la giusta considerazione se stiamo creando una funzione per cui un parametro ci sembra o ci può sembrare opzionale.. probabilmente non stiamo considerando il fatto che si possano creare degli override... il che
sarebbe anche meglio.

Foo(string param1)

Foo(string param1, string param2)

Foo(string[] params)

Cmq.. anche questa è andata.

martedì 3 marzo 2009

Add per la IDE 2005....

Siamo sicuri che funziona tutto ma proprio tutto ??

Provate a fare questo Esperimento.

Create un AddIn (fra i progetti dell'IDE o Extensibility)
Datagli come nome My.Addin
Selezionate le opzioni per:
  • Aggiungere l'addin al menu Tools
  • Aggiungere l'addin all'avvio
Ora lanciate il vostro spelndido programma e sorpresa non carica nulla.

Due appunti di viaggio ...
Il primo vi viene recapitata un' eccezione, ma molto forviante
ARGUMENT EXCEPTION e la prima cosa a cui si può pensare e che per un motivo o per l'altro non sia avvenuto il
caricamento del nuovo "comando"

La seconda e che spulciando fra glie elementi nella firma si scopre che
_addInInstance ... ha generato un eccezione ( differente dalla precedente... )

Nel dubbio dopo "parecchie parole offensive nei confronti dell'ide" scopro che ... l'addin c'e' è caricandolo non va lo stesso !!

Il problema è il "." ossia aggiungendo il punto il compilatore va a cercare una libreria che per lui non esiste..

Ci sarà un sistema per risolvere questo "possibile" baco ??

si semplice siate disordinati .. mettete pure dei nomi a caso .. e probabilmente il vostro add in andrà !

lunedì 2 marzo 2009

Campi di una tabella .. tipo ... e chiave primaria.

Come posso ottenere tutti i campi di una tabella con l'evidenza del campo chiave?

A molti di noi sarà capitato in più di un occasione la necessità di individuare tutti i campi di una tabella, un po per creare uno statement in automatico, un po' per analisi di Db che non abbiamo disegnato noi.

Nel mio caso sto realizzando un piccolo prodotto che crea soluzioni a pacchetto partendo da un db è va tutto bene fino a che non si impatta con le Query.. e non tanto con le SELECT .. ma con le UPDATE o con le DELETE.

Mi sono quindi domandato fino a che punto spingermi nell'implementazione... arrivando alla soluzione, che
"IO PREMO UN TASTO... LUI FA' IL 90% DEL COMPITO".

Quindi torniamo a bomba sulla query , ci servono:
  1. INFORMATION_SCHEMA.COLUMNS
  2. INFORMATION_SCHEMA.TABLE_CONSTRAINTS
  3. INFORMATION_SCHEMA.KEY_COLUMN_USAGE
La prima contiene i nomi delle colonne..
la seconda contiene i nomi delle constraint..
la terza (a me sembra una estensione della seconda)

Dalla prima recuperiamo le colonne contenenti Nome e Tipo
Dalla seconda e dalla terza recuperiamo se è un identity
Ma chiaramente mettendole in Join .. ci perdiamo tutti i campi che non lo sono ..
Quindi ci basta fare una piccola Union con gli SCARTATI...

ed ecco che cosa ne viene fuori ..

select
m.column_name,
m.data_type,
x.CONSTRAINT_TYPE
from
INFORMATION_SCHEMA.COLUMNS m,
(select
CONSTRAINT_TYPE,column_name
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE b
where
a.table_name = '[tbName]'
and
b.CONSTRAINT_NAME = a.CONSTRAINT_NAME) AS x
where
m.table_name = '[tbName]'
and
x.column_name = m.column_name
UNION
select
m.column_name,
m.data_type,
' '
from
INFORMATION_SCHEMA.COLUMNS m,
(select
CONSTRAINT_TYPE,column_name
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE b
where
a.table_name = '[tbName]'
and
b.CONSTRAINT_NAME = a.CONSTRAINT_NAME) AS x
where
m.table_name = '[tbName]'
and
x.column_name <> m.column_name


Provare per credere...


Questà può essere eseguita come sqlCommand da un qualsiasi dataAdapter ed il contenuto può agevolmente essere messo
in una dataTable..

Bhe buon divertimento