2009-11-06 1 views
3

У нас есть приложение, которое создает несколько таблиц Visual Foxpro (DBF). Каждая из этих таблиц имеет другую схему, но все они содержат известное поле даты.Как создать новую таблицу VFP (OLEDB) из существующей с помощью .NET?

Мне было предложено создать другое приложение (на C#), которое скопирует данные за прошлую неделю из каждой таблицы в новую таблицу (в другой папке в исходные таблицы). Отдельные таблицы останутся (например, если есть три исходные таблицы, будут три таблицы назначения).

С течением времени таблицы могут меняться (например, новые поля добавлены), поэтому я не могу делать предположения о структуре таблицы (помимо существования вышеупомянутого поля даты).

Какой самый простой/лучший способ взять данные из одной таблицы и создать новую таблицу с той же структурой?

Я знаю, как запрашивать таблицы для извлечения данных (например, заполнить DataSet записями прошлой недели). Однако я думаю, что должен быть лучший способ создать новую таблицу и заполнить ее результатами, чем вручную разобрать всю информацию о поле в схеме и использовать ее для воссоздания таблицы назначения.

Работа с FoxPro, по-видимому, достаточно отличается от SQL Server, чтобы дать мне головную боль на каждом шагу, поэтому мне нужно руководствоваться моим подходом.

У производственной машины установлен установленный на ней драйвер VFP 9 OLEDB. Если возможно, мы предпочли бы не устанавливать больше других.

ответ

2

Чтобы получить точную копию данных, таблицы и записи, вы можете сделать это с помощью одного SQL-Select с помощью

OleDbConnection oConn = new OleDbConnection("Provider=VFPOLEDB.1;Data Source=C:\\SomePath"); 
OleDbCommand oCmd = new OleDbCommand(); 
oCmd.Connection = oConn; 
oCmd.Connection.Open(); 
oCmd.CommandText = "select * from SomeTable where someCondition into table YourNewTable"; 
oCmd.ExecuteNonQuery();   
oConn.Close(); 

Вашего где положение может быть практически что угодны, и положение в таблице говорит двигатель VFP для создания результирующего набора AS новой таблицы, поэтому нет необходимости явно объявлять типы, столбцы и т. д., запрашивать данные из одного и вставлять в другой ...

Один вопрос рассмотрения ... Убедитесь, что пользовательский доступ, очевидно, сможет создавать, читать, писать везде, где вы пытаетесь создать новую таблицу. Вы даже можете указать полный путь, например, C: \ SomeOtherPath \ месяц \ MyTable1 если нужно ...

0

Попробуйте что-то вроде этого (примечание написано в VB.NET и превращали использование www.developerfusion.co.uk/tools):

using System.Data.OleDb; 
using System.IO; 

static class Module1 
{ 
    public static void Main() 
    { 
     OleDbConnection oConn = new OleDbConnection("Provider=VFPOLEDB.1;Data Source=C:\\"); 
     OleDbCommand oCmd = new OleDbCommand(); 

     { 
      oCmd.Connection = oConn; 
      oCmd.Connection.Open(); 
      // Create a sample FoxPro table 
      oCmd.CommandText = "CREATE TABLE Table1 (FldOne c(10))"; 
      oCmd.CommandType = CommandType.Text; 
      oCmd.ExecuteNonQuery(); 
     } 

     oConn.Close(); 
     oConn.Dispose(); 
     oCmd.Dispose(); 
    } 
} 
0

Вы можете просто сделать:

select * from myTable into table newTable [database dbName] 

как показал DRapp. Однако вы можете также получить индексы (если они есть) (BTW-создание индексов через VFPOLEDB напрямую не поддерживается, но вы можете сделать это с помощью функции ExecScript()). Тогда самым простым было бы скопировать файлы DBF, CDX (и FPT) таблицы. VFP основан на файлах.