كيف يمكنني استخراج البيانات في FoxPro مذكرة مجال استخدام .الشبكة ؟

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

سؤال

أنا أكتب C# برنامج لتحويل قاعدة بيانات FoxPro إلى XML ، و يعمل كل شيء ما عدا مذكرة الحقل فارغا.هل هناك شيء أنا في عداد المفقودين إلى تحويل هذا الشيء ؟

أنا باستخدام C# .Net framework 3.5 المزود بحزمة الخدمة SP1 Visual FoxPro 9 SP 1 OLE DB السائق.سلسلة اتصال بخير وجميع البيانات الأخرى التي تم سحبها بشكل صحيح.

عندما تحولت FoxPro قاعدة البيانات إلى SQL Server حقل المذكرة أيضا فارغة هناك, لذلك أنا لا يمكن تحويل مرتين.

هل كانت مفيدة؟

المحلول

وانتهى الأمر الحاجة إلى القيام ببعض العمل نفسي، ولكن ربما يمكن أن يساعد شخص آخر في المستقبل:

        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).

نصائح أخرى

أنا ليست مألوفة مع C# أو FoxPro أو SQL Server, لذلك أنا لا يمكن أن تعطي لك الكثير من النصائح في هذا الصدد.

ومع ذلك, إذا كنت لا يمكن العثور على برنامج تشغيل مناسب ، قد تنظر في تحليل البيانات الخام مذكرة ملفات نفسك.سؤال آخر تعاملت مع هذا:

ما هي أسهل طريقة لقراءة FoxPro ملف DBF من الثعبان ؟

صدق أو لا تصدق, تنسيقات الملفات هذه هي بسيطة جدا لتحليل يجب أن تقرر الكتابة الخاصة بك C# محلل.هذه المواصفات المتوفرة من Microsoft:

ويمكنني استخدام ODBC لربط VFP 8 الجداول وحقول المذكرة يعمل مع أي مشكلة. أنا لا أعرف إذا كان OLEDB مختلفة.

وأنت قد لا يكون الجداول FoxPro مرئي هنا. العديد من أنظمة VFP تستخدم نفس الجداول مثل الفوكس برو 2 أو قديمه تطبيق التي حلت محلها. هل يمكن أن ننظر في رأس الملف أو مجرد محاولة أحد السائقين ODBC أخرى لمعرفة ما إذا كانوا يعملون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top