////////////////////////////////////////////////////////////////////////////
        //--------------------------------- REVISIONS ------------------------------
        // Date       Name                 Tracking #         Description
        // ---------  -------------------  -------------      ----------------------
        // 21JUN2009  James Shen                              Initial Creation
        ////////////////////////////////////////////////////////////////////////////

        /**
         * Get one record (index) of give mapInfo ID.
         */
        public DataRowValue GetRecord(int mapInfoID)
        {
            int recordID = mapInfoID - 1;

            if (mapInfoID < 1)
            {
                throw new IOException("MapInfo ID starts from 1");
            }
            DataReader.Seek(_reader, _offset + recordID * _recordSize);
            string[] fieldValues = new string[_fields.Length];

            int    intValue;
            int    shortValue;
            int    stringID;
            byte   boolValue;
            double doubleValue;

            for (int i = 0; i < fieldValues.Length; i++)
            {
                switch (_fields[i].GetFieldType())
                {
                case DataField.TYPE_CHAR:    //char
                case DataField.TYPE_DATE:    //date
                    stringID       = DataReader.ReadInt(_reader);
                    fieldValues[i] = stringID.ToString();
                    break;

                case DataField.TYPE_INTEGER:    //int
                    intValue       = DataReader.ReadInt(_reader);
                    fieldValues[i] = intValue.ToString();
                    break;

                case DataField.TYPE_SMALLINT:    //short
                    shortValue     = DataReader.ReadShort(_reader);
                    fieldValues[i] = shortValue.ToString();
                    break;

                case DataField.TYPE_DECIMAL:  //short
                case DataField.TYPE_FLOAT:    //float
                    doubleValue    = DataReader.ReadDouble(_reader);
                    fieldValues[i] = doubleValue.ToString();
                    break;

                case DataField.TYPE_LOGICAL:    //bool
                    boolValue      = _reader.ReadByte();
                    fieldValues[i] = boolValue.ToString();
                    break;
                }
            }

            //read string data.
            for (int i = 0; i < fieldValues.Length; i++)
            {
                switch (_fields[i].GetFieldType())
                {
                case DataField.TYPE_CHAR:    //char
                case DataField.TYPE_DATE:    //date
                    stringID = int.Parse(fieldValues[i]);
                    if (stringID != -1)
                    {
                        _stringIndex.GetRecord(stringID);
                        fieldValues[i] = _stringData.GetRecord(_stringIndex.RecordOffset);
                    }
                    else
                    {
                        fieldValues[i] = "";
                    }
                    break;
                }
            }
            var ret = new DataRowValue(fieldValues);

            return(ret);
        }
        ////////////////////////////////////////////////////////////////////////////
        //--------------------------------- REVISIONS ------------------------------
        // Date       Name                 Tracking #         Description
        // ---------  -------------------  -------------      ----------------------
        // 21JUN2009  James Shen                 	          Initial Creation
        ////////////////////////////////////////////////////////////////////////////
        /**
         * Get one record (index) of give mapInfo ID.
         */
        public DataRowValue GetRecord(int mapInfoID)
        {
            int recordID = mapInfoID - 1;
            if (mapInfoID < 1)
            {
                throw new IOException("MapInfo ID starts from 1");
            }
            DataReader.Seek(_reader, _offset + recordID * _recordSize);
            string[] fieldValues = new string[_fields.Length];

            int intValue;
            int shortValue;
            int stringID;
            byte boolValue;
            double doubleValue;
            for (int i = 0; i < fieldValues.Length; i++)
            {
                switch (_fields[i].GetFieldType())
                {
                    case DataField.TYPE_CHAR://char
                    case DataField.TYPE_DATE://date
                        stringID = DataReader.ReadInt(_reader);
                        fieldValues[i] = stringID.ToString();
                        break;
                    case DataField.TYPE_INTEGER://int
                        intValue = DataReader.ReadInt(_reader);
                        fieldValues[i] = intValue.ToString();
                        break;
                    case DataField.TYPE_SMALLINT://short
                        shortValue = DataReader.ReadShort(_reader);
                        fieldValues[i] = shortValue.ToString();
                        break;
                    case DataField.TYPE_DECIMAL://short
                    case DataField.TYPE_FLOAT://float
                        doubleValue = DataReader.ReadDouble(_reader);
                        fieldValues[i] = doubleValue.ToString();
                        break;
                    case DataField.TYPE_LOGICAL://bool
                        boolValue = _reader.ReadByte();
                        fieldValues[i] = boolValue.ToString();
                        break;
                }
            }

            //read string data.
            for (int i = 0; i < fieldValues.Length; i++)
            {
                switch (_fields[i].GetFieldType())
                {
                    case DataField.TYPE_CHAR://char
                    case DataField.TYPE_DATE://date
                        stringID = int.Parse(fieldValues[i]);
                        if (stringID != -1)
                        {
                            _stringIndex.GetRecord(stringID);
                            fieldValues[i] = _stringData.GetRecord(_stringIndex.RecordOffset);
                        }
                        else
                        {
                            fieldValues[i] = "";
                        }
                        break;
                }
            }
            var ret = new DataRowValue(fieldValues);
            return ret;
        }