lunes, 13 de octubre de 2008

Obtener un registro al azar desde un archivo Access(.mdb)

//Iniciar el generador pseudo-aleatorio
Int32 iPreSeed = Convert.ToInt32(DateTime.Now.Ticks % Int32.MaxValue);
Random fixRand = new Random((new Random(iPreSeed)).Next());

//Establecer la cadena de conexión
String ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" +
Server.MapPath("~/App_Data/test.mdb") + ";";

//Crear el objeto que conecta a la DB en Access
OleDbConnection _Connection = new OleDbConnection(ConnectionString);

try
{
//Abrir la conexión. Suena algo oscuro pero tiene que ver con la
//cantidad de usuarios concurrentes que pueden acceder a la DB.
//Es un bien preciado que no debe malgastarse.
_Connection.Open();

//Comando SQL a ejecutar. Solo obtiene los IDs de la tabla.
//Nota: Esta no es una práctica recomendable. Se usa para 
//          ejemplificar. Ver más abajo como usar un Store Procedure.
OleDbCommand _Command = new OleDbCommand("SELECT TestID FROM Test", _Connection);

//Ejecutar el comando SQL
OleDbDataAdapter myAdapt = new OleDbDataAdapter(_Command);

//Obtener el resultado del SQL en un objeto Tabla
DataTable myDataTable = new DataTable();
myAdapt.Fill(myDataTable);

//Obtener un ID al azar de la Tabla
int iRndTestID = fixRand.Next(0, myDataTable.Rows.Count -1);
string testRndID = myDataTable.Rows[iRndTestID][0].ToString();

//Nueva consulta SQL para obtener el registro elegido al azar.
//Usa un Store Procedure en lugar de un SQL.
_Command = new OleDbCommand("[TestByID]", _Connection);
_Command.CommandType = CommandType.StoredProcedure;
_Command.Parameters.AddWithValue("@testID", testRndID);

myAdapt = new OleDbDataAdapter(_Command);

myDataTable = new DataTable();
myAdapt.Fill(myDataTable);
}
catch (Exception Err){}
finally
{
//No olvidar cerrar la conexión.
_Connection.Close();
}

//Store procedure TestByID usado en el paso anterior
--------------[TestByID] Query--------------------

SELECT TestID
FROM Test
WHERE TestID = @testID

---------------------------------------------------

//CONCLUSIONES
//Se recomienda usar Store Procedures (SP) en lugar de sentencias
//SQL debido a que permite cambiar el programa o la base de datos
//sin muchos contratiempos. Si el programa conoce la estructura de la
//base de datos quedará ligado a ella. Esto se conoce como
//acoplamiento y debe ser reducido lo más posible. Al usar SPs se
//cumple con mantener el acoplamiento bajo.

viernes, 19 de septiembre de 2008

Random C#


Int32 iPreSeed = Convert.ToInt32(
          DateTime.Now.Ticks % Int32.MaxValue);
Random fixRand = new Random(
          (new Random(iPreSeed)).Next());
int iRndValue = fixRand.Next();


Se llama dos veces a Random para asegurarse que el generador pseudo-aleatorio quede bien iniciado.