3

我们有一个创建许多 Visual Foxpro (DBF) 表的应用程序。这些表中的每一个都有不同的模式,但它们都包含一个已知的日期字段。

我被要求创建另一个应用程序(在 C# 中),它将上周的数据从每个表复制到一个新表(在与源表不同的文件夹中)。将保留不同的表(例如,如果有三个源表,则将有三个目标表)。

随着时间的推移,表格可能会发生变化(例如添加的新字段),因此我无法对表格结构做出假设(除了上述日期字段的存在)。

从一个表中获取数据并创建具有相同结构的新表的最简单/最佳方法是什么?

我知道如何查询表以提取数据(例如用上周的记录填充数据集)。但是,我认为必须有一种更好的方法来创建新表并用结果填充它,而不是手动解析模式中的所有字段信息并使用它来重新创建目标表。

使用 FoxPro 似乎与 SQL Server 有很大的不同,每次都让我头疼,所以我需要一些关于我的方法的指导。

生产机器上安装了 VFP 9 OLEDB 驱动程序。如果可能的话,我们宁愿不必安装太多其他东西。

4

3 回答 3

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

您的 where 子句几乎可以是任何东西,并且 Into TABLE 子句告诉 VFP 引擎将结果集创建为新表,因此无需显式声明类型、列等,从一个查询数据并推送到另一个...

一个需要考虑的问题...验证用户访问权限显然能够在您尝试创建新表的任何地方创建、读取、写入。如果需要,您甚至可以指定完全限定的路径,例如 C:\SomeOtherPath\Monthly\MyTable1...

于 2009-11-07T03:47:45.947 回答
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(); 
    } 
} 
于 2009-11-06T13:55:39.847 回答
0

你可以简单地做一个:

select * from myTable into table newTable [database dbName]

正如 DRapp 所示。但是,您可能还想获取索引(如果有的话)(顺便说一句,不直接支持通过 VFPOLEDB 创建索引,但您可以使用 ExecScript() 函数这样做)。然后最简单的方法是复制表的 DBF、CDX(和 FPT)文件。VFP 是基于文件的。

于 2013-04-23T21:07:05.560 回答