Как создать новую таблицу VFP (OLEDB) из существующей с помощью .NET?
-
18-09-2019 - |
Вопрос
У нас есть приложение, которое создает несколько таблиц 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 основан на файлах.