8

我有两个数据库,一个是 MS Access 文件,另一个是 SQL Server 数据库。我需要创建一个 SELECT 命令,该命令根据 Access 数据库中的数据过滤 SQL Server 数据库中的数据。使用 ADO.NET 完成此任务的最佳方法是什么?

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

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

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


我的解决方案

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

4

6 回答 6

3

如果您不必这样做,您不想同时拉动两个数据集。由于文件位置可能会更改,甚至可能无法随时供服务器本身使用,因此您在实施 Tomalak 的解决方案时也会遇到麻烦。

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

所以,最重要的是:

  1. 过滤服务器上的数据,以便您可以最大限度地减少网络流量,并且因为数据库在过滤方面将比 ADO.NET 更快
  2. 如果您必须选择要拉入应用程序的数据集,请拉入较小的数据集,然后使用该数据集过滤另一个表。
于 2008-10-27T14:55:16.180 回答
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。

于 2009-03-10T10:06:12.697 回答
0

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

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

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

于 2008-10-27T14:18:56.270 回答
0

如果您通过 ODBC 从 Access 前端链接到 SQL Server 并像两个表都是本地表一样编写 SQL,您是否尝试过基准测试?然后,您可以在服务器上进行跟踪以准确查看 Jet 发送到服务器的内容。你可能会惊讶于 Jet 在这种事情上的效率。如果您正在链接关键字段(例如,ID 字段,无论是否来自 SQL Server),Jet 很可能会发送 ID 列表。或者你可以编写你的 SQL 来这样做(在你的 WHERE 子句中使用 IN SELECT ...)。

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

不过,这将完全取决于您要执行的操作(即您要过滤的字段)。但是给 Jet 一个机会来看看它是否聪明,而不是假设 Jet 会搞砸它。很可能需要进行一些调整才能让 Jet 有效地工作,但是如果您可以将所有逻辑保留在客户端,那么您最好不要试图从服务器跟踪所有 Access 数据库。

于 2008-10-27T19:54:24.393 回答
0

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

您只需要参考有关特定文件的详细信息,在这种情况下,可能包含:

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

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

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

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

于 2009-03-06T06:09:33.330 回答
0

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

假设:

  1. SQL Server 和 Access 数据库不在同一台计算机上
  2. SQL Server 无法通过文件共享看到 Access 数据库,否则很难实现这一点。
  3. 您不需要在 access 数据库和 sql server 之间进行连接,只需使用 access 数据库中的数据作为 where 子句的查找元素

如果上述假设是正确的,那么您可以简单地使用 ADO 打开 Access 数据库并检索您需要的数据,可能在数据集或数据表中。然后提取您需要的数据,并通过动态 Where 子句、预准备语句或通过存储过程的参数将其提供给 SQL Server 的不同 ADO 查询。

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

于 2009-03-10T00:04:19.583 回答