Frage

Ich habe eine Datenbank-Datei, die ich glaube, mit Clipper wurde erstellt, kann aber sicher nicht sagen, (I .ntx Dateien für Indizes, die ich verstehen, was Clipper verwendet). Ich versuche, eine C # .NET-Anwendung zu erstellen, die diese Datenbank mit dem System.Data.OleDb Namespace lesen.

Für den größten Teil I erfolgreich den Inhalt der Tabellen lesen kann, gibt es ein Feld, das kann ich nicht. Dieses Feld namens CTRLNUMS, die als CHAR (750) definiert ist. Ich habe verschiedene Artikel gefunden durch Google-Suchanfragen zu lesen, das Feld deuten darauf hin, die größer als 255 Zeichen über einen anderen Prozess gelesen werden müssen als die normale Zuordnung zu einem String-Variable. Bisher habe ich nicht erfolgreich gewesen in einem Ansatz, den ich gefunden habe.

Das folgende ist ein Beispiel-Code-Snippet ich die Tabelle zu lesen und bin mit zwei Optionen, die ich verwenden, um das CTRLNUMS Feld zu lesen. Beide Optionen in 238 Zeichen geführt werden zurückgegeben, obwohl 750 Zeichen auf dem Feld.

gespeichert ist

Hier ist meine Verbindungszeichenfolge:

Provider = Microsoft.Jet.OLEDB.4.0; Data Source = c: \ datadir; Erweiterte Eigenschaften = DBASE IV;

Kann mir jemand sagen, das Geheimnis zu größeren Felder aus einer DBF-Datei zu lesen?

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;
                    }
                }
            }
        }
    }
}
War es hilfreich?

Lösung

Sie können eine Beschreibung der DBF-Struktur finden Sie hier: http: // www. dbf2002.com/dbf-file-format.html

Was ich denke, Clipper zu tun verwendet wurde, war die Feldstruktur zu ändern, so dass in Zeichenfelder hielten die Dezimalstellen das höherwertige Byte der Größe, also Charakter Feldgrößen waren wirklich 256 * Decimals + Größe.

Ich kann eine C # Klasse, die dBFS (nativ, nicht ADO / DAO) liest, könnte es geändert werden, um diesen Fall zu behandeln. Lassen Sie mich wissen, wenn Sie interessiert sind.

Andere Tipps

Sie suchen noch nach einer Antwort? Ist dies ein einmaliger Job oder etwas, das regelmäßig getan werden muss?

Ich habe ein Python-Modul, das in erster Linie dazu bestimmt ist, Daten aus allen Arten von DBF-Dateien zu extrahieren ... damit umgehen noch nicht den length_high_byte = decimal_places Hack, aber es ist eine triviale Änderung. Ich würde ganz gerne (a) teilen diese mit Ihnen und / oder (b) erhalten eine Kopie eines solchen DBF-Datei zum Testen.

später hinzugefügt: Extended-Länge-Funktion hinzugefügt und getestet gegen Dateien, die ich selbst erstellt habe. Verschenken Code zu teilen mit jedem, der möchte, dass es testen, noch steht. Noch Interesse für die Prüfung einiger „echte“ Dateien selbst zu bekommen.

3 Vorschläge, die einen Versuch wert sein könnte ...

. 1 - Access eine verknüpfte Tabelle zu der DBF-Datei zu erstellen, dann .NET verwenden, um die Tabelle in der Access-Datenbank zu schlagen statt auf den DBF direkt gehen

2 - versuchen die FoxPro OLE DB-Provider

3 - analysieren, um die DBF-Datei von Hand. Beispiel hier .

Meine Vermutung ist, dass # 1 sollte die einfachste Arbeit, und # 3 gibt Ihnen die Möglichkeit zur Feinabstimmung Ihrer fluchen Fähigkeiten. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top