如何使用.NET从现有的表创建新的VFP(OLEDB)表?

时间:2009-11-06 09:49:10

标签: c# oledb foxpro visual-foxpro

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

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

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

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

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

使用FoxPro似乎与SQL Server的不同之处让我在每个回合都让我头疼,所以我需要一些关于我的方法的指导。

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

3 个答案:

答案 0 :(得分: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引擎创建结果集AS A NEW TABLE,因此不需要显式声明类型,列等,从一个查询数据并推送到另一个...

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

答案 1 :(得分: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(); 
    } 
} 

答案 2 :(得分:0)

你可以简单地做一个:

select * from myTable into table newTable [database dbName]
正如DRapp所示。但是,您可能也希望获得索引(如果有的话)(BTW通过VFPOLEDB创建索引不是直接支持,但您可以使用ExecScript()函数执行此操作)。然后最简单的方法是复制表的DBF,CDX(和FPT)文件。 VFP是基于文件的。