Pregunta

Como de costumbre, primero una información de fondo:

Base de datos A (base de datos de acceso): contiene una tabla que contiene información que necesito de solo dos columnas. La información de estas dos columnas es necesaria para una aplicación que será utilizada por personas que no pueden acceder a la base de datos A.

Base de datos B (base de datos de acceso): contiene una tabla que contiene solo dos columnas (refleja lo que necesitamos de la tabla A). La base de datos B es accesible para todos los usuarios de la aplicación. Un problema es que uno de los nombres de las columnas no es el mismo que en la tabla de la Base de datos A.

Lo que debo hacer es transferir los datos necesarios a través de una utilidad que se ejecutará automáticamente, por ejemplo, una vez por semana (las dos bases de datos no necesitan estar totalmente sincronizadas, solo cerrarse). La utilidad de transferencia se ejecutará desde una cuenta de usuario que tenga acceso a ambas bases de datos (obviamente).

Aquí está el enfoque que he tomado (de nuevo, si hay una mejor manera, sugiérale):

  1. Tome los datos de la base de datos A. Son solo las dos columnas de la tabla necesaria.

  2. Escriba los datos en el archivo [nombre de tabla] .txt usando un objeto DataReader y un objeto WriterStream. He hecho esto para poder usar un archivo schema.ini y forzar que las columnas de datos tengan el mismo nombre que estarán en la Base de datos B.

  3. Cree un objeto DataSet que contenga una DataTable que refleje la tabla de la Base de datos B.

  4. Succione la información del archivo .txt en el DataTable usando el proveedor Microsoft.Jet.OLEDB.4.0 con propiedades extendidas de texto, hdr = yes y fmt = delimitado (para que coincida con cómo tengo el schema.ini configuración del archivo y la configuración del archivo .txt). Estoy usando un DataAdapter para llenar la DataTable.

  5. Cree otro objeto DataSet, que contenga una DataTable que refleje la tabla de la Base de datos B.

  6. Aspire la información de la base de datos B para que contenga todos los datos actuales que se encuentran en la tabla que deben actualizarse desde la base de datos A. Nuevamente, estoy usando un DataAdapter para completar esta tabla de datos (una diferente de Paso 5, ya que ambos utilizan diferentes fuentes de datos).

  7. Combinar DataTable que contiene los datos de la Base de datos A (o el archivo .txt, técnicamente).

  8. Actualizar la tabla de la base de datos B con los cambios.

He escrito los comandos de actualización, eliminación e inserción manualmente para el DataAdapter que es razonable para hablar con la Base de datos B. Sin embargo, esta lógica nunca se usa porque el DataSet-From-Database-B.Merge (Dataset-From-TxtFile [tableName]) no voltea la bandera HasChanges. Esto significa que DataSet-From-Database-B.Update no activa ninguno de los comandos.

Entonces, ¿hay alguna forma de obtener los datos de DataSet-From-TxtFile para fusionarlos y aplicarlos a la Base de datos B usando el método que estoy usando? ¿Me estoy perdiendo un paso crucial aquí?

Sé que siempre podría eliminar todos los registros de la tabla de la Base de datos B y luego simplemente insertar todos los registros del archivo de texto (incluso si tuviera que recorrer cada registro en el DataSet y aplicar la fila.Configurado para agregar, HasChanges), pero prefiero que aplique SOLO los cambios cada vez.

Estoy usando c # y el Framework 2.0 (lo cual me doy cuenta de que puedo usar DataTables y TableAdapters en lugar de DataSets y DataAdapters, ya que solo estoy tratando con una sola tabla, pero de todos modos).

TIA

¿Fue útil?

Solución

Dejando de lado por un momento que usaría SQLServer y solo tendría una única tabla con múltiples vistas que controla quién podría ver qué información contiene para evitar todo el problema de sincronización ...

Creo que @Mitchel está en lo correcto aquí. Simplemente escriba un programa que se conecte a ambas bases de datos, cargue la tabla A y la tabla B, respectivamente. Luego, para cada elemento (par de columnas) en A, asegúrese de que esté en B. De lo contrario, insértelo en B. Luego, para cada elemento en B, asegúrese de que esté en A. De lo contrario, retírelo de B . Guardar B. No veo la necesidad de ir primero a un archivo.

Pseudocódigo:

DataTable A = load table from A
DataTable B = load table from B

foreach row in A
   col1 = row[col1]
   col2 = row[col2]
   matchRow = B.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      add new row to B with col1,col2
   end
end

foreach row in B
   col1 = row[col1]
   col2 = row[col2]
   matchRow = A.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      remove row from B
   end
end

update B

Otros consejos

¿Por qué no simplemente usar un lector de datos y recorrer los registros, haciendo inserciones manuales si es necesario en la base de datos B?

En lugar de trabajar con conjuntos de datos, fusionar, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top