DbParameter.

by Valeriano Tortola 16. septiembre 2007 20:56

Para evitar problemas de seguridad en ADO.NET 2.0 es recomendable componer las sentencias SQL a base de parámetros en lugar de construir las cadenas manualmente en base a las propiedades .Text de los controles u otros orígenes. De esta forma evitamos fallos de seguridad potenciales (ie: SQL Injection) y otros problemas menores. Siguiendo con nuestra DB Factory donde mostré como utilizar la Fábrica de objetos de ADO.NET 2.0 para construir objetos que pueden manejar cualquier base de datos, ahora le toca el turno a la clase DbParameter para añadir parámetros a las sentencias SQL de nuestra DB Factory.

DbParameter, también es una clase abstracta de System.Data.Common que especializan todas las clases con las que estamos más acostumbrados a trabajar, como SqlParameter, OracleParameter, … etc.. Por lo que seguimos con las mismas ventajas y pegas que las que tenemos en general con Db Factory, la ventaja de la gran versatilidad y la desventaja de no poder acceder a las propiedades especializadas de la clase derivada, ambas causadas por el polimorfismo

El ejemplo, que usa los mismos datos de conexión y BD que el artículo sobre DbFactory, representa como insertar un trabajador en la tabla 'Employees':

 

string provider = ConfigurationManager.ConnectionStrings["SQLServer"].ProviderName;
string connectionString = ConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString;
 
// Sentencia SQL
string insertEmployee = 
  "INSERT INTO EMPLOYEES (EmployeeID, LastName, FirstName) VALUES (@ID, @LNAME, @NAME)";
 
// Obtengo el proovedor.
DbProviderFactory dbpf = DbProviderFactories.GetFactory(provider);
 
// Creo la conexión y el comando.
using (DbConnection dbcon = dbpf.CreateConnection())
using (DbCommand dbcmd = dbcon.CreateCommand())
{
  // Configuro la conexión
  dbcon.ConnectionString = connectionString;
  try
  {
      Console.WriteLine("Ejecutando SQL con un obteto de tipo {0}.", 
                         dbcon.GetType().Name);
      // Abro la conexión
      dbcon.Open();
      // Si os falla al insertar filas probad esto:
      dbcmd.CommandText = "SET IDENTITY_INSERT Employees ON";
      dbcmd.ExecuteNonQuery();
      ////
 
      dbcmd.CommandText = insertEmployee;
 
      // Parámetros
      DbParameter dbparam = dbcmd.CreateParameter();
      dbparam.DbType = DbType.String;
      dbparam.ParameterName = "NAME";
      dbcmd.Parameters.Add(dbparam);
      dbparam = dbcmd.CreateParameter();
      dbparam.DbType = DbType.String;
      dbparam.ParameterName = "LNAME";
      dbcmd.Parameters.Add(dbparam);
      dbparam = dbcmd.CreateParameter();
      dbparam.DbType = DbType.Int32;
      dbparam.ParameterName = "ID";
      dbcmd.Parameters.Add(dbparam);
 
      // Inserto a los nuevos empleados
      dbcmd.Parameters["NAME"].Value = "Valeriano";
      dbcmd.Parameters["LNAME"].Value = "Tortola";
      dbcmd.Parameters["ID"].Value = 15;
      dbcmd.ExecuteNonQuery();
 
      // No ha saltado ninguna excepción,
      // todo ha ido bien. También podríamos
      // haberlo hecho como una transación :)
      Console.WriteLine("Inserción OK!"); 
    }
    catch (DbException dbex)
    {
      Console.WriteLine(dbex.Message); 
    } 
}

Tags:

.NET 2.0 | C# 2.0 | ADO.NET

Comentarios

16/09/2007 22:59:33 #

trackback

Trackback from vtortola

DbParameter.

vtortola |

Comentarios no permitidos