Как создать новую таблицу VFP (OLEDB) из существующей с помощью .NET?

StackOverflow https://stackoverflow.com/questions/1686530

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Ваше предложениеwhere может быть практически любым, а предложение Into TABLE сообщает движку VFP создать набор результатов КАК НОВУЮ ТАБЛИЦУ, поэтому нет необходимости явно объявлять типы, столбцы и т. д., запрашивать данные из одного и помещать его в другой...

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

Другие советы

Попробуйте что-то вроде этого (примечание написано на 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(); 
    } 
} 

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

select * from myTable into table newTable [database dbName]

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top