2009-11-06 15 views
3

Nous avons une application qui crée un certain nombre de tables Visual Foxpro (DBF). Chacune de ces tables a un schéma différent, mais elles contiennent toutes un champ de date connu.Comment créer une nouvelle table VFP (OLEDB) à partir d'une table existante en utilisant .NET?

J'ai été invité à créer une autre application (en C#) qui va copier les données de la dernière semaine de chaque table vers une nouvelle table (dans un dossier différent des tables source). Les tables distinctes resteront (par exemple s'il y a trois tables source, il y aura trois tables de destination).

Au fil du temps, les tables peuvent changer (par exemple de nouveaux champs ajoutés), donc je ne peux pas faire d'hypothèses sur la structure de la table (hormis l'existence du champ de date mentionné ci-dessus).

Quel est le moyen le plus simple/le meilleur pour prendre les données d'une table et créer une nouvelle table avec la même structure?

Je sais comment interroger les tables pour extraire les données (par exemple remplir un DataSet avec les enregistrements de la semaine dernière). Cependant, je pense qu'il doit y avoir une meilleure façon de créer une nouvelle table et de la remplir avec les résultats que d'analyser manuellement toutes les informations du champ dans le schéma et de l'utiliser pour recréer la table de destination.

Travailler avec FoxPro semble être assez différent de SQL Server pour me donner un mal de tête à chaque tour, donc j'ai besoin de conseils sur mon approche.

Le pilote VFP 9 OLEDB est installé sur la machine de production. Si possible, nous préférerions ne pas avoir à installer beaucoup d'autre chose.

Répondre

2

Pour obtenir une copie exacte des données, table, et les dossiers, vous pouvez le faire via un seul SQL-Select via

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

Votre clause where pourrait être presque tout, et la clause INTO TABLE indique au moteur VFP pour créer le résultat est défini comme une nouvelle table, donc pas besoin de déclarer explicitement types, colonnes, etc, interroger les données de l'un et pousser dans un autre ...

Une question de considération ... Vérifiez que l'accès de l'utilisateur soit évidemment capable de créer, lire, écrire où que vous essayiez de créer la nouvelle table. Vous pouvez même spécifier un chemin complet, par exemple C: \ SomeOtherPath \ mois \ myTable1 si besoin ...

0

Essayez quelque chose comme ceci (note écrite en VB.NET et utilisation www.developerfusion.co.uk/tools convertis):

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

Vous pouvez simplement faire:

select * from myTable into table newTable [database dbName] 

comme Drapp a montré. Cependant, vous pouvez aussi vouloir obtenir des index (le cas échéant) (BTW créer des index via VFPOLEDB n'est pas supporté directement mais vous pouvez le faire en utilisant la fonction ExecScript()). Ensuite, le plus simple serait de copier les fichiers DBF, CDX (et FPT) de la table. VFP est basé sur un fichier.