Mostrando entradas con la etiqueta azar. Mostrar todas las entradas
Mostrando entradas con la etiqueta azar. Mostrar todas las entradas

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.