none
Optimo uso de las conexiones a las Bases de datos RRS feed

  • Pregunta

  • Hola, saben e estado desarrollando hace mas de 8 meses software con diversas Bases de datos, e probado MySQL, ACCESS, SQLserver.

     

    me e quedado con Mysql, simplemente por que gratis, lo que no me queda caro es el uso optimo de este, llamo a esto a como pregunto sobre los datos a la BD y me los devuelve.

     

    Yo uso DataAdapter para Hacer las consultas que me devuelve valores (Osea, la variedad SELECT), y Command para los Que no devuelven (Update & Delete & Insert), los datos los almaceno en Dataset's por que me son mas faciles de consultar datos.

     

    tambien, estube leyendo sobre la Inyección SQL, y la verdad la forma en la que yo hago las consultas, sean vulnerables a esto, yo uso dos funciones que hice para hacer las consultas:

        public static bool ExecuteNonQuery(string query) {
          try
          {
            Command = new OleDbCommand(query, Conexion);
            Command.Connection.Open();
            Command.ExecuteNonQuery();
            Command.Connection.Close();
    
            return true;
          }
          catch (Exception) {
            Command.Connection.Close();
            return false;
          }
        }
    
        public static DataSet ExecuteQuery(string query, string tabla) {
          try {
            DataSet da = new DataSet();
            da.Clear();
            Conexion.Open();
            DataAdapter = new OleDbDataAdapter(query, Conexion);
            DataAdapter.Fill(da, tabla);
            Conexion.Close();
            return da;
          }
          catch (Exception) {
           Conexion.Close();
           return null;
          }
        }

    esas son mis funciones, normalmente mis programas constan de SELECT,UPDATE, INSERT y DELETE, se que existen los trigers, pero nunca me a tocado trabajar con ellos.

     

    Si tienen alguna ayuda de como optimizar las insertciones y lectura de datos y tambien como liberarme del problema de la Inyección SQL seria de gran Utilidad.

     

    Gracias

    sábado, 26 de junio de 2010 18:57

Respuestas

  • hola

    me e quedado con Mysql, simplemente por que gratis

    Sql Server Express, tambien es de uso libre, por ahi con algunas restricciones pero si la aplicacion que intentas hacer no es muy exigente puede usarlo

    http://www.microsoft.com/express/database/

    Si tienen alguna ayuda de como optimizar las insertciones y lectura de datos y tambien como liberarme del problema de la Inyección SQL seria de gran Utilidad.

    con respecto a esto que comentas por ahi te aconsejaria que las consultas no las realices concatenado el string sino que usa parametros para armar las consultas que realices contra la base de datos

    esto justamente es lo que evita los ataques por Sql Injection

    pero ojo porque estos mas que nada se dan en ambientes web, no si usas winforms

    entonces recomendacion numero uno usa parametros para armar las queries, de ser posible con Stored Procedure

    segundo consejo, no ahce falta que armes metodo que reciban la query y devuelvan el resultado

    apunta ams que anda al armado de metodo que tengfan que ver con tu negocio

    ADO.NET Parte 3 Actualizaci ó n Informaci ó n Sql Server

    ADO.NET - Parte 1 - Recuperar Informaci ó n Sql Server

    como veras en los link los metodo deciben valores y devuelven datos tipados, dentro de cada metodo se arma los objetos de conexion a datos, pero no uso funcionalidad para simplemente reciba un string y devuelva un datatable

    esto apunta ams que anda a separar responsabilidades y esta relacionado con al programacion en capas, en los ejemplos no esta separado en proyectos porque son ejemplos simples, pero si quers puedes separar los metodo que consultan a la db en uno del tipo Class Library y asi tener la presentacion aislada del acceso a  datos

     

    Otro comentario con que provider te estas conectando a MySql ? imagino que no estas usando el OleDB, lo comento porque mysql tiene el suyo especifico para ado.net

    solo debes bajar el conector

    Connector/Net

    despues tienes estas paginas de ejemplos

    (Mysql Hispano)  MySQL Connector/Net

    Tutorial: An Introduction to Connector/NET Programming

    como veras asi como hay un SqlConnection y un OleDbConnection, tambien existe coneste conector el MySqlConnection, este es el que deberias usar

    bueno analiza los ejemplos creo que podrian ser de utilidad

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 26 de junio de 2010 19:41
  • Estoy deacuerdo con Leandro. Para evitar SQLInyection debes parametrisar los query o usar Store procedure.

    Como lo mensiono Leandro lo mejor seria separar tu capa de acceso a dato en un libreria que se encargue de eso, podrias usar la "Enterprice Librery" de Microsoft .

     

    Yo me arme mi propia dll de acceso a datos, funciona perfectamente con SQL Server y Oracle, no la he probado con MySQL pero deberia funcionar. Quisa te sea util.

    http://cid-e8d2eaf32b7aa636.office.live.com/self.aspx/P%C3%BAblico/Blog/Db%20Access.rar

    Basicamente es una clase que utiliza el patron singleton para evitar instancias duplicadas, esta tiene los metodos

    DataSet ExecuteQuery(... //  T ExecuteScalar<T>(...  //  int ExecuteNonQuery(...

     

    Permite iniciar transacciones(begin/rollback/commit), funciona con store prodecure con o sin parametros de salida.

    La conexion se configura en el app/web.config, este se seta dinamicamente con reflexion.

    Para parametrisar los query utiliza la clase "GenericParameter" que funciona igual para cualquier base de datos. (al menos para las que he probado)

     

    Es muy poco codigo y bastante simple de utilizar espero que te sea util, cualquier cosa puedes adaptarlo.

     

    Con respecto al problema que tienes al trabajar con los datos de un data Set lo mejor seria pasarlos directamente a colecciones de objetos, normalmente tengo clases que representan a las tablas de la base, y utilizo un metodo generico que crea dinamicamente los objetos con los datos de un DataTable.

    En el caso que te pueda servir te lo paso

     


    Si la respuesta fue de utilidad por favor vote. Tec. Agustin Rosso http://www.bfxstudio.net
    lunes, 28 de junio de 2010 12:07

Todas las respuestas

  • hola

    me e quedado con Mysql, simplemente por que gratis

    Sql Server Express, tambien es de uso libre, por ahi con algunas restricciones pero si la aplicacion que intentas hacer no es muy exigente puede usarlo

    http://www.microsoft.com/express/database/

    Si tienen alguna ayuda de como optimizar las insertciones y lectura de datos y tambien como liberarme del problema de la Inyección SQL seria de gran Utilidad.

    con respecto a esto que comentas por ahi te aconsejaria que las consultas no las realices concatenado el string sino que usa parametros para armar las consultas que realices contra la base de datos

    esto justamente es lo que evita los ataques por Sql Injection

    pero ojo porque estos mas que nada se dan en ambientes web, no si usas winforms

    entonces recomendacion numero uno usa parametros para armar las queries, de ser posible con Stored Procedure

    segundo consejo, no ahce falta que armes metodo que reciban la query y devuelvan el resultado

    apunta ams que anda al armado de metodo que tengfan que ver con tu negocio

    ADO.NET Parte 3 Actualizaci ó n Informaci ó n Sql Server

    ADO.NET - Parte 1 - Recuperar Informaci ó n Sql Server

    como veras en los link los metodo deciben valores y devuelven datos tipados, dentro de cada metodo se arma los objetos de conexion a datos, pero no uso funcionalidad para simplemente reciba un string y devuelva un datatable

    esto apunta ams que anda a separar responsabilidades y esta relacionado con al programacion en capas, en los ejemplos no esta separado en proyectos porque son ejemplos simples, pero si quers puedes separar los metodo que consultan a la db en uno del tipo Class Library y asi tener la presentacion aislada del acceso a  datos

     

    Otro comentario con que provider te estas conectando a MySql ? imagino que no estas usando el OleDB, lo comento porque mysql tiene el suyo especifico para ado.net

    solo debes bajar el conector

    Connector/Net

    despues tienes estas paginas de ejemplos

    (Mysql Hispano)  MySQL Connector/Net

    Tutorial: An Introduction to Connector/NET Programming

    como veras asi como hay un SqlConnection y un OleDbConnection, tambien existe coneste conector el MySqlConnection, este es el que deberias usar

    bueno analiza los ejemplos creo que podrian ser de utilidad

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 26 de junio de 2010 19:41
  • Estoy deacuerdo con Leandro. Para evitar SQLInyection debes parametrisar los query o usar Store procedure.

    Como lo mensiono Leandro lo mejor seria separar tu capa de acceso a dato en un libreria que se encargue de eso, podrias usar la "Enterprice Librery" de Microsoft .

     

    Yo me arme mi propia dll de acceso a datos, funciona perfectamente con SQL Server y Oracle, no la he probado con MySQL pero deberia funcionar. Quisa te sea util.

    http://cid-e8d2eaf32b7aa636.office.live.com/self.aspx/P%C3%BAblico/Blog/Db%20Access.rar

    Basicamente es una clase que utiliza el patron singleton para evitar instancias duplicadas, esta tiene los metodos

    DataSet ExecuteQuery(... //  T ExecuteScalar<T>(...  //  int ExecuteNonQuery(...

     

    Permite iniciar transacciones(begin/rollback/commit), funciona con store prodecure con o sin parametros de salida.

    La conexion se configura en el app/web.config, este se seta dinamicamente con reflexion.

    Para parametrisar los query utiliza la clase "GenericParameter" que funciona igual para cualquier base de datos. (al menos para las que he probado)

     

    Es muy poco codigo y bastante simple de utilizar espero que te sea util, cualquier cosa puedes adaptarlo.

     

    Con respecto al problema que tienes al trabajar con los datos de un data Set lo mejor seria pasarlos directamente a colecciones de objetos, normalmente tengo clases que representan a las tablas de la base, y utilizo un metodo generico que crea dinamicamente los objetos con los datos de un DataTable.

    En el caso que te pueda servir te lo paso

     


    Si la respuesta fue de utilidad por favor vote. Tec. Agustin Rosso http://www.bfxstudio.net
    lunes, 28 de junio de 2010 12:07