如何使用MS Ole DB提供程序在两个foxpro数据库中创建连接?

时间:2010-11-05 14:55:43

标签: c# sql oledb foxpro

问题:

我正在使用现有的商业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();

我不能做的是执行我的连接声明:

//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();

2 个答案:

答案 0 :(得分:3)

如果目录结构与您指示的那样......不同的年份都在父共同之下,您只需通过包含相对路径就可以直接查询所有这些...

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应该自动检测它,但是包含它不会像原始样本那样受到伤害......

答案 1 :(得分:1)

使用单独的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)"