跨多个数据库的交叉引用

时间:2008-10-27 14:13:26

标签: c# sql sql-server ms-access ado.net

我有两个数据库,一个是MS Access文件,另一个是SQL Server数据库。我需要创建一个SELECT命令,根据Access数据库中的数据过滤SQL Server数据库中的数据。使用ADO.NET实现这一目标的最佳方法是什么?

我可以将每个数据库中所需的数据提取到两个新表中。将它们放在一个数据集中。然后在数据集上执行另一个SELECT命令以组合数据?

其他信息: Access数据库不是永久性的。要使用的Access文件由用户在运行时设置。

这里有一些背景信息可以解释为什么有两个数据库。我的公司使用CAD程序来设计建筑物。该程序将CAD模型中使用的材料存储在Access数据库中。每个型号都有一个文件。我正在编写一个程序,为每个模型生成成本信息。这基于存储在SQL Server数据库中的当前材料价格。


我的解决方案

我最终只是将访问数据库中的数据导入SQL Server db中的临时表。执行所有必要的处理然后删除临时表。这不是一个漂亮的解决方案,但它确实有效。

6 个答案:

答案 0 :(得分:3)

如果您不必这样做,则不希望同时拉出两个数据集。您也将无法实施Tomalak的解决方案,因为文件位置可能会发生变化,甚至可能无法为服务器本身提供。

我的猜测是,您的用户使用人员/产品或他们感兴趣的任何内容设置Access数据库,这就是您需要在两个数据库中进行选择的原因。如果是这种情况,Access表可能比SQL Server表小。您最好的办法是提取Access数据,然后使用它来生成对SQL Server的筛选查询,以便最大限度地减少通过网络发送的数据。

所以,最重要的是:

  1. 过滤服务器上的数据,以便最大限度地减少网络流量,同时也因为数据库的过滤速度比ADO.NET快。
  2. 如果您必须选择要引入应用程序的数据集,请拉入较小的数据集,然后使用该数据集过滤其他表格。

答案 1 :(得分:1)

假设Sql Server可以访问Access数据库,您可以在它们之间构建OPENROWSET查询。

 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

您只需在运行时更改Access数据库的路径即可访问不同的MDB。

答案 2 :(得分:0)

首先,您需要在服务器上执行某些操作 - 将Access数据库引用为“链接服务器”。

然后,您将能够从SQL服务器中查询它,根据需要提取或填充数据。这个网页提供了一个很好的概述,如何做到这一点。

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

答案 3 :(得分:0)

您是否尝试过基准测试,如果您通过ODBC从Access前端链接到SQL Server并编写SQL,就好像两个表都是本地的?然后,您可以在服务器上执行跟踪,以确切了解Jet发送到服务器的内容。你可能会惊讶于Jet对这种东西有多高效。如果你在一个关键字段上链接(例如,和ID字段,无论是否来自SQL Server),Jet可能会发送一个ID列表。或者您可以编写SQL来执行此操作(在WHERE子句中使用IN SELECT ...)。

基本上,事情的效率取决于WHERE子句的执行位置。例如,如果您在一个字段上加入一个带有链接SQL Server表的本地Jet表,并根据本地表中的值过滤结果,那么它很可能非常有效,因为Jet将是唯一的东西。发送到服务器是过滤SQL Server表所必需的。

但是,它将完全取决于您正在尝试做什么(即,您正在过滤哪些字段)。但让Jet有机会看看它是不是很聪明,而不是假装Jet将它搞砸了。可能需要进行一些调整才能让Jet高效工作,但是如果你可以保留所有逻辑客户端,那么你最好不要试图从服务器跟踪所有Access数据库。

答案 4 :(得分:0)

如果我正确地阅读了这个问题,那么您不会尝试跨多个数据库进行交叉引用。

您只需要引用有关特定FILE的详细信息,在这种情况下,可以包含:

主键,父文件校验和(如果是修改),文件校验和,最后一位已知作者,修订号,最后一次更改日期......

然后使用您的程序添加从分析该文件获得的信息时的主键。

如果您确实需要分布式数据库,也许您更愿意使用非关系型数据库,例如LDAP。

如果您不能使用LDAP,但必须使用关系数据库,则可以考虑使用GUID来确保您的主键是好的。

答案 5 :(得分:0)

由于您没有提供足够的信息,我将不得不做出一些假设。

假设:

  1. SQL Server和Access数据库不在同一台计算机上
  2. SQL Server无法通过文件共享查看Access数据库,或者实现此目的太难了。
  3. 您不需要在访问数据库和SQL Server之间进行连接,只使用来自访问数据库的数据作为where子句的查找元素
  4. 如果上述假设是正确的,那么您只需使用ADO打开Access数据库并检索所需的数据,可能在数据集或数据表中。然后提取所需的数据,并将其提供给动态Where子句,预准备语句或通过存储过程参数的SQL Server的不同ADO查询。

    人们给予的所有其他解决方案都假设您需要对数据进行连接或以其他方式执行包含两个数据库的SQL。为此,您必须使用链接数据库,否则将数据导入表(可能是临时的)。