Как создать объединение двух баз данных foxpro с помощью поставщика MS Ole DB? - PullRequest
3 голосов
/ 05 ноября 2010

Вопрос:

Я работаю с существующим коммерческим приложением MS Visual Foxpro, и мне нужно извлекать данные из базы данных напрямую, используя приложение c #. К сожалению, не все таблицы хранятся в одной базе данных, некоторые записи хранятся в базе данных с разбивкой по годам. Как создать запрос к этим двум базам данных, используя одно соединение?

Я использую Microsoft OLE DB Provider для Visual FoxPro 9.0 (SP2)

Подробнее:

По сути, информация о клиенте хранится в одной базе данных, а история покупок клиента хранится в базе данных с разбивкой по годам. Поэтому я пытаюсь создать простой запрос, чтобы распечатать клиентов и их последние покупки за этот год.

В графической форме файловая структура БД выглядит следующим образом:

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 ]

3 голосов
/ 05 ноября 2010

Если структура каталогов такая, как вы указываете ... где разные годы находятся под общим родительским элементом, вы можете запросить их все напрямую, просто указав относительный путь ...

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 голос
/ 05 ноября 2010

Добавьте обе таблицы FoxPro в DataSet либо с отдельными объектами OleDbConnection, либо повторно используя один объект OleDbConnection. Затем добавьте DataRelation между 2 таблицами данных.

Вы также можете попробовать добавить имя 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)"
...