none
Obtener registros de tabla MDB y cerrar conexion

    Pregunta

  • Hola, tengo hecho un proceso en el q saco los registros de una tabla de un archivo mdb, para luego volcar los datos en otra bd. Pero necesito saber como hacer lo mismo pero q una vez q tenga los datos del archivo mdb, cerrar la conexion esa ya q no la voy a necesitar para nada. Ahora lo tengo hecho con un dataTable y tableAdapter enlazado a esa tabla, lo lleno y despues lo recorro, pero no me sirve porq el archivo mdb lo tengo en una maquina en remoto y tengo acceso a él por vpn por lo q me ralentiza. Necesito hacer la select de la tabla y almacenarla de alguna forma q ya no necesite la conexion a la bd y así no me ralentice el proceso.

    No se si me he explicado bien. Muchas gracias de antemano

    viernes, 09 de julio de 2010 13:44

Respuestas

  • hola

    cuando procesas el datatable no estaras realziando alguna validacion o Update de este datatable, no ?

    por ahi dentro del proceso has agregado algun codigo que requiera la actualziacion de la db de access por eso es que necesita volver a realziar la conexion

     

    sino prueba algo como esto

    DataTable dt = new DataTable();

    using (OleDbConnection conn = new OleDbConnection("connection string"))
    {
        conn.Open();
        string sql = @"SELECT * FROM Tabla"

        OleDbCommand cmd = new OleDbCommand(query, conn);
       
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        da.Fill(dt);
       
    }

     

    como veras alli usas codigo puro para cargar el datatable copia el query que sua el SelectCommand del tableadapter

    y define la conexion a la db de access, una vez que sale del using tendras el datatable para procesar en el loop, y este si no tendra ni idea o posibilidad de establecer una conexion ya que no se la has especificado

    aqui controlas puntualmente como cargar los datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 09 de julio de 2010 15:49
  • hola

    Sino otra opción q se me acaba de ocurrir es sacar los datos de la tabla del mdb y crearme un tabla temporal en la bd mysql para hacer las comprobacions contra ella.

    esta es una buena idea

    realiza un volcado de la info de tu db access a una tabla temporal local mysql y luego cierra la conexion vpn si quieres, ya que el resto del procesamiento sera lcoal y mucho mas rapido en mysql

    la idea es que el cuello de botella en la conxion que introduce el vpn sea un proceso secuancial y bien rapido comoe s el volcado de los datos lo ams plano posible y sin procesamiento

    luego una vez que los tengas lcoal ya podras validar y hacer los calculos que necesites para poner la info en firme en las tablas concretas que hagan falta usar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 09 de julio de 2010 16:16
  • hola

    Tu crees q la insercción de los 2000 registros le costará relativamente poco??

    si apuntas a la operacion del volcado de los 2000 registros en la tabla local en mysql, deberia ser relativamente rapida, ya que estas realizando operaciones simple

    igual esto va a depender de que tan rapida sea la VPN para traer el volumen de los 2000 registro, pero despeus es similar a como lo tienes actualmente, ya que cargarias el datatable con a info de Access pero lo insertas tal cual esta en mysql, luego desconectas todo y sigues procesando local

    si esta oepracion tarda no sera por ado.net o la forma de conectarte sino que estara limitado el ancho de banda de la VPN para transferiri la informacion

    puedo usar ese mismo dataTable para hacer la insercciones a mysql tmb por código??

    el datatable es desconectado, por lo tanto podrias procesarlo y armar las queries que hagan falta para insertar

    igualmente el planteo que haces apunta a usar el dataset tipado, en el codigo que puse de ejemplo use un datatable sin tipo, pero si el select que defines en el OleDbCommand mapea con los campos de tu datatable tipado podrias suarlo sin problemas

    igualmente si realzias este proceso de volcado simple de los datos locales en tablas temporales de mysql podrias seguir programando como lo venias haciendo hasta ahora, solo que durante el proceso no realices conexiones remotas por VPN para actualziar access ya que alli es donde se produce la demora

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 09 de julio de 2010 18:07

Todas las respuestas

  • hola

    el datatable es un objeto desconectado, por lo tanto una vez que es cargado con la informacion esta es cerrada

    sabiendo esto lo que por ahi deberias hacer es poder controlar la conexion, pero el tableadapter si es que estas usando el Fill() para cargar los datos abre y cierra la conexion una vez que termine de usarla

    por eso es extraño esto que comentas deberia funcionar tal como lo planteas

    una vez que llenar el datatable este deberia cerrar la conexion, ya que como comente es un objeto desconectado

    por ahi te lo ahs confundido con el DataReader este si necesita mentener la conexion a la db para poder operar, pero el datatable no

    porque es que piensas que esto no te sirve, de que forma se relentiza la conexion ? hasta donde veo no deberia pasar al menos no por un tema de conexion a la db, por ahi sea otra cosa la que relentiza el proceso

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 09 de julio de 2010 14:45
  • Buenas Leandro,

    yo también hice le mismo planteamiento q tu, lleno el dataTable con el método Fill desl tableAdapter, pensando, como tú has dicho, q una vez traidos los datos se encarga de cerrar la conexión. Despues lo que hago es recorrer el dataTable y uno a uno hacer unos calculos y almacenar los datos en otra bd distinta (MySQL).

    Pienso que se ralentiza porq esta mañana lo he probado accediendo al archivo mdb en remoto por vpn, hace la consulta y se supone q en el momento q empieza a recorrer el dataTable (ya rellenado) no sería necesaria la conexion vpn y puesto q no hace ninguna consulta mas al archivo mdb debería ir rapido. Al hacer la prueba he comprobado q no:

    Sé cuando empieza a recorrer el dataTable porq el proceso lo tengo hecho con un backgroundWorker y cuando empiezo a recorrer el dataTable voy mostrando el numero de registro. Cuando he hecho la prueba la conexion VPN abierta y correcta, ha hecho la consulta al archivo mdb correctamente (algo mas lento q en local, logico) y al empezar a recorrer los registros le costaba muucho en cada registro, no he mirado exactamente pero te puedo decir q un minuto. Eso ya no me ha cuadrado mucho. He cambiado la conectionString para q conectara al mismo archivo mdb pero a una copia q me he hecho en local, he ejecutado el proceso y ha ido volado, ha hecho la consulta y al recorrer los registros le costaba menos de un segundo cada registro. Y he vuelto a hacer una tercera prueba, de nuevo conectando al mdb remoto por vpn, he ejecutado el proceso y una vez q se ha puesto a recorrer los registros cuando iba por el segundo o tercero he cerrando la conexion vpn de forma manual (q según el planteamiento inicial ya no haría falta) y el proceso me ha tirado un error de q no había conexion al archivo mdb y se ha parado.

    Se me ocurre, auqnue no se si tendrá q ver... puede venir el problema porq el dataTable y tableAdapter lo tengo en un dataSet q no lo creo en ese momento por codigo sino q lo tengo creado con el asistente gráfico, y lo q hago es instanciarlo en el proceso, y al no "eliminar" la variable del dataSet por ahí pueda venir el fallo?

    De todas formas voy a intentar mirar ahora si tengo un hueco la codigo del proceso de nuevo por si veo algo raro q ahora no recuerde. A ver si puedo y veo algo, q ahora mismo toy liada también intentando configurar un vpn en un 2003 server con una sola tarjeta de red y no puedo, de paso si alguien me puede echar una mano se lo agradezco ejje. (yo lo he configurado en XP y me ha funcionado sin problemas pero haciendolo de la misma forma en 2003 server, cuando abro la conexion cliente se queda comprobando el usuario y contraseña un rato y al final me tira un error. Y los tutoriales q éstoy viendo para 2003 server son con dos tarjetas de red :(

     

    Muchas gracia sy perdón por la parrafada :$

    viernes, 09 de julio de 2010 15:38
  • hola

    cuando procesas el datatable no estaras realziando alguna validacion o Update de este datatable, no ?

    por ahi dentro del proceso has agregado algun codigo que requiera la actualziacion de la db de access por eso es que necesita volver a realziar la conexion

     

    sino prueba algo como esto

    DataTable dt = new DataTable();

    using (OleDbConnection conn = new OleDbConnection("connection string"))
    {
        conn.Open();
        string sql = @"SELECT * FROM Tabla"

        OleDbCommand cmd = new OleDbCommand(query, conn);
       
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        da.Fill(dt);
       
    }

     

    como veras alli usas codigo puro para cargar el datatable copia el query que sua el SelectCommand del tableadapter

    y define la conexion a la db de access, una vez que sale del using tendras el datatable para procesar en el loop, y este si no tendra ni idea o posibilidad de establecer una conexion ya que no se la has especificado

    aqui controlas puntualmente como cargar los datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 09 de julio de 2010 15:49
  • Mala cabeza q tengo... cierto.. me había olvidado de que hacía una consulta al archivo mdb en modo de comprobacion digamos. Así que me surge una duda... hay algún método q permita buscar datos en un dataTable ya rellenado?? tendría q hcer la busqueda condicionando 2 campos (me da a mi que esto es pedir demasiado). 

    Sino otra opción q se me acaba de ocurrir es sacar los datos de la tabla del mdb y crearme un tabla temporal en la bd mysql para hacer las comprobacions contra ella. Aunque la rapidez de recorrer el dataTable e insertar los registros uno a uno en la tabla temporal puede que le costara demasiado? serán alrededor de unos 2000 registros en principio.

    viernes, 09 de julio de 2010 16:11
  • hola

    Sino otra opción q se me acaba de ocurrir es sacar los datos de la tabla del mdb y crearme un tabla temporal en la bd mysql para hacer las comprobacions contra ella.

    esta es una buena idea

    realiza un volcado de la info de tu db access a una tabla temporal local mysql y luego cierra la conexion vpn si quieres, ya que el resto del procesamiento sera lcoal y mucho mas rapido en mysql

    la idea es que el cuello de botella en la conxion que introduce el vpn sea un proceso secuancial y bien rapido comoe s el volcado de los datos lo ams plano posible y sin procesamiento

    luego una vez que los tengas lcoal ya podras validar y hacer los calculos que necesites para poner la info en firme en las tablas concretas que hagan falta usar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 09 de julio de 2010 16:16
  • Tu crees q la insercción de los 2000 registros le costará relativamente poco?? Con eso lo de la vpn solucionado puesto q nada mas conectaria una vez para la consulta y listo.

    Otra cosa.. si saco los datos completamente por codigo como el ejmplo q me has puesto tu, puedo usar ese mismo dataTable para hacer la insercciones a mysql tmb por código?? Es q la creacion de los datatables por codigo no la he tocado mucho, pero te pregunto esto porq supongo q de esta forma al no usar un dataset tipado relleno unos datatable con los datos de una tabla y ese datatable lo puedo insertar en la tabla q me de la gana (evidentemente con la misma estructura), cierto?? Y se supongo q el proceso será más rapido q si uso un dataset tipado con los datatbles y el metodo update, no se si es correcto este planteamiento, o ya se me está empezando a recalentar el cerebro..

    Esta noche lo probaré a ver el rendimiento, y sino intentaré plantear el proceso de forma q no necesite esa comprobación.

    Muchas gracias!!

    viernes, 09 de julio de 2010 16:25
  • hola

    Tu crees q la insercción de los 2000 registros le costará relativamente poco??

    si apuntas a la operacion del volcado de los 2000 registros en la tabla local en mysql, deberia ser relativamente rapida, ya que estas realizando operaciones simple

    igual esto va a depender de que tan rapida sea la VPN para traer el volumen de los 2000 registro, pero despeus es similar a como lo tienes actualmente, ya que cargarias el datatable con a info de Access pero lo insertas tal cual esta en mysql, luego desconectas todo y sigues procesando local

    si esta oepracion tarda no sera por ado.net o la forma de conectarte sino que estara limitado el ancho de banda de la VPN para transferiri la informacion

    puedo usar ese mismo dataTable para hacer la insercciones a mysql tmb por código??

    el datatable es desconectado, por lo tanto podrias procesarlo y armar las queries que hagan falta para insertar

    igualmente el planteo que haces apunta a usar el dataset tipado, en el codigo que puse de ejemplo use un datatable sin tipo, pero si el select que defines en el OleDbCommand mapea con los campos de tu datatable tipado podrias suarlo sin problemas

    igualmente si realzias este proceso de volcado simple de los datos locales en tablas temporales de mysql podrias seguir programando como lo venias haciendo hasta ahora, solo que durante el proceso no realices conexiones remotas por VPN para actualziar access ya que alli es donde se produce la demora

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 09 de julio de 2010 18:07