Problema en mi programa en Visual Basic con base de datos de Microsoft Access

Hola.
Mi nombre es Eduardo y tengo un pequeño gran problema.
Yo hace ya algunos años que me dedico a programar, pero esto como bien debes de saber nunca deja de sorprendernos.
Es tema es el siguiente:
Hice un programa en VB 6 con una base de datos de Access.
Tengo acceso a ella mediante DAO y el tema programación todo en orden.
Pero, el problema se sucita por que la generación de demasiados registros dentro de la base y la cantidad de tablas que poseo abiertas, generan la perdida de registros dentro de la misma.
Si bien todos los registros son importantes, los que más se me quejan son la perdida de los clientes de la firma a la que yo le vendí el programa.
El solo echo de tener que ingresar nuevamente un cliente que ayer se ingresó, genera no solo molestias a la operadora, si no también al cliente que se le pide nuevamente la dirección.
Yo he hecho algunas cosas como:
Separé la tabla clientes para otra base de datos, que permanece cerrada y se abre solamente cuando necesitan o agregan un cliente. El resultado mejoró pero no fue del todo bueno.
También dividí a 4000 clientes por tabla dentro de la misma base de datos teniendo 5 tablas con los clientes.
Siguimos en lo mismo.
Ahora recientemente instauré que el programa cierre automáticamente la base de datos para que se actualize el archivo temporario, ya que se hace insostenible se denota para Win.
Saque un calculo promedio de la situación y me dio que el programa maneja 24000 registros por minuto, lo que me parece que es mucho y entonces la base entra a perder registros.
El tema cerrar la base está bastante mejor, pero no se aún que pasará.
Lo que yo te pido y aquí entras tú es alguna forma de que me mantenga segura la base de datos.
Como aliciente te digo que el programa trabaja las 24 Hs. Sin descanso.
Yo creo que debe haber alguna API de Win que nos permita cerrar la base y/o darle la seguridad a los registros, no se te lo digo como para darte un ayuda.
Te aclaro que si bien he usado algunas API de Win, no se utilizarlas todas, así que si no te viene mal escribirme un poco para ver como se usa.
Si hay otra forma bienvenida sea.
Te dejo mi mail por si querés mandarme algo con gusto.
Desde ya te agradezco y lo dejo en tus manos.
Te saluda desde Uruguay...
Eduardo.
Respuesta
1
Ciertamente manejas una gran cantidad de registros, yo pensaría en migrar a SQLServer mil veces mejor que access pero con licencia. Además migraría todo a ADO ya que dao es lento y no muy efectivo. También revisaría toda la estructura de tablas a ver si faltan indices que incrementen la velocidad de proceso y el código para ver si la pérdida de datos es debida a algún error en el código, por ejemplo que lleguen dos inserciones a la vez y choquen los datos, con lo cual, uno de pierde.
Hola..
Mirá algo he visto de SQL pero no lo tengo muy claro.
Necesito por lo menos solucionar este problema de momento y luego vería como le hago con SQL.
Si tenés alguna idea bienvenida será.
Espero a ver que me decís.
Eduardo.
Migrar de ADO en access a ADO a SQL debería ser inmediato, pero migrar de DAO a ADO, eso ya cuesta un poco más, ya que hay que cambiar llamadas de abrir y cerrar la BD y las consultas.
Si esta aplicación se está usando en varios puestos a la vez, yo miraría primero los indices de las tablas para mejorar la velocidad y luego si la causa de perder datos es porque chocan los registros al intentar insertarse a la vez.

2 respuestas más de otros expertos

Respuesta
1
Lo que me cuentas me parece muy raro ya que si insertas un registro en una tabla no debe desaparecer hasta que tu decidas eliminarlo, por lo que me inclino que algo no debes de estar haciendo bien. No se que version del DAO utilizas pero yo he trabajado con la 3.51 y 3.6 y es lo primero que oigo. Yo lo que utilizo en vez de abrir una tabla lo que hago es una consulta SQL y la muestro en una grid o como quiera, bueno te resumo como trabajo con DAO:
'Variables requeridas
dim wrk as Workspace
dim db as Database
dim rc as Recordset
'Creo un nuevo espacio de trabajo con Jet
Set wrk = DBEngine.CreateWorkspace("", "Admin", "", dbUseJet)
'Abro la base de datos
Set db = wrk.OpenDatabase("ruta y nombre de la database", False, False)
'Hago una consulta a una tabla
Set rc = db.OpenRecordset("SELECT * FROM Clientes")
'Si quiero añadir un registro
rc.addnew
'Pongo los valores de los campos
....
...
..
.
'Luego me aseguro que lo añade a la tabla con Update
rc.update
'Cierro los elementos de datos
rc.close
db.close
wrk.close
set rc = nothing
set db = nothing
set wrk = nothing
Si lo que quieres es que no te cree un archivo temporal abre la base de datos en modo exclusivo, pero esto tiene sus inconvenientes ya que otros usuarios no podrán acceder a los datos al mismo tiempo.
Respecto a lo de las funciones API no existen (o no conozco) ninguna que trabaje con databases
Otra cosa, respecto ha que has tenido que dividir la tabla en otras cinco, no tienes porque una tabla puede tener los registros que quieras (yo tengo una tabla con más de 130000 referencias de artículos) y no pasa nada, la única limitación que ofrece Access es el tamaño de la DB a 1 GB y la propia memoria del aparato en que se ejecute.
No se si te abre solucionado algo, pero si tienes alguna preguntilla no dudes en hacérmela llegar.
Respuesta
-1
Con el volumen de información tan grande que me has dicho que manejas, mi opinión es que no utilices para nada Ms access, ya que no es un gestor de bases de datos preparado para transacciones tan enormes (24000 regs/min, por ejemplo). ¿Por qué no pruebas atacar a un DB2, Oracle o, como último recurso, MSSQL Server? Creo que una base de datos con Ms access siempre será inconsistente con tal cantidad de datos y transacciones.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas