Domanda

Ho un file di database che ho beleive è stato creato con Clipper, ma non posso dire con certezza (Ho i file .ntx per gli indici che capisco è quello che utilizza Clipper). Sto cercando di creare un'applicazione C # che leggerà questo database utilizzando lo spazio dei nomi System.Data.OleDb.

Per la maggior parte posso con successo leggere il contenuto delle tabelle v'è un campo che non posso. Questo campo chiamato CTRLNUMS che è definito come un CHAR (750). Ho letto vari articoli trovati attraverso ricerche su Google che suggeriscono campo maggiore di 255 caratteri devono essere letti attraverso un processo diverso rispetto l'assegnazione normale ad una variabile stringa. Finora non ho avuto successo in un approccio che ho trovato.

Il seguente è un frammento di codice di esempio che sto usando per leggere la tabella e include due opzioni che ho usato per leggere il campo CTRLNUMS. Entrambe le opzioni portato in 238 caratteri da restituire, anche se ci si trova a 750 caratteri memorizzati nel campo.

Ecco la mia stringa di connessione:

Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C: \ datadir; estesa Proprietà = dBASE IV;

Qualcuno può dirmi il segreto per leggere campi più grandi da un file DBF?

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();

    using (OleDbCommand cmd = new OleDbCommand())
    {
        cmd.Connection = conn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = string.Format("SELECT ITEM,CTRLNUMS FROM STUFF WHERE ITEM = '{0}'", stuffId);

        using (OleDbDataReader dr = cmd.ExecuteReader())
        {
            if (dr.Read())
            {
                stuff.StuffId = dr["ITEM"].ToString();

                // OPTION 1
                string ctrlNums = dr["CTRLNUMS"].ToString();

                // OPTION 2
                char[] buffer = new char[750];
                int index = 0;
                int readSize = 5;
                while (index < 750)
                {
                    long charsRead = dr.GetChars(dr.GetOrdinal("CTRLNUMS"), index, buffer, index, readSize);

                    index += (int)charsRead;

                    if (charsRead < readSize)
                    {
                        break;
                    }
                }
            }
        }
    }
}
È stato utile?

Soluzione

È possibile trovare una descrizione della struttura DBF qui: http: // www. dbf2002.com/dbf-file-format.html

Quello che penso Clipper usato per fare era modificare la struttura campo in modo che, in campi di caratteri, le cifre decimali tenuto il byte di ordine delle dimensioni, in modo da dimensioni del campo di caratteri erano davvero 256 * decimali + Dimensioni.

io possa avere un # di classe C che legge dBFS (in modo nativo, senza ADO / DAO), potrebbe essere modificato per gestire questo caso. Fatemi sapere se siete interessati.

Altri suggerimenti

Siete ancora alla ricerca di una risposta? E 'questo un lavoro one-off o qualcosa che deve fare regolarmente?

Ho un modulo Python che è principalmente destinato a estrarre i dati da tutti i tipi di file DBF ... ma non risulta ancora gestire l'hack length_high_byte = decimal_places, ma è un cambiamento banale. Sarei molto felice di (a) condividere questo con voi e / o (b) ottenere una copia di un file DBF per il test.

aggiunto in seguito: di funzionalità estese di lunghezza ha aggiunto, e testato contro i file che mi sono creato. Offrire a condividere il codice con tutti coloro che vogliono mettere alla prova si trova tuttora. Sempre interessati a ottenere alcuni file "reali" me stesso per il test.

3 suggerimenti che forse vale la pena un colpo ...

1 -. Utilizzare Access per creare una tabella collegata al file DBF, quindi utilizzare .Net per colpire la tabella nel database di Access invece di andare direttamente al DBF

2 - provare il FoxPro OLE DB provider di

3 - analizza il file DBF a mano. Esempio è qui .

La mia ipotesi è che # 1 dovrebbe funzionare il più facile, e # 3 vi darà l'opportunità di mettere a punto le tue abilità di imprecazioni. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top