【问题标题】:How to create a join across two foxpro databases using the MS Ole DB provider?如何使用 MS Ole DB 提供程序跨两个 foxpro 数据库创建连接?
【发布时间】:2010-11-05 14:55:43
【问题描述】:

问题:

我正在使用现有的商业 MS Visual Foxpro 应用程序,并且需要使用 c# 应用程序直接从数据库中提取数据。不幸的是,并非所有的表都存储在同一个数据库中,一些记录存储在按年份细分的数据库中。如何使用单个联接针对这两个数据库创建查询?

我正在使用微软的OLE DB Provider for Visual FoxPro 9.0 (SP2)

更多细节:

本质上,客户信息存储在一个数据库中,客户购买历史存储在一个按年份细分的数据库中。因此,我正在尝试创建一个简单的查询来打印客户和他们今年以来的最新购买记录。

在图形形式中,db的文件结构如下所示:

Data\
 +-2009\
 |  +-MyDB.dbc
 |  +-Sales.dbf
 +-2010\
 |  +-MyDB.dbc
 |  +-Sales.dbf
 +-MyDB.dbc
 +-Customers.dbf

目前我可以单独连接到每个数据库,并查询它们:

// This works to connect to the customer DB
string connectionPath1 = @"Provider=vfpoledb.1;Data Source=E:\Data\MyDB.dbc";
OleDbConnection conn1 = new OleDbConnection(connectionPath1);
OleDbCommand command1 = new OleDbCommand(@"SELECT * FROM Customers", conn1);
OleDbDataReader reader1 = command1.ExecuteReader();

// This works to connect to the annual sales record DB
string connectionPath2 = @"Provider=vfpoledb.1;Data Source=E:\Data\2010\MyDB.dbc";
OleDbConnection conn2 = new OleDbConnection(connectionPath2);
OleDbCommand command2 = new OleDbCommand(@"SELECT * FROM Sales", conn2);
OleDbDataReader reader2 = command2.ExecuteReader();

我不能执行我的 join 语句:

//How do I do this?
OleDbConnection connMagic = new OleDbConnection(connectionPath1, connectionPath2); //non-valid code
OleDbCommand commandIWant = new OleDbCommand(@"SELECT Customers.Name, Sales.Item, Sales.Date FROM Customers LEFT JOIN Sales ON (Customers.ID=Sales.CustomerID)", connMagic);
OleDbDataReader reader3 = commandIWant.ExecuteReader();

【问题讨论】:

    标签: c# sql oledb foxpro


    【解决方案1】:

    如果目录结构如您所指...其中不同年份都在父公用之下,您可以通过包含相对路径直接查询所有这些...

    select 
          a1.Whatever,
          b1.Sales1
       from
          Customers a1,
          2009\Sales b1
       where 
          a1.CustomerID = b1.CustomerID
    union all
    select 
          a1.Whatever,
          b1.Sales1
       from
          Customers a1,
          2010\Sales b1
       where 
          a1.CustomerID = b1.CustomerID
    union ... 
    

    您甚至不必对实际的 DBC 进行限定,OleDB 应该会自动检测它,但正如您的原始样本所表明的那样,包含它并不会造成伤害...

    【讨论】:

      【解决方案2】:

      使用单独的 OleDbConnection 对象或通过重用一个 OleDbConnection 对象将两个 FoxPro 表添加到 DataSet。然后在 2 个 DataTables 之间添加一个DataRelation

      您也可以尝试将 DBC 名称添加到您的 SQL SELECT:

      "SELECT c.Name, s.Item, s.Date FROM MyDB!Customers c LEFT JOIN 2009\MyDB!Sales s ON (c.ID=s.CustomerID)"
      

      【讨论】:

        猜你喜欢
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多