Entity Framework 6 y MySQL

30960_52379221[1]

Entity Framework 6 es un gran ORM a la hora de desarrollar toda nuestra capa de interacción con la base de datos de forma sencilla y sin tener que caer en la cuenta de crear nuestra propia ORM y mantenerla a lo largo del tiempo, o recurrir a datasets ni datareaders ni cosas que ya hoy en día estan un poco pasadas.

Pero es bien sabido que EF nunca fue demasiado sencillo de utilizar fuera del ámbito de SQL Server, así que en esta entrada les dejo mi experiencia para hacer funcionar la última versión de EF con una base de datos MySQL.

Voy a suponer que ya tienen instalado el MySQL Connector en su ultima versión, de no ser así por favor deben actualizarla en orden de poder utilizar EF6. Les dejo el enlace para que puedan descargar la ultima versión (6.8.3 a estas fechas) http://dev.mysql.com/downloads/connector/net/

Primero lo primero, abrimos el NuGet Package Manager para nuestro proyecto, y descargamos la última versión de Entity Framework que a estas fechas de este post se la 6.0.2

Imagen

Una vez instalado, deben instalar también el MySQL.Data.Entities desde el Nuget dado que EF6 introduce una nueva forma de manejar los proveedores

Imagen

Una vez hecho esto, solo basta configurar nuestro archivo Web.config con la siguiente configuración

  <connectionStrings>
    <add name="InfinityContext" providerName="MySql.Data.MySqlClient" connectionString="Server=%SERVER%;Pooling=True;Max Pool Size=100;Min Pool Size=0;User=%USUARIO%;Password=%CLAVE%;Database=%BASE%;Command TimeOut=1000;" />
  </connectionStrings>
  <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
    </providers>
  </entityFramework>

Y eso es todo, ya deberían poder empezar a codear como Dios manda,

Un abrazo!

Saltar bloqueo de Facebook, YouTube, etc. en el Trabajo o Escuela

Image

Más de uno de nosotros ha querido acceder a YouTube o Facebook desde el trabajo o escuela, y nos encontramos con que fueron bloqueados. Los metodos de bloqueo son diferentes, algunos bloquean desde el dominio (Ej: http://www.facebook.com), la IP o bien incluso configuran los routers para bloquear todo tráfico que contenga el nombre del sitio al cual no quiere que accedamos (Ej: Ver una noticia de YouTube o Facebook en Alt1040 y encontrarnos con el mensaje: “This site is bloqued” o algo así).

Pues bien, encontré una solución que si bien no es la más cómoda, soluciona de forma rápida y efectiva cualquier bloqueo… Siempre y cuando tengamos permiso de instalar aplicaciones en la maquina que usamos.

La magia la hace HotSpot Shield. Este programa crea una VPN con un servidor en yanquilandia (Estados Unidos) o en algún país donde tengan servidores, y nos permiten acceder a través de ellos, saltando los controles que nos hayan sido impuestos desde nuestra red.

Los pasos son bien simples:

Image
Ve a la página y descarga la versión Free. Link: http://www.hotspotshield.com/

Image

Instala el programa

Image

Una vez instalado, ejecútalo y espera a que aparezca en verde, es decir, que la conexión ya se haya hecho.

Si has completado todos los pasos bien (son muy simples!) ya estaras listo para usar Facebook o YouTube desde donde quieras.

Cordiales saludos, Reltik.

Cerrar de verdad conexiones a BDs en .NET

Hola!! Hoy hago una entrada rápida para compartir con ustedes una fantastica solución para lidiar con las conexiones que quedan abiertas a la BDs en .NET.

Este problema me pasó con diferentes conectores (ODBC, MySqlConnector, ado.net) y es que, aunque cerremos la conexión con un conn.Close() la conexión sigue abierta durante un tiempo… y esto puede ser un problema serio en aplicaciones masivas donde muchos usuarios la utilizan y se abren constantemente conexiones…

La solución es simple y llana, y de paso comparto con ustedes una función que centraliza todo el acceso a la BD.
En este caso estoy usando el conector de mysql, pero se puede adaptar tranquilamente a cualquier otro conector.

Recuerden deshabilitar el Connection Pooling desde el connectionstring (http://www.connectionstrings.com/mysql#mysql-connector-net-mysqlconnection)

    Shared Function Query(ByVal querystring As String) As Object
        Using conn As New MySqlConnection(connstring)
            Using adaptador As New MySqlDataAdapter(querystring, conn)
                Using datos As New DataSet()

                    conn.Open()

                    adaptador.Fill(datos)

                    ' Esto es innecesario ya que al terminar la sentencia using
                    ' la variable desaparece completamente, es decir, se destruye
                    ' entonces nuestra conexión se cierra DEFINITIVAMENTE.
                    'conn.Close()

                    Query = datos.Tables(0)
                End Using
            End Using
        End Using
    End Function

Ta ta tannnnnnnn!! Bueno, estoy emocionado porque hace pocos meses comenze a programar en .NET, entiendanme jeje

Un saludo a todos y espero que a más de uno le sea de utilidad.

Servidor IIS7 en WIndows XP

Hola! Hoy les traigo una elegante solución para poder tener nuestro servidor IIS7 en Windows XP.

Para los que no lo sepan, IIS 7 no funciona bajo Windows XP ni anteriores, por ese motivo, si queremos aprovechar las nuevas tecnologías de Microsoft debemos actualizar nuestra versión de Windows a una más nueva.

Pero tranquilo, todo tiene solución. Si tu idea es montar una pequeña intranet para tú Empresa o por algún motivo en particular nesecitas tener un servidor IIS7 para correr tus aplicaciones .NET o de cualquier otra tecnología soportada por este, puedes hacer lo siguiente.

Nesecitamos, antes que nada, instalar el Microsoft WebMatrix2. Puedes descargarlo haciendo click aquí.

Image

Una vez descargado, como es habitual, procedemos al proceso de instalación. Una vez que haya finalizado, es momento de comenzar la magia en nuestro querido Windows XP.

Lo primero que debemos hacer es abrir nuestro Sitio Web

Image

Una vez abierto, Microsoft© WebMatrix® iniciara automaticamente un servidor IIS7 para desarrollo. Atención, no es recomendable usar esto en modo producción, sin embargo, para pequeños tests o entornos donde ciertos elementos no son decisivos nos puede resultar útil.

Muy bien, ¿y entonces como hacemos para que este servidor sea público ante el resto de nuestra red o internet? Simple. Ve a la sección de configuración y cambia el campo donde dice http:// por la IP de tú computadora. Elije el puerto que quieras, normalmente el puerto web es el 80. ¡Y listo! Asi de simple.

Image

El resultado debería ser el siguiente:

Image

El codigo usado para mostrar el resultado anterior fue el siguiente:

<%@ Page Language="VB" %>
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <% Response.Write("Hola Internet. Soy un pequeño script ASP .NET corriendo sobre Microsoft© WebMatrix2®.") %>
            <br />
            <% Response.Write("La fecha actual es: " & Now() ) %>
        </div>
        </form>
    </body>
</html>

Bueno, espero que les resulte útil, un cordial saludo!! Ema

Alguno de los contenidos citado anteriormente, como textos, gráficos, logotipos, e imágenes son propiedad de exclusiva de Microsoft©.

Evitar SQL Injections en ODBC

Todo el mundo que trabaja en el desarrollo de sistemas o aplicaciones que requieren que el usuario sea quién provee la información para poder interactuar con la Base de Datos debe lidiar con la tediosa tarea de sanear los datos para evitar inyecciones SQL.

La opción corporativa para evitar estos trastos, es la de usar procedimientos almacenados en la BD. Son la forma más segura para operar. Pero si no es una aplicación demasiado importante, pueden usar querys.

Bien, la opción más usada por la gran mayoría de vosotros será la de escapar los caracteres que pueden romper nuestra query y producir la inyección de código maléfico. En PHP basta con un simple: mysql_real_escape_string. Y para los que no conocían esa comodidad, tienen el simple str_replace o Replace, que existe en la basta mayoría de los lenguajes que permiten maninpular strings.

Bueno, en ODBC la cosa es más simple, y que mejor que mostraros que con un ejemplo. Supongamos que yo tengo este fragmento de código:

string query = "SELECT * FROM usuarios WHERE id = " + id;
OdbcCommand comandante = new OdbcCommand(query, conn);

Como verán, es altamente vulnerable, si el kaker (¿cracker?) cambiara el ID por un simple punto y coma (;) y inyectara su malicioso codigo estarimos en problemas.

Por suerte, ODBC nos provee de herramientas simples, pero efectivas:

OdbcCommand comandante = new OdbcCommand("SELECT * FROM usuarios WHERE id = ?", conn);
comandante.Parameters.Add("", OdbcType.Int).Value = id;

¿Vieron que simple? Con esto, ODBC se encarga automaticamente de escapar los caracteres por nosotros, y además de eso verificar que la entrada sea efectivamente del tipo que nosotros queremos que sea, es decir, Int o VarChar o lo que fuese.

Pero antes.. paren un minuto… ¿Que es ese “?” (signo de interrogación) que esta al final de la Query?
Ese signo de interrogación es un placeholder, es decir, el lugar donde el objeto OdbcCommand decidira insertar nuestro parametro. Jamás deben tener nada, ni atrás, ni adelante, deben estar separados por un space de otros elementos. OdbcCommand los busca por posición. Para que entiendan, les doy un ejemplo mas complejo:

OdbcCommand comandante = new OdbcCommand(@"
              INSERT INTO usuarios (nombre, clave, email) 
              VALUES ( ? , ? , ? )", conn);
comandante.Parameters.Add("", OdbcType.VarChar).Value = "Juan";
comandante.Parameters.Add("", OdbcType.VarChar).Value = "pepe12";
comandante.Parameters.Add("", OdbcType.VarChar).Value = "juancho@personal.com.ar";

Siempre deben respetar el orden de los placeholders, porque ODBC se maneja de esa forma.

Espero que les haya servido, un saludo!!

MySQL, ODBC y .NET

¿Cómo usar MySQL en .NET? Bueno, hay varias opciones, una de ellas es usar ODBC. Si ya lo sé, es viejo y es anticuado, y tranquilamente podríamos usar el conector oficial MySQL .NET Connector.

¿Pero que me motivo a descartar el conector oficial por uno basado en ODBC? La respuesta es: estabilidad y una decada de desarrollo y uso probado. Y en el ambiente corporativo, eso es muy importante, más cuando se trata de proyectos críticos donde la estabilidad es fundamental, porque una interrupción del servicio se traduce en pérdidas.

Okay, es tiempo de ponernos manos a la obra… Todo lo que necesitamos es descargar el conector desde la página oficial de MySQL.

Descarga de MySQL/ODBC

Link: http://dev.mysql.com/downloads/connector/odbc/

Una vez que lo hayamos instalado en nuestro ordenador, ya podremos ponernos a trabajar, pero antes, para los que no sepan o no tengan experiencia, les dare una serie de ejemplos.

En mi caso trabajo con C#, pero portar el siguiente código a VB .NET no debería representar ninguna dificultad, ambos lenguajes son similares.

using System.Data.Odbc;

namespace MiProyecto
{
    public class AsuntoController
    {
       public void MiFuncion()
       {
           // Creamos la cadena de conexión, porque es necesaria. ¿Por que?
           // Bueno, tenemos que especificar un servidor, usuario y contraseña para conectarnos
           // a nuestro servidor MySQL. Pero además, Odbc permite conectarse a un gran número de bases
           // de datos distintas.
           OdbcConnection conn = new OdbcConnection("DRIVER={MySql ODBC 5.1 Driver};Port=3306;SERVER=MiServidor;Database=MiBase;Uid=MiUsuario;Pwd=MiPassword;");
           
           // Abrimos la conexión
           conn.Open();

           // Luego creamos un objeto Command, que nos va a permitir realizar Querys
           // a nuestra base de datos, y además nos va a devolver resultados o no dependiendo de lo que queramos.
           OdbcCommand comandante = new OdbcCommand("SELECT * FROM tabla", conn);

           // Creamos un DataReader para que lea los resultados que traiga nuestro comandante.
           // Note lo siguiente: solo podrá leer una vez el DataReader. ¿Por que? Porque la forma
           // en que trabaja es leyendo directamente desde un puntero en la BD, recorriendo fila por fila.
           // Esto puede ser especialmente confusos para los que vengan de lenguajes de scripting como PHP.
           // Si lo que quieren es almacenar los resultados en memoria para recorrerlos una y otra vez
           // deben usar un DataSet
           OdbcDataReader lector = comandante.ExecuteReader();

           // Ok, ya tenemos todo listo... ahora vamos a leer nuestros resultados. Lo hacemos
           // llamando al metodo Read.
           while(lector.Read())
           {
               Response.Write(lector["usuario"].ToString() + "<br />");
           }
       }
    }
}

Bien, si leyeron los comentarios que hice durante el código, mencione que los DataReader se pueden leer una sola vez, salvo que la conexión se vuelva a reiniciar. También les dije que en caso de que quisieran almacenar los resultados en memoria, y recorrerlos todas las veces que quieran, sin necesitar una conexión, como es habitual en algunos casos, les presento el mismo ejemplo, pero utilizando un DataSet.

using System.Data.Odbc;
using System.Collections.Generic;

namespace MiProyecto
{
    public class AsuntoController
    {
       public void MiFuncion()
       {
           // Creamos la conexión como en el ejemplo de arriba
           OdbcConnection conn = new OdbcConnection("DRIVER={MySql ODBC 5.1 Driver};Port=3306;SERVER=MiServidor;Database=MiBase;Uid=MiUsuario;Pwd=MiPassword;");

           // Iniciamos la conexión...
           conn.Open();

           // Creamos el comandante. 
           // Nota: al comandante podemos asignarle cualquier conexión que queramos en el segundo parametro.
           // Esto implica que uno puede tener varias conexiones abiertas o en espera y usarlas a su antojo.
           OdbcCommand comandante = new OdbcCommand("SELECT * FROM tabla", conn);

           // Bien... Tenemos que crear un adaptador para volcar los datos de la BD en un objeto DataSet
           OdbcDataAdapter adaptador = comandante;
           
           // Creamos nuestro queridisimo DataSet
           DataSet datos = new DataSet();
           
           // Y lo llenamos con nuestros preciosos datos
           adaptador.Fill(datos);

           // Listo, todo hecho!! Vamos a leerlo
           foreach(DataRow fila in Datos.Tables[0].Rows)
           {
               Response.Write(fila["Usuario"].ToString());
           }
       }
    }
}

Bien, con esto finalizamos por hoy, un abrazo muchachos y espero que les sea de utilidad.

Saludos, Reltik.

Gambas 2

Instalar Gambas2 en Ubuntu 11.04

Gambas 2

Bien, este este mini-tutorial va dirigido a todos aquellos que deseen instalar Gambas2 en Ubuntu, pero no pudieron.
En mi caso tuve problemas al intentar instalarlo directamente desde el Centro de Software de Ubuntu. Al iniciar un proyecto me decía que faltaban ciertas librerias.
Si a ustedes les paso esto, les recomiendo instalarlo desde una Terminal con el siguiente comando:

  1. sudo apt-get install gambas2

Y esto automaticamente instalara todas las dependencias. De igual forma sirve para los que ya lo tienen instalado pero no les funciona por problemas con librerias.

Salud!!