| 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: 
public Dictionary<string, string> Deserialize(HttpRequest Req)
{
    Dictionary<string, string> Values = new Dictionary<string, string>();
    string ValorCamp;
    decimal ValorDecimal;
    Int64 ValorInt64;
    int ValorInt;
    DateTime ValorData;
    foreach (clsCamp Camp in Deserialitzar)
    {
	ValorCamp = Req[Camp.NomCamp];
	switch (Camp.Tipus)
	{
	    case Tipus.bit:
		if (string.IsNullOrEmpty(Req[Camp.NomCamp])) Values.Add(Camp.NomCamp, "False");
		else Values.Add(Camp.NomCamp, "True");
		break;
	    case Tipus.bigint:
		if (!string.IsNullOrEmpty(ValorCamp))
		{
		    if (Int64.TryParse(ValorCamp, out ValorInt64)) Values.Add(Camp.NomCamp, ValorCamp);
		    else throw new Exception("El camp "
			+ Camp.NomCamp + " no té un valor sencer de 64 bits vàlid");
		}
		break;
	    case Tipus.tint:
		if (!string.IsNullOrEmpty(ValorCamp))
		{
		    if (int.TryParse(ValorCamp, out ValorInt)) Values.Add(Camp.NomCamp, ValorCamp);
		    else throw new Exception("El camp "
			+ Camp.NomCamp + " no té un valor sencer vàlid");
		}
		break;
	    case Tipus.dec:
		if (!string.IsNullOrEmpty(ValorCamp))
		{
		    if (decimal.TryParse(ValorCamp, out ValorDecimal)) Values.Add(Camp.NomCamp, ValorCamp);
		    else throw new Exception("El camp "
			+ Camp.NomCamp + " no té un valor numèric vàlid");
		}
		break;
	    case Tipus.datetime:
		if (!string.IsNullOrEmpty(ValorCamp))
		{
		    if (DateTime.TryParse(ValorCamp, out ValorData)) Values.Add(Camp.NomCamp, ValorCamp);
		    else throw new Exception("El camp "
			+ Camp.NomCamp + " no té una data vàlida");
		}
		break;
	    case Tipus.varchar:
	    case Tipus.chr:
	    case Tipus.nchar:
	    case Tipus.nvarchar:
		if (!string.IsNullOrEmpty(ValorCamp))
		{   
		    if (ValorCamp.Length > Camp.Longitud && Camp.Longitud != -1)
			throw new Exception("Camp " + Camp.NomCamp + " supera longitud permesa");
		    else Values.Add(Camp.NomCamp, ValorCamp);
		}
		break;
	}
    }
    return Values;
}
 Ara la versió DataRow: 
public void 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)
	{
	    case Tipus.bit:
		if (string.IsNullOrEmpty(Req[Camp.NomCamp])) DR[Camp.NomCamp] = false;
		else DR[Camp.NomCamp] = true;
		break;
	    case Tipus.bigint:
		if (!string.IsNullOrEmpty(ValorCamp))
		{
		    if (Int64.TryParse(ValorCamp, out ValorInt64)) DR[Camp.NomCamp] = ValorCamp;
		    else throw new Exception("Camp "
			 + Camp.NomCamp + " no té un valor sencer de 64 bits vàlid");
		}
		else
		{
		    if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
		    else throw new Exception("Camp "
			+ Camp.NomCamp + " no permet valors nulls");
		}
		break;
	    case Tipus.tint:
		if (!string.IsNullOrEmpty(ValorCamp))
		{
		    if (int.TryParse(ValorCamp, out ValorInt)) DR[Camp.NomCamp] = ValorCamp;
		    else throw new Exception("Camp "
			+ Camp.NomCamp + " no té un valor sencer vàlid");
		}
		else
		{
		    if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
		    else throw new Exception("Camp "
			+ Camp.NomCamp + " no permet valors nulls");
		}
		break;
	    case Tipus.dec:
		if (!string.IsNullOrEmpty(ValorCamp))
		{
		    if (decimal.TryParse(ValorCamp, out ValorDecimal)) DR[Camp.NomCamp] = ValorCamp;
		    else throw new Exception("Camp "
			+ Camp.NomCamp + " no té un valor numèric vàlid");
		}
		else
		{
		    if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
		    else throw new Exception("Camp "
			+ Camp.NomCamp + " no permet valors nulls");
		}
		break;
	    case Tipus.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;
			else throw new Exception("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;
			else throw new Exception("Camp "
			    + Camp.NomCamp + " no té una hora vàlida");
		    }
		}
		else
		{
		    if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
		    else throw new Exception("Camp "
			+ Camp.NomCamp + " no permet valors nulls");
		}
		break;
	    case Tipus.datetime:
	    case Tipus.date:
		if (!string.IsNullOrEmpty(ValorCamp))
		{
		    if (DateTime.TryParse(ValorCamp, out ValorData)) DR[Camp.NomCamp] = ValorCamp;
		    else throw new Exception("Camp "
			+ Camp.NomCamp + " no té una data vàlida");
		}
		else
		{
		    if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
		    else throw new Exception("Camp " + Camp.NomCamp + " no permet valors nulls");
		}
		break;
	    case Tipus.varchar:
	    case Tipus.chr:
	    case Tipus.nchar:
	    case Tipus.nvarchar:
		if (!string.IsNullOrEmpty(ValorCamp))
		{   
		    if (ValorCamp.Length > Camp.Longitud && Camp.Longitud != -1)
			throw new Exception("Camp " + Camp.NomCamp + " supera longitud permesa");
		    else DR[Camp.NomCamp] = ValorCamp;
		}
		else
		{
		    if (Camp.Nulable) DR[Camp.NomCamp] = DBNull.Value;
		    else throw new Exception("Camp " + Camp.NomCamp + " no permet valors nulls");
		}
		break;
	}
    }
}
 |