En un projecte web, una part molt important i que acostuma a consumir molt temps de programació és recuperar els valors d'un formulari al servidor quan es rep un submit (ja sigui per Ajax o normal) per posar-los en una estructura que permeti guardar-los, normalment a una BBDD.
Per evitar-ho el que es fa és una llista dels camps a recuperar (variable "Deserialitzar" que és un array de clsCamp). Es a dir de tots els camps que pertanyen a una taula es marquen els que es volen deserialitzar (recuperar) i el software que genera la classe els inclou en aquesta llista (variable). Així el que s'acostuma a fer és invocar a la funció deserialitzar i després fer un UPD o un INS. Durant la deseriatlització es verifica el tipus dels valors que es reben des del formulari web.
La funció genèrica que realitza aquest procés està a la clsDades, però la llista de camps a deserialitzar està a cada classe especifica (derivada), la que correspon a cada taula. La funció Deserialitzar rep el Request (per obtenir les dades) i un DataRow o un Dictionary (acostuma a fer-se servir el DataRow per updates i l'altra per inserts).
Com sempre el codi associat, primer la versió Dictionary:
publicDictionary<string, string> Deserialize(HttpRequest Req)
{
Dictionary<string, string> Values = newDictionary<string, string>();
string ValorCamp;
decimal ValorDecimal;
Int64 ValorInt64;
int ValorInt;
DateTime ValorData;
foreach (clsCamp Camp in Deserialitzar)
{
ValorCamp = Req[Camp.NomCamp];
switch (Camp.Tipus)
{
caseTipus.bit:
if (string.IsNullOrEmpty(Req[Camp.NomCamp])) Values.Add(Camp.NomCamp, "False");
else Values.Add(Camp.NomCamp, "True");
break;
caseTipus.bigint:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (Int64.TryParse(ValorCamp, out ValorInt64)) Values.Add(Camp.NomCamp, ValorCamp);
elsethrownewException("El camp "
+ Camp.NomCamp + " no té un valor sencer de 64 bits vàlid");
}
break;
caseTipus.tint:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (int.TryParse(ValorCamp, out ValorInt)) Values.Add(Camp.NomCamp, ValorCamp);
elsethrownewException("El camp "
+ Camp.NomCamp + " no té un valor sencer vàlid");
}
break;
caseTipus.dec:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (decimal.TryParse(ValorCamp, out ValorDecimal)) Values.Add(Camp.NomCamp, ValorCamp);
elsethrownewException("El camp "
+ Camp.NomCamp + " no té un valor numèric vàlid");
}
break;
caseTipus.datetime:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (DateTime.TryParse(ValorCamp, out ValorData)) Values.Add(Camp.NomCamp, ValorCamp);
elsethrownewException("El camp "
+ Camp.NomCamp + " no té una data vàlida");
}
break;
caseTipus.varchar:
caseTipus.chr:
caseTipus.nchar:
caseTipus.nvarchar:
if (!string.IsNullOrEmpty(ValorCamp))
{ //Els varchar(max) i nvarchar(max) tenen longitud -1 i no s'ha de verificar la seva longitud.if (ValorCamp.Length > Camp.Longitud && Camp.Longitud != -1)
thrownewException("Camp " + Camp.NomCamp + " supera longitud permesa");
else Values.Add(Camp.NomCamp, ValorCamp);
}
break;
}
}
return Values;
}
Ara la versió DataRow:
publicvoid Deserialize(DataRow DR, HttpRequest Req)
{
string ValorCamp;
decimal ValorDecimal;
int ValorInt;
Int64 ValorInt64;
DateTime ValorData;
foreach (clsCamp Camp in Deserialitzar)
{
ValorCamp = Req[Camp.NomCamp];
switch (Camp.Tipus)
{
caseTipus.bit:
if (string.IsNullOrEmpty(Req[Camp.NomCamp])) DR[Camp.NomCamp] = false;
else DR[Camp.NomCamp] = true;
break;
caseTipus.bigint:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (Int64.TryParse(ValorCamp, out ValorInt64)) DR[Camp.NomCamp] = ValorCamp;
elsethrownewException("Camp "
+ Camp.NomCamp + " no té un valor sencer de 64 bits vàlid");
}
else
{
if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
elsethrownewException("Camp "
+ Camp.NomCamp + " no permet valors nulls");
}
break;
caseTipus.tint:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (int.TryParse(ValorCamp, out ValorInt)) DR[Camp.NomCamp] = ValorCamp;
elsethrownewException("Camp "
+ Camp.NomCamp + " no té un valor sencer vàlid");
}
else
{
if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
elsethrownewException("Camp "
+ Camp.NomCamp + " no permet valors nulls");
}
break;
caseTipus.dec:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (decimal.TryParse(ValorCamp, out ValorDecimal)) DR[Camp.NomCamp] = ValorCamp;
elsethrownewException("Camp "
+ Camp.NomCamp + " no té un valor numèric vàlid");
}
else
{
if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
elsethrownewException("Camp "
+ Camp.NomCamp + " no permet valors nulls");
}
break;
caseTipus.time:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (string.IsNullOrEmpty(Camp.Format))
{
if (DateTime.TryParseExact(ValorCamp, "HH:mm",
System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.None,
out ValorData)) DR[Camp.NomCamp] = ValorCamp;
elsethrownewException("Camp "
+ Camp.NomCamp + " no té una hora vàlida");
}
else
{
if (DateTime.TryParseExact(ValorCamp,
Camp.Format,
System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.None,
out ValorData)) DR[Camp.NomCamp] = ValorCamp;
elsethrownewException("Camp "
+ Camp.NomCamp + " no té una hora vàlida");
}
}
else
{
if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
elsethrownewException("Camp "
+ Camp.NomCamp + " no permet valors nulls");
}
break;
caseTipus.datetime:
caseTipus.date:
if (!string.IsNullOrEmpty(ValorCamp))
{
if (DateTime.TryParse(ValorCamp, out ValorData)) DR[Camp.NomCamp] = ValorCamp;
elsethrownewException("Camp "
+ Camp.NomCamp + " no té una data vàlida");
}
else
{
if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
elsethrownewException("Camp " + Camp.NomCamp + " no permet valors nulls");
}
break;
caseTipus.varchar:
caseTipus.chr:
caseTipus.nchar:
caseTipus.nvarchar:
if (!string.IsNullOrEmpty(ValorCamp))
{ //Els varchar(max) i nvarchar(max) tenen longitud -1 i no s'ha de verificar la seva longitud.if (ValorCamp.Length > Camp.Longitud && Camp.Longitud != -1)
thrownewException("Camp " + Camp.NomCamp + " supera longitud permesa");
else DR[Camp.NomCamp] = ValorCamp;
}
else
{
if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
elsethrownewException("Camp " + Camp.NomCamp + " no permet valors nulls");
}
break;
}
}
}
#08/01/2014 12:32 Programació C# Autor: Alex Canalda
Peli insulsa i absurda on les hagi, tracta d'uns que fent algo amb el seu ADN tenen el poder de sobreescalfar-se i regenerar-se i si no es controlen exploten. També les lleis de la física s'ignoren al llarg de l'ample de la pel·licula. Els girs de guió són senzills perquè la gent no es perdi.
Però bé és Ironman i endavant les atxes. Es deixa veure si no es presta gaire atenció, els efectes estan molt bé.
Típica combinació de colors blaus-grocs en el poster
Seguint amb la sèrie de la clsDades aquesta és la funció que s'encarrega d'obtenir de la BBDD una pàgina de registres, ordenats d'una forma determinada i filtrats si cal.
Fa servir la SP QUERY per fer-ho, en realitat la SP és la que fa tota la feina, la clsDades només té la invocació a aquesta SP. Així que ha de fer servir la variable ParamsQUERY per informar-ne els paràmetres, a més a més hi ha uns paràmetres fixes que són:
SortColumn: Columna per la que s'ordena (haurà de coincidir amb alguna de les que té la SP). En el literal de la columna també està informat el sentit, ascendent o descendent.
PageSize: Mida de la pàgina, en número de registres, 5, 10, 20...
PageNum: Número de la pàgina que es vol, la 1, 2, 3...
A més a més d'aquests paràmetres d'entrada la SP té un valor important de sortida que cal recollir, el número total de registres un cop filtrat (sense paginar). Es podria fer amb un COUNT però seria fer el filtre dues vegades, dins de la SP ja es calcula i llavors només es fa un cop. Aquest valor és important per calcular el número total de pàgines donat un filtre a una taula. En la funció és el paràmetre NumTotRegs, que està declarat de sortida. Com sempre el codi:
Seguint amb la sèrie de la clsDades aquesta és la funció que s'encarrega de contar quants registres hi ha a la BBDD que compleixin un cert criteri.
Fa servir la SP COUNT per fer-ho. Fa servir els mateixos paràmetres que el GET (que són els mateixos que el QUERY), es a dir es poden aplicar els mateixos criteris de cerca que quan es fa un GET però enlloc d'obtenir registres retorna només el número de registres. Això és útil quan hi ha una barra de progres i es vol saber el número total de registres, o quan s'ha de calcular el número de pàgines...
Fa servir ParamsQUERY per informar els seus paràmetres. La funció només admet un Dictionary per informar els seus paràmetres, no cal que siguin tots, només el que volem filtrar. Com sempre el codi:
El Jhonny Depp sempre li cauen bé els personatges estrafolaris, i aquí fa el paper d'indi penjat que parla amb esperits... Com anell al dit. De fet sembla més que el protagonista sigui ell i no el "lone rider" (llanero solitario).
La peli és un xic llarga, però bé, com m'agraden els paisatges no tinc problema, posen paisatges western molt bonics.
L'acció tracta de la construcció del ferrocarril, uns dolents molt dolents que volen treure un munt de plata de territori indi, i la cavalleria que està pel mig. El "llanero solitario" intenta fer justícia per la mort del seu germà, que era un "ranger de texas" al que els dolents de la plata maten.
Hi ha varies escenes que m'han recordat molt a Indiana Jones, sobre tot una que van dos vagons per vies diferents i lluiten entre ells (com les vagonetes a la mina del temple maleït).
Per passar l'estona, veure paisatges i algo de western (als que tinc certa debilitat).
Curiosament la noia que apareix a la foto té poc protagonisme a la peli.
Seguint amb la sèrie de la clsDades aquesta és la funció que s'encarrega d'esborrar un registre a la BBDD.
Fa servir la SP DEL per fer-ho. Així que ha de fer servir la variable ParamsDEL per informar-ne els paràmetres. Normalment aquests paràmetres són la primary key (PK), de tal manera que només s'esborra un registre. Existeix en 2 sabors diferents, un que rep un DataRow i un altra que rep un objecte Dictionary (on les Keys són els noms dels camps i els Values el valor).
Igual que la funció INS, aquesta també invalida la cache.
Com sempre el codi, primer el que rep el Dictionary:
Pel·licula de diumenge a la tarda on el Jason Statham fa de lladre superprofessional al que els seus cutre-compinches el traicionen. Un cop mig recuperat (un superprofessional amb mitja recuperació té prou, la resta de mortals anem a la fisio durant anys...) decideix venjar-se. Durant el següent cop dels cutre-compinches es venja amb ajuda de la Jennifer Lopez, i com és superprofessional no hi ha res entre ells (ell ja està "casat") però com l'ha ajudat li dóna part del botí (com faria tothom). Distreu, és previsible, no es fa llarga, mola veure a dolents machacats, perfecte per matar una tarda.
Curiós que ell a la foto fa cara de teulada, com si li fes pena matar dolents
Seguint amb la sèrie de la clsDades aquesta és la funció que s'encarrega d'actualitzar un registre a la BBDD.
Fa servir la SP UPD per fer-ho. Així que ha de fer servir la variable ParamsUPD per informar-ne els paràmetres. Existeix en 2 sabors diferents, un que rep un DataRow i un altra que rep un objecte Dictionary (on les Keys són els noms dels camps i els Values el valor).
Igual que la funció INS, aquesta també invalida la cache.
Com sempre el codi, primer el que rep el Dictionary:
Aquest és el cinqué llibre de la serie dels reis maleïts. [Spoilers] Comença fent un resum de com acaba l'anterior rei, que a pesar de ser un bon rei va tenir mala sort, tant el clima (collites), fets (una horda de "pastorcillos"), i que va beure aigua en mal estat i la va palmar. Un cop liquidat l'anterior rei d'una forma algo ràpida (encara que és el protagonista del llibre anterior) es centra en el tonto que el succeeix i qui en realitat governa és Carlos de Valois. També hi ha tota una trama anglesa, que va prenent protagonisme i en la que es centra tota l'acció a partir la meitat del llibre. Tracta de la filla de Felip "el Hermoso" (el del primer llibre), que surt al primer llibre denunciant a les seves cunyades, i torna a aparèixer ara. Narra com aconsegueix aliats per destruir al seu marit Eduard II (gay total al llibre) i com finalment torna a Anglaterra, el deposa i corona al seu fill Eduard III. També narra com liquiden al rei empalant-lo amb un ferro roent. De fet és la mateixa història que a la serie "Un mundo sin fin", encara que allí pinten les coses diferents.
També apareix el Guccio i els Tolomei que tenen guardat el fill legitim del Turbulento i que el Guccio encara creu que és seu i que la Maria de Cressay no l'estima.
El llibre m'ha agradat molt, i tots els personatges estan molt ben tractats i no només això si no que són "de veritat".