Pregunta

Tenemos una aplicación que crea una serie de tablas de Visual FoxPro (DBF). Cada una de estas tablas tienen un esquema diferente, pero todos ellos contienen un campo de fecha conocida.

Me han pedido para crear otra aplicación (en C #) que copiará la pena de la semana pasada de los datos de cada tabla a una nueva tabla (en una carpeta diferente a las tablas de origen). Las tablas distintas permanecerán (por ejemplo, si hay tres tablas de origen, habrá tres tablas de destino).

Con el tiempo las tablas pueden cambiar (por ejemplo, nuevos campos añadidos), por lo que no pueden hacer suposiciones sobre la estructura de la tabla (aparte de la existencia del campo de la fecha antes mencionada).

¿Cuál es la mejor manera más fácil / para tomar los datos de una tabla y crear una nueva tabla con la misma estructura?

Yo sé cómo consultar las tablas para extraer los datos (por ejemplo, llenar un conjunto de datos con los registros de la semana pasada). Sin embargo, estoy pensando que debe haber una mejor manera de crear una nueva tabla y llenarla con los resultados que analizar manualmente toda la información de campo en el esquema y utilizarlo para crear la tabla de destino.

Trabajar con FoxPro parece ser lo suficientemente diferente de SQL Server para darme un dolor de cabeza en cada vuelta, así que necesito una cierta dirección en mi enfoque.

La máquina de producción tiene el controlador OLEDB VFP 9 instalado en él. Si es posible, se prefiere no tener que instalar nada más.

¿Fue útil?

Solución

Para obtener una copia exacta de los datos, tabla, y los registros, puede hacerlo a través de una única vía 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();

Su cláusula de donde podría ser casi cualquier cosa, y la cláusula en la tabla le indica al motor de VFP para crear el conjunto de resultados como una tabla nueva, por lo que no hay necesidad de declarar explícitamente tipos, columnas, etc, datos de consulta de uno y empujar a otro ...

Una cuestión de consideración ... Verificar el acceso del usuario a ser, obviamente, capaz de crear, leer, escribir donde quiera que está tratando de crear la nueva tabla. Incluso puede especificar una ruta de acceso completa, como por ejemplo C: \ SomeOtherPath \ mensual \ MyTable1 si es necesario ...

Otros consejos

Trate algo como esto (nota escrita en VB.NET y convertido www.developerfusion.co.uk/tools uso):

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

Puede simplemente hacer una:

select * from myTable into table newTable [database dbName]

como mostró Drapp. Sin embargo es posible que desee obtener índices también (si lo hay) (Por cierto a través de la creación de índices vfpoledb no se admite directamente, sino que se puede hacer por medio de la función ExecScript ()). A continuación, el más fácil sería copiar los archivos de la tabla DBF, CDX (y FPT). VFP se basa archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top