4

FoxPro データベースを XML に変換する C# プログラムを作成していますが、メモ フィールドが空白であること以外はすべて機能します。そのビットを変換するために欠けているものはありますか?

C# .Net 3.5 SP1、Visual FoxPro 9 SP 1 OLE DB ドライバーを使用しています。他のすべてのデータが適切にプルされているため、接続文字列は問題ありません。

FoxPro データベースを SQL Server に変換したところ、メモ欄も空欄になってしまい、2 回変換できませんでした。

4

3 に答える 3

3

自分でいくつかの作業をしなければならなくなったが、将来的に誰かを助けることができるかもしれない:

        public static object GetDbaseOrFoxproRawValue(string DBPath, string TableName, string ColumnName, 
        string CompareColumnName, string CompareValue, bool CompareColumnIsAutoKey)
    {
        using (BinaryReader read = new BinaryReader(File.Open(
            Path.Combine(DBPath, TableName + ".dbf"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
        {
            // Is it a type of file that I can handle?
            if (new byte[] { 0x02, 0x03, 0x30, 0x43, 0x63, 0x83, 0x8b,
                             0xcb, 0xf5, 0xfb }.Contains(read.ReadByte()))
            {
                // Skip date.
                read.BaseStream.Seek(3, SeekOrigin.Current);

                // Read useful datas...
                uint RecordCount = read.ReadUInt32();
                ushort FirstRecord = read.ReadUInt16();
                ushort RecordLength = read.ReadUInt16();
                int FieldCount = FirstRecord - 296 / 32;

                // Make sure things aren't stupid.
                ColumnName = ColumnName.ToLower();
                CompareColumnName = CompareColumnName.ToLower();

                // Find target column (field)
                string temp;
                UInt32 CompareFieldOffset = uint.MaxValue, FieldOffset = uint.MaxValue;
                byte CompareFieldLength = 0, FieldLength = 0;
                char FieldType = ' ';
                for (int i = 0; i < FieldCount; i++)
                {
                    read.BaseStream.Seek(32 + (i * 32), SeekOrigin.Begin);
                    temp = Encoding.ASCII.GetString(read.ReadBytes(11)).Replace("\0", "").ToLower();
                    if (temp == CompareColumnName)
                    {
                        read.ReadChar();
                        CompareFieldOffset = read.ReadUInt32();
                        CompareFieldLength = read.ReadByte();
                    }
                    if (temp == ColumnName)
                    {
                        FieldType = read.ReadChar();
                        FieldOffset = read.ReadUInt32();
                        FieldLength = read.ReadByte();
                    }

                    if (CompareFieldOffset != uint.MaxValue && FieldOffset != uint.MaxValue)
                        break;
                }

                // Make sure we can continue.
                if (CompareFieldOffset == uint.MaxValue || 
                    FieldOffset == uint.MaxValue) return null;

                // Iterate through each record to find the one we want.
                for (int index = 0; index < RecordCount; index++)
                {
                    read.BaseStream.Seek(FirstRecord + (index * RecordLength) + CompareFieldOffset, SeekOrigin.Begin);
                    temp = Encoding.Default.GetString(read.ReadBytes(CompareFieldLength)).Replace("\0", "");
                    if (temp == CompareValue)
                    {
                        read.BaseStream.Seek(FirstRecord + (index * RecordLength) + FieldOffset, SeekOrigin.Begin);
                        switch (FieldType)
                        {
                            case 'M':
                            case 'I': return read.ReadUInt32();
                            case 'C':
                            default: return Encoding.Default.GetString(read.ReadBytes(FieldLength)).Replace("\0", "");
                        }
                    }
                }
            }
            else
            {
                return null;
            }
        }

        return null;
    }

その結果を取得して、メモファイルのインデックスとして使用するだけです(このコードは、MSDNドキュメントを使用すると非常に簡単です)。

于 2009-01-12T16:55:12.300 に答える
1

ODBC を使用して VFP 8 テーブルをリンクしていますが、メモ フィールドは問題なく動作します。OLEDBが違うかどうかはわかりません。

ここに Visual FoxPro テーブルがない可能性があります。多くの VFP システムは、置き換えた FoxPro 2 または dBase アプリケーションと同じテーブルを使用しています。ファイル ヘッダーを確認するか、他の ODBC ドライバーのいずれかを試して、それらが機能するかどうかを確認してください。

于 2009-01-09T15:45:43.580 に答える
1

私は C# や FoxPro や SQL Server にあまり詳しくないので、その点に関してあまりアドバイスすることはできません。

ただし、適切なドライバーが見つからない場合は、生データとメモ ファイルを自分で解析することを検討してください。別の質問がこれを扱っています:

Python から FoxPro DBF ファイルを読み取る最も簡単な方法は何ですか?

信じられないかもしれませんが、これらのファイル形式は、独自の C# パーサーを作成することを決定した場合に解析するのが非常に簡単です。これらの仕様は、Microsoft から入手できます。

于 2009-01-09T14:44:51.957 に答える