我们有一个应用程序可以创建许多Visual Foxpro(DBF)表。每个表都有不同的模式,但它们都包含一个已知的日期字段。
我被要求创建另一个应用程序(在C#中),它将上周的每个表的数据复制到一个新表(在源表的不同文件夹中)。不同的表将保留(例如,如果有三个源表,则将有三个目标表)。
随着时间的推移,表格可能会发生变化(例如添加了新字段),因此我无法对表格结构做出假设(除了上述日期字段的存在外)。
从一个表中获取数据并创建具有相同结构的新表的最简单/最好的方法是什么?
我知道如何查询表以提取数据(例如,用上周的记录填充DataSet)。但是,我认为必须有一种更好的方法来创建一个新表并用结果填充它,而不是手动解析模式中的所有字段信息并使用它来重新创建目标表。
使用FoxPro似乎与SQL Server的不同之处让我在每个回合都让我头疼,所以我需要一些关于我的方法的指导。
生产机器上安装了VFP 9 OLEDB驱动程序。如果可能的话,我们不希望安装太多其他东西。
答案 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是基于文件的。