コード例 #1
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string file = (string)e.Argument;

            try
            {
                m_dbreader = DBReaderFactory.GetReader(file, m_definition);
            }
            catch (Exception ex)
            {
                ShowErrorMessageBox(ex.Message);
                e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];
            int[]    sizes = new int[m_fields.Count];

            for (int j = 0; j < m_fields.Count; ++j)
            {
                types[j] = m_fields[j].Attributes["type"].Value;
                sizes[j] = int.Parse(m_fields[j].Attributes["size"]?.Value ?? "1");
            }

            m_formats = new XmlAttribute[sizes.Sum()];
            for (int j = 0, k = 0; j < m_fields.Count; ++j, ++k)
            {
                for (var s = 0; s < sizes[j]; ++s)
                {
                    m_formats[k] = m_fields[j].Attributes["format"];
                }
            }

            // hack for *.adb files (because they don't have FieldsCount)
            bool notADB = !(m_dbreader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notWDB = !(m_dbreader is WDBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notSTL = !(m_dbreader is STLReader);
            // hack for *.db2 files v3 (because they don't have FieldsCount)
            bool notDB3 = !(m_dbreader is DB3Reader);

            if (m_fields.Count != m_dbreader.FieldsCount && notADB && notWDB && notSTL && notDB3)
            {
                string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_dbreader.FieldsCount);
                ShowErrorMessageBox(msg);
                e.Cancel = true;
                return;
            }

            m_dataTable        = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            //bool extraData = false;

            foreach (var row in m_dbreader.Rows) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                using (BinaryReader br = row)
                {
                    int j = 0;
                    if (m_dbreader.HasSeparateIndexColumn)
                    {
                        dataRow[j++] = br.ReadUInt32();
                    }

                    for (int c = 0; c < m_fields.Count; ++c)    // Add cells
                    {
                        for (var arrSize = 0; arrSize < sizes[c]; ++arrSize, ++j)
                        {
                            var type = types[c];
                            if (type == "int" || type == "uint")
                            {
                                var typeOverride = m_dbreader.GetIntLength(c);
                                if (typeOverride != null)
                                {
                                    type = typeOverride;
                                }
                            }

                            switch (type)
                            {
                            case "long":
                                dataRow[j] = br.ReadInt64();
                                break;

                            case "ulong":
                                dataRow[j] = br.ReadUInt64();
                                break;

                            case "int":
                                dataRow[j] = br.ReadInt32();
                                break;

                            case "uint":
                                dataRow[j] = br.ReadUInt32();
                                break;

                            case "short":
                                dataRow[j] = br.ReadInt16();
                                break;

                            case "ushort":
                                dataRow[j] = br.ReadUInt16();
                                break;

                            case "sbyte":
                                dataRow[j] = br.ReadSByte();
                                break;

                            case "byte":
                                dataRow[j] = br.ReadByte();
                                break;

                            case "float":
                                dataRow[j] = br.ReadSingle();
                                break;

                            case "double":
                                dataRow[j] = br.ReadDouble();
                                break;

                            case "string":
                                if (m_dbreader.HasInlineStrings)
                                {
                                    dataRow[j] = br.ReadStringNull();
                                }
                                else if (m_dbreader is STLReader)
                                {
                                    int offset = br.ReadInt32();
                                    dataRow[j] = (m_dbreader as STLReader).ReadString(offset);
                                }
                                else
                                {
                                    try
                                    {
                                        dataRow[j] = m_dbreader.StringTable[br.ReadInt32()];
                                    }
                                    catch
                                    {
                                        dataRow[j] = "Invalid string index!";
                                    }
                                }
                                break;

                            case "intarray":
                            {
                                int columns = br.ReadByte();
                                var sb      = new StringBuilder();
                                for (var c2 = 0; c2 < columns; ++c2)
                                {
                                    sb.Append(br.ReadUInt32()).Append(", ");
                                }

                                dataRow[j] = sb.ToString();
                                break;
                            }

                            case "int24":
                                dataRow[j] = br.ReadInt24();
                                break;

                            case "uint24":
                                dataRow[j] = br.ReadUInt24();
                                break;

                            default:
                                throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", type));
                            }
                        }
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / m_dbreader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            //if (extraData)
            //{
            //    MessageBox.Show("extra data detected!");
            //}

            if (dataGridView1.InvokeRequired)
            {
                SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource);
                Invoke(d, new object[] { m_dataTable.DefaultView });
            }
            else
            {
                SetDataSource(m_dataTable.DefaultView);
            }

            e.Result = file;
        }
コード例 #2
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            m_startTime = DateTime.Now;

            string file = (string)e.Argument;

            m_dbreader = DBReaderFactory.GetReader(file, m_definition);

            m_fields = new List <Field>(m_definition.Fields);

            string[] colNames = m_fields.Select(f => f.Name).ToArray();

            int[] arraySizes = m_fields.Select(f => f.ArraySize).ToArray();

            bool isDBCorDB2 = m_dbreader is DBCReader || m_dbreader is DB2Reader;

            m_dataTable        = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            TypeCode[] types = m_dataTable.Columns.Cast <DataColumn>().Select(c => Type.GetTypeCode(c.DataType)).ToArray();

            List <ColumnMeta> meta = null;

            if (m_dbreader is DB5Reader)
            {
                meta = (m_dbreader as DB5Reader).Meta;
            }

            if (m_dbreader is DB6Reader)
            {
                meta = (m_dbreader as DB6Reader).Meta;
            }

            Func <TypeCode, bool> isSmallType = (t) =>
            {
                if (t == TypeCode.SByte || t == TypeCode.Byte || t == TypeCode.Int16 || t == TypeCode.UInt16)
                {
                    return(true);
                }
                return(false);
            };

            foreach (var row in m_dbreader.Rows) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                using (BinaryReader br = row)
                {
                    int colIndex = 0;

                    for (int j = 0; j < m_fields.Count; j++)    // Add cells
                    {
                        for (int k = 0; k < arraySizes[j]; k++)
                        {
                            switch (types[colIndex])
                            {
                            case TypeCode.SByte:
                                dataRow.SetField(colIndex, br.ReadInt8(meta?[j]));
                                break;

                            case TypeCode.Byte:
                                dataRow.SetField(colIndex, br.ReadUInt8(meta?[j]));
                                break;

                            case TypeCode.Int16:
                                dataRow.SetField(colIndex, br.ReadInt16(meta?[j]));
                                break;

                            case TypeCode.UInt16:
                                dataRow.SetField(colIndex, br.ReadUInt16(meta?[j]));
                                break;

                            case TypeCode.Int32:
                                dataRow.SetField(colIndex, br.ReadInt32(meta?[j]));
                                break;

                            case TypeCode.UInt32:
                                dataRow.SetField(colIndex, br.ReadUInt32(meta?[j]));
                                break;

                            case TypeCode.Int64:
                                dataRow.SetField(colIndex, br.ReadInt64(meta?[j]));
                                break;

                            case TypeCode.UInt64:
                                dataRow.SetField(colIndex, br.ReadUInt64(meta?[j]));
                                break;

                            case TypeCode.Single:
                                dataRow.SetField(colIndex, br.ReadSingle(meta?[j]));
                                break;

                            case TypeCode.Double:
                                dataRow.SetField(colIndex, br.ReadDouble(meta?[j]));
                                break;

                            case TypeCode.String:
                                ReadStringField(colIndex, meta?[j], dataRow, br);
                                break;

                            default:
                                throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Unknown field type {0} for column {1}!", types[colIndex], colNames[j]));
                            }

                            // small fields are padded with zeros in old format versions if next field isn't small
                            long frem = br.BaseStream.Position % 4;
                            if (isDBCorDB2 && frem != 0 && isSmallType(types[colIndex]) && (colIndex + 1 < types.Length) && !isSmallType(types[colIndex + 1]))
                            {
                                br.BaseStream.Position += (4 - frem);
                            }

                            colIndex++;
                        }
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / m_dbreader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            e.Result = file;
        }
コード例 #3
0
ファイル: DBViewer.cs プロジェクト: lyragosa/aleph
        private XmlElement CreateDefaultDefinition()
        {
            if (reader is DB3Reader)
            {
                if (reader.RecordSize / reader.FieldsCount == 4)
                {
                    var doc = new XmlDocument();

                    XmlElement newnode = doc.CreateElement(DBCName);
                    newnode.SetAttributeNode("build", "").Value = reader.Build.ToString();

                    for (int i = 0; i < reader.FieldsCount; ++i)
                    {
                        XmlElement ele = doc.CreateElement("field");
                        ele.SetAttributeNode("type", "").Value = "int";
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}", i);
                        newnode.AppendChild(ele);
                    }

                    return(newnode);
                }
                else
                {
                    var doc = new XmlDocument();

                    XmlElement newnode = doc.CreateElement(DBCName);
                    newnode.SetAttributeNode("build", "").Value = reader.Build.ToString();

                    for (int i = 0; i < reader.FieldsCount; ++i)
                    {
                        /*if (i == 0)
                         * {
                         *  XmlElement index = doc.CreateElement("index");
                         *  XmlNode primary = index.AppendChild(doc.CreateElement("primary"));
                         *  primary.InnerText = "field0";
                         *  newnode.AppendChild(index);
                         * }*/

                        XmlElement ele = doc.CreateElement("field");
                        ele.SetAttributeNode("type", "").Value = "ushort";
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}", i);
                        newnode.AppendChild(ele);
                    }

                    return(newnode);
                }
            }
            else if (reader is DB5Reader)
            {
                DB5Reader db5reader = (DB5Reader)reader;

                var doc = new XmlDocument();

                XmlElement newnode = doc.CreateElement(DBCName);
                newnode.SetAttributeNode("build", "").Value = reader.Build.ToString();

                XmlElement tmpnode = doc.CreateElement(DBCName);

                List <fType> types = new List <fType>();


                for (int i = 0; i < db5reader.typeList.Count; i++)
                {
                    if (i < db5reader.typeList.Count - 1 && ((32 - db5reader.typeList[i][0]) / 8) != db5reader.typeList[i + 1][1] - db5reader.typeList[i][1])
                    {
                        int count = (db5reader.typeList[i + 1][1] - db5reader.typeList[i][1]) / ((32 - db5reader.typeList[i][0]) / 8);


                        fType ftype1;
                        ftype1.typeName = typeCov(((32 - db5reader.typeList[i][0]) / 8));
                        ftype1.isArray  = 1;

                        types.Add(ftype1);

                        for (int j = 0; j < count - 1; j++)
                        {
                            fType ftype;
                            ftype.typeName = typeCov(((32 - db5reader.typeList[i][0]) / 8));
                            ftype.isArray  = 2;

                            types.Add(ftype);
                        }
                    }
                    else
                    {
                        fType ftype;
                        ftype.typeName = typeCov(((32 - db5reader.typeList[i][0]) / 8));
                        ftype.isArray  = 0;
                        types.Add(ftype);
                    }
                }

                int ar = 0;

                int temp = 0;


                for (int i = 0; i < types.Count; i++)
                {
                    XmlElement ele = doc.CreateElement("field");



                    ele.SetAttributeNode("type", "").Value = types[i].typeName;

                    if (types[i].isArray == 1)
                    {
                        ar = 1;
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}_{1}", i, ar);
                        temp = i;
                    }
                    else if (types[i].isArray == 2)
                    {
                        ar++;
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}_{1}", temp, ar);
                    }
                    else
                    {
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}", i);
                        ar   = 0;
                        temp = i;
                    }

                    tmpnode.AppendChild(ele);
                    // i++;
                }

                try
                {
                    dbreader = DBReaderFactory.GetReader(DBCFile);
                }
                catch (Exception ex)
                {
                }

                DataTable dt = new DataTable();

                dt = CreateColumns(dt, tmpnode.ChildNodes);

                for (int i = 0; i < reader.RecordsCount; i++)
                {
                    DataRow dataRow = dt.NewRow();

                    using (BinaryReader br = dbreader[i])
                    {
                        for (int j = 0; j < types.Count; j++)
                        {
                            switch (types[j].typeName)
                            {
                            case "long":
                                dataRow[j] = br.ReadInt64();
                                break;

                            case "ulong":
                                dataRow[j] = br.ReadUInt64();
                                break;

                            case "int":
                                dataRow[j] = br.ReadInt32();
                                break;

                            case "uint":
                                dataRow[j] = br.ReadUInt32();
                                break;

                            case "short":
                                dataRow[j] = br.ReadInt16();
                                break;

                            case "ushort":
                                dataRow[j] = br.ReadUInt16();
                                break;

                            case "sbyte":
                                dataRow[j] = br.ReadSByte();
                                break;

                            case "byte":
                                dataRow[j] = br.ReadByte();
                                break;

                            case "float":
                                dataRow[j] = br.ReadSingle();
                                break;

                            case "double":
                                dataRow[j] = br.ReadDouble();
                                break;

                            case "index":
                                dataRow[j] = m_dbreader.index[i];
                                break;

                            case "int3":
                                byte[] bytes = br.ReadBytes(3);

                                byte[] buffer = new byte[4];

                                Buffer.BlockCopy(bytes, 0, buffer, 0, bytes.Length);

                                dataRow[j] = BitConverter.ToInt32(buffer, 0);

                                break;

                            case "string":
                                if (m_dbreader is WDBReader)
                                {
                                    dataRow[j] = br.ReadStringNull();
                                }
                                else if (m_dbreader is STLReader)
                                {
                                    int offset = br.ReadInt32();
                                    dataRow[j] = (m_dbreader as STLReader).ReadString(offset);
                                }
                                else
                                {
                                    try
                                    {
                                        dataRow[j] = m_dbreader.StringTable[br.ReadInt32()];
                                    }
                                    catch
                                    {
                                        dataRow[j] = "Invalid string index!";
                                    }
                                }
                                break;

                            case "nstring":
                                try
                                {
                                    dataRow[j] = br.ReadStringNull();
                                }
                                catch
                                {
                                    dataRow[j] = "Invalid string index!";
                                }
                                break;

                            case "cstring":
                                dataRow[j] = br.ReadStringNumber();
                                break;

                            default:
                                throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j]));
                            }
                        }
                    }
                    dt.Rows.Add(dataRow);
                }



                for (int i = 0; i < types.Count; i++)
                {
                    bool isString = true;

                    if (types[i].typeName.Equals("int"))
                    {
                        foreach (DataRow dr in dt.Rows)
                        {
                            if (!reader.StringTable.ContainsKey((int)dr[i]))
                            {
                                isString = false;
                                break;
                            }
                        }
                        if (isString)
                        {
                            fType ft;
                            ft.typeName = "string";
                            ft.isArray  = types[i].isArray;

                            types[i] = ft;
                        }
                    }
                }

                if (db5reader.index.Count > 0)
                {
                    XmlElement elei = doc.CreateElement("field");
                    elei.SetAttributeNode("type", "").Value = "index";
                    elei.SetAttributeNode("name", "").Value = String.Format("m_ID");
                    newnode.AppendChild(elei);
                }


                ar = 0;

                temp = 0;


                for (int i = 0; i < types.Count; i++)
                {
                    XmlElement ele = doc.CreateElement("field");



                    ele.SetAttributeNode("type", "").Value = types[i].typeName;

                    if (types[i].isArray == 1)
                    {
                        ar = 1;
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}_{1}", i, ar);
                        temp = i;
                    }
                    else if (types[i].isArray == 2)
                    {
                        ar++;
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}_{1}", temp, ar);
                    }
                    else
                    {
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}", i);
                        ar   = 0;
                        temp = i;
                    }

                    newnode.AppendChild(ele);
                    // i++;
                }


                return(newnode);
            }
            else
            {
                if (reader.RecordSize % reader.FieldsCount == 0) // only for files with 4 byte fields
                {
                    var doc = new XmlDocument();

                    XmlElement newnode = doc.CreateElement(DBCName);
                    newnode.SetAttributeNode("build", "").Value = reader.Build.ToString();

                    for (int i = 0; i < reader.FieldsCount; ++i)
                    {
                        XmlElement ele = doc.CreateElement("field");
                        ele.SetAttributeNode("type", "").Value = "int";
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}", i);
                        newnode.AppendChild(ele);
                    }

                    return(newnode);
                }
                else
                {
                    var doc = new XmlDocument();

                    XmlElement newnode = doc.CreateElement(DBCName);
                    newnode.SetAttributeNode("build", "").Value = reader.Build.ToString();

                    for (int i = 0; i < reader.FieldsCount; ++i)
                    {
                        XmlElement ele = doc.CreateElement("field");
                        ele.SetAttributeNode("type", "").Value = "ushort";
                        ele.SetAttributeNode("name", "").Value = String.Format("field{0}", i);
                        newnode.AppendChild(ele);
                    }

                    return(newnode);
                }
            }

            //return null;
        }
コード例 #4
0
ファイル: DBViewer.cs プロジェクト: lyragosa/aleph
        private void ReadDB(string file)
        {
            try
            {
                m_dbreader = DBReaderFactory.GetReader(file);
            }
            catch (Exception ex)
            {
                // e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];

            for (int j = 0; j < m_fields.Count; ++j)
            {
                types[j] = m_fields[j].Attributes["type"].Value;
            }

            // hack for *.adb files (because they don't have FieldsCount)
            bool notADB = !(m_dbreader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notWDB = !(m_dbreader is WDBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notSTL = !(m_dbreader is STLReader);

            bool notDB5 = !(m_dbreader is DB5Reader);

            int fcount = GetFieldsCount(m_fields);

            if (fcount != m_dbreader.FieldsCount && notADB && notWDB && notSTL && notDB5)
            {
                if (!types[0].Equals("index"))
                {
                    string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), fcount, m_dbreader.FieldsCount);

                    return;
                }
            }

            m_dataTable        = new PluginInterface.DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            //bool extraData = false;

            //   Console.WriteLine(m_dbreader.RecordsCount);

            for (int i = 0; i < m_dbreader.RecordsCount; ++i) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                //    Console.WriteLine(m_dbreader.RecordsCount);

                using (BinaryReader br = m_dbreader[i])
                {
                    //  Console.WriteLine(m_dbreader[i].BaseStream.Length);

                    for (int j = 0; j < m_fields.Count; ++j)    // Add cells
                    {
                        //  Console.WriteLine(m_fields.Count);

                        switch (types[j])
                        {
                        case "long":
                            dataRow[j] = br.ReadInt64();
                            break;

                        case "ulong":
                            dataRow[j] = br.ReadUInt64();
                            break;

                        case "int":
                            dataRow[j] = br.ReadInt32();
                            break;

                        case "uint":
                            dataRow[j] = br.ReadUInt32();
                            break;

                        case "short":
                            dataRow[j] = br.ReadInt16();
                            break;

                        case "ushort":
                            dataRow[j] = br.ReadUInt16();
                            break;

                        case "sbyte":
                            dataRow[j] = br.ReadSByte();
                            break;

                        case "byte":
                            dataRow[j] = br.ReadByte();
                            break;

                        case "float":
                            dataRow[j] = br.ReadSingle();
                            break;

                        case "double":
                            dataRow[j] = br.ReadDouble();
                            break;

                        case "index":
                            dataRow[j] = m_dbreader.index[i];
                            break;

                        case "int3":
                            byte[] bytes = br.ReadBytes(3);

                            byte[] buffer = new byte[4];

                            Buffer.BlockCopy(bytes, 0, buffer, 0, bytes.Length);

                            dataRow[j] = BitConverter.ToInt32(buffer, 0);

                            break;

                        case "string":
                            if (m_dbreader is WDBReader)
                            {
                                dataRow[j] = br.ReadStringNull();
                            }
                            else if (m_dbreader is STLReader)
                            {
                                int offset = br.ReadInt32();
                                dataRow[j] = (m_dbreader as STLReader).ReadString(offset);
                            }
                            else
                            {
                                try
                                {
                                    dataRow[j] = m_dbreader.StringTable[br.ReadInt32()];
                                }
                                catch
                                {
                                    dataRow[j] = "Invalid string index!";
                                }
                            }
                            break;

                        case "nstring":
                            try
                            {
                                dataRow[j] = br.ReadStringNull();
                            }
                            catch
                            {
                                dataRow[j] = "Invalid string index!";
                            }
                            break;

                        case "cstring":
                            dataRow[j] = br.ReadStringNumber();
                            break;

                        default:
                            throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j]));
                        }
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                //int percent = (int)((float)m_dataTable.Rows.Count / (float)m_dbreader.RecordsCount * 100.0f);
                //(sender as BackgroundWorker).ReportProgress(percent);
            }



            Export2SQL.Export2SQL tosql = new Export2SQL.Export2SQL();
            tosql.Run(m_dataTable);

            CloseFile();
        }
コード例 #5
0
ファイル: MainForm.cs プロジェクト: yyhhrr/dbcviewer
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string file = (string)e.Argument;

            try
            {
                m_reader = DBReaderFactory.GetReader(file);
            }
            catch (Exception ex)
            {
                ShowErrorMessageBox(ex.Message);
                e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];

            for (int j = 0; j < m_fields.Count; ++j)
            {
                types[j] = m_fields[j].Attributes["type"].Value;
            }

            // hack for *.adb files (because they don't have FieldsCount)
            bool notADB = !(m_reader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notWDB = !(m_reader is WDBReader);

            if (GetFieldsCount(m_fields) != m_reader.FieldsCount && notADB && notWDB)
            {
                string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_reader.FieldsCount);
                ShowErrorMessageBox(msg);
                e.Cancel = true;
                return;
            }

            m_dataTable        = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            for (int i = 0; i < m_reader.RecordsCount; ++i) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                BinaryReader br = m_reader[i];

                for (int j = 0; j < m_fields.Count; ++j)    // Add cells
                {
                    switch (types[j])
                    {
                    case "long":
                        dataRow[j] = br.ReadInt64();
                        break;

                    case "ulong":
                        dataRow[j] = br.ReadUInt64();
                        break;

                    case "int":
                        dataRow[j] = br.ReadInt32();
                        break;

                    case "uint":
                        dataRow[j] = br.ReadUInt32();
                        break;

                    case "short":
                        dataRow[j] = br.ReadInt16();
                        break;

                    case "ushort":
                        dataRow[j] = br.ReadUInt16();
                        break;

                    case "sbyte":
                        dataRow[j] = br.ReadSByte();
                        break;

                    case "byte":
                        dataRow[j] = br.ReadByte();
                        break;

                    case "float":
                        dataRow[j] = br.ReadSingle();
                        break;

                    case "double":
                        dataRow[j] = br.ReadDouble();
                        break;

                    case "string":
                        dataRow[j] = m_reader is WDBReader?br.ReadStringNull() : m_reader.StringTable[br.ReadInt32()];

                        break;

                    default:
                        throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j]));
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / (float)m_reader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            if (dataGridView1.InvokeRequired)
            {
                SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource);
                Invoke(d, new object[] { m_dataTable.DefaultView });
            }
            else
            {
                SetDataSource(m_dataTable.DefaultView);
            }

            e.Result = file;
        }