2008-10-27 20 views
5

Tengo dos bases de datos, una es un archivo de MS Access y la otra es una base de datos de SQL Server. Necesito crear un comando SELECCIONAR que filtre los datos de la base de datos de SQL Server en función de los datos en la base de datos de Access. ¿Cuál es la mejor manera de lograr esto con ADO.NET?Referencia cruzada en varias bases de datos

¿Puedo obtener los datos requeridos de cada base de datos en dos nuevas tablas. Ponlos en un solo conjunto de datos. Entonces, ¿realiza otro comando SELECCIONAR en el Dataset para combinar los datos?

Información adicional: La base de datos de Access no es permanente. El usuario utiliza el archivo de Access para usar en tiempo de ejecución.

Aquí hay un poco de información básica para explicar por qué hay dos bases de datos. Mi empresa usa un programa CAD para diseñar edificios. El programa almacena los materiales utilizados en el modelo CAD en una base de datos de Access. Hay un archivo para cada modelo. Estoy escribiendo un programa que generará información de costos para cada modelo. Esto se basa en los precios de material actuales almacenados en una base de datos de SQL Server.


mi solución

Acabé importar los datos en la base de datos de acceso en una tabla temporal en el PP servidor SQL. Realizando todo el procesamiento necesario y luego eliminando la tabla temporal. No fue una solución bonita, pero funcionó.

Respuesta

3

Usted no quiere tirar de ambos conjuntos de datos a través de si usted no tiene que hacer eso. También tendrá problemas para implementar la solución de Tomalak, ya que la ubicación del archivo puede cambiar y es posible que ni siquiera esté disponible para el servidor.

Supongo que sus usuarios configuran una base de datos de Access con las personas/productos o lo que sea que les interese trabajar y es por eso que debe seleccionar entre las dos bases de datos. Si ese es el caso, la tabla de acceso es probablemente más pequeña que las tablas de SQL Server. Su mejor opción es obtener los datos de acceso, luego usarlos para generar una consulta filtrada a SQL Server para que pueda minimizar los datos que se envían a través de la red.

Así, las cosas más importantes son:

  1. filtrar los datos en el servidor para que pueda minimizar el tráfico de la red y también porque la base de datos va a ser más rápido en el filtrado de ADO.NET
  2. Si tiene que elegir un conjunto de datos para incorporar a su aplicación, inserte el conjunto de datos más pequeño y luego utilícelo para filtrar la otra tabla.
+0

De acuerdo .. ya que hay una base de datos de acceso en cada cliente, parece irracional configurar tantos servidores vinculados "temporales". – neonski

+0

¿Cada base de datos de Access tiene datos diferentes? Si es así, ¿quién fue el idiota que diseñó esta configuración? –

+0

No es tan raro en realidad. Existe una base de datos corporativa que tiene todas las ventas, pero el gerente regional de la costa este tiene una base de datos de acceso solo con clientes de la costa este que usan para informar. O un equipo de estadísticas ha reducido a quiénes están mirando, etc. –

0

Primero debe hacer algo en el servidor: haga referencia a la base de datos de acceso como un "servidor vinculado".

A continuación, podrá consultarlo desde el servidor SQL, extrayendo o rellenando los datos como desee. Esta página web ofrece una buena descripción de cómo hacerlo.

http://blogs.meetandplay.com/WTilton/archive/2005/04/22/318.aspx

0

¿Has probado la evaluación comparativa de lo que sucede si enlazas desde la interfaz de Access a tu SQL Server a través de ODBC y escribes tu SQL como si ambas tablas fueran locales? A continuación, puede hacer un seguimiento en el servidor para ver exactamente lo que Jet envía al servidor. Puede que te sorprenda lo eficiente que es Jet con este tipo de cosas. Si está enlazando en un campo clave (p., y el campo ID, ya sea desde SQL Server o no), es probable que Jet envíe una lista de los ID. O podría escribir su SQL para hacerlo de esa manera (usando IN SELECT ... en su cláusula WHERE).

Básicamente, la eficiencia de las cosas dependerá de dónde se va a ejecutar su cláusula WHERE. Si, por ejemplo, se une a una tabla Jet local con una tabla SQL Server vinculada en un solo campo y filtra los resultados según los valores de la tabla local, es muy probable que sea extremadamente eficiente, ya que lo único que hará Jet será enviar al servidor es lo que sea necesario para filtrar la tabla de SQL Server.

De nuevo, sin embargo, va a depender completamente de lo que está intentando hacer exactamente (es decir, en qué campos está filtrando). Pero dale a Jet la oportunidad de ver si es inteligente, en lugar de suponer que Jet lo arruinará. Es muy posible que necesite algunos ajustes para que Jet funcione de manera eficiente, pero si puede mantener toda su lógica del lado del cliente, es mejor que tratar de hacer un seguimiento de todas las bases de datos de Access desde el servidor.

0

Si leo la pregunta correctamente, NO está intentando hacer referencias cruzadas en múltiples bases de datos.

Es necesario simplemente para hacer referencia a los detalles de un archivo en particular, que en este caso, podría contener:

clave primaria, la suma de comprobación de archivos superior (si se trata de una modificación), la suma de comprobación del archivo, último autor conocido, número de revisión , fecha del último cambio ...

Y luego esa clave principal al agregar información obtenida de analizar ese archivo usando su programa.

Si realmente necesita una base de datos distribuida, tal vez prefiera utilizar una base de datos no relacional como LDAP.

Si no puede usar LDAP, pero debe usar una base de datos relacional, puede considerar el uso de GUID para asegurarse de que sus claves principales son buenas.

0

Dado que no proporciona suficiente información, tendré que hacer algunas suposiciones.

Suponiendo:

  1. El SQL Server y la base de datos de acceso no están en el mismo equipo
  2. El SQL Server no puede ver la base de datos Access a través de un recurso compartido de archivos o que sería demasiado difícil de lograr esto.
  3. No es necesario hacer juntas entre la base de datos de acceso y el servidor SQL, utilice únicamente los datos de la base de datos de acceso teh como elementos de búsqueda de su cláusula where

Si los supuestos anteriores son correctas, entonces se puede simplemente use ADO para abrir la base de datos de Access y recuperar los datos que necesita, posiblemente en un conjunto de datos o tabla de datos. Luego extraiga los datos que necesita y aliméntelos a una consulta ADO diferente a su servidor SQL en una cláusula where dinámica, una declaración preparada o mediante parámetros a un procedimiento almacenado.

Las otras soluciones que la gente está dando suponen que necesita hacer uniones en sus datos o ejecutar SQL que incluye ambas bases de datos. Para hacer eso, debe usar bases de datos vinculadas, o bien importar los datos en una tabla (quizás temporal).

1

Suponiendo que el servidor Sql puede acceder a las bases de datos de Access, puede construir una consulta OPENROWSET entre ellas.

SELECT a.* 
FROM SqlTable 
JOIN OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0', 
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'', 
    Orders 
) as b ON 
    a.Id = b.Id 

Simplemente cambiaría la ruta a la base de datos de Access en tiempo de ejecución para acceder a diferentes MDB.

Cuestiones relacionadas