Comment puis-je créer une nouvelle table VFP (OLEDB) à partir d'un .NET en utilisant un existant?

StackOverflow https://stackoverflow.com/questions/1686530

Question

Nous avons une application qui crée un certain nombre de tables Visual FoxPro (DBF). Chacune de ces tables ont un schéma différent, mais ils contiennent tous un champ de date connue.

On m'a demandé de créer une autre application (en C #) qui copie la semaine dernière la valeur de données de chaque table à une nouvelle table (dans un autre dossier aux tables source). Les tableaux distincts demeureront (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 des hypothèses sur la structure de la table (en dehors de l'existence du champ de date mentionnée ci-dessus).

Quel est le plus facile / meilleure façon de prendre les données d'une table et de 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 dossiers de la dernière semaine). Cependant, je pense, il doit y avoir une meilleure façon de créer une nouvelle table et le remplir avec les résultats que l'analyse syntaxique manuellement toutes les informations sur le terrain dans le schéma et à l'aide que 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 je besoin de quelques conseils sur mon approche.

La machine de production a le pilote VFP 9 OLEDB installé. Si possible, nous préférerions ne pas avoir à installer beaucoup d'autre.

Était-ce utile?

La solution

Pour obtenir une copie exacte des données, une table et des enregistrements, 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 jeu de résultats COMME NOUVELLE TABLE, donc pas besoin de déclarer explicitement les types, colonnes, etc., les données de la requête d'un et pousser dans une autre ...

Une question de considération ... Vérifiez l'accès des utilisateurs à être évidemment capable de créer, lire, écrire chaque fois que vous essayez de créer la nouvelle table. Vous pouvez même spécifier un chemin complet, par exemple C: \ SomeOtherPath \ mois \ myTable1 si besoin est ...

Autres conseils

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

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

Vous pouvez simplement faire:

select * from myTable into table newTable [database dbName]

comme Drapp a montré. Cependant, vous pouvez obtenir des indices aussi bien (le cas échéant) (création BTW index via vfpoledb ne sont pas pris en charge directement, mais vous pouvez le faire en utilisant la fonction ExecScript ()). Ensuite, le plus simple serait de copier DBF, fichiers CDX (et FPT) de la table. VFP est basé sur des fichiers.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top