/// <summary>
        /// Checks the field properties for a given field in an Epi 3.5.x view.
        /// </summary>
        /// <param name="view">The Epi Info 3.5.x view to check.</param>
        /// <param name="fieldRow">The row of field data that represents this field.</param>
        private void CheckFieldProperties(Epi.Epi2000.View view, DataRow fieldRow)
        {
            #region Input Validation
            if (view == null)
            {
                throw new ArgumentNullException("view");
            }
            if (fieldRow == null)
            {
                throw new ArgumentNullException("fieldRow");
            }
            #endregion // Input Validation

            string fieldName = fieldRow["Name"].ToString();

            MetaFieldType fieldType = Epi.Epi2000.MetadataDbProvider.InferFieldType(fieldRow);

            if (!(fieldType == MetaFieldType.CommandButton ||
                  fieldType == MetaFieldType.Grid ||
                  fieldType == MetaFieldType.Group ||
                  fieldType == MetaFieldType.LabelTitle ||
                  fieldType == MetaFieldType.Mirror ||
                  fieldType == MetaFieldType.Relate) && fieldRow["Lists"] != DBNull.Value)
            {
                string lists = fieldRow["Lists"].ToString().Trim();
                if (fieldType == MetaFieldType.Codes || fieldType == MetaFieldType.LegalValues || fieldType == MetaFieldType.CommentLegal)
                {
                    if (lists.Contains("[") || lists.Contains("]"))
                    {
                        errorList.Add(ImportExportMessageType.Error, "3010", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3010, fieldName, view.Name));
                    }
                    else if (!lists.Contains("(") || !lists.Contains(")"))
                    {
                        errorList.Add(ImportExportMessageType.Error, "3011", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3011, fieldName, view.Name));
                    }
                    else
                    {
                        int    parenIndex = lists.IndexOf('(');
                        string properties = lists.Substring(0, parenIndex);
                        if (properties.Contains("N") && properties.Contains("M"))
                        {
                            errorList.Add(ImportExportMessageType.Error, "3012", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3012, fieldName, view.Name));
                        }
                    }
                }
            }

            if (fieldType == MetaFieldType.Relate)
            {
                if (fieldRow["FormatString"] != DBNull.Value && !string.IsNullOrEmpty(fieldRow["FormatString"].ToString().Trim()))
                {
                    errorList.Add(ImportExportMessageType.Notification, "6000", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_N6000, fieldName, view.Name));
                }
            }
        }
        /// <summary>
        /// Checks a given Epi Info 3.5.x view for source reference problems.
        /// </summary>
        /// <param name="view">The Epi Info 3.5.x view to check.</param>
        private void CheckViewSourceReferences(Epi.Epi2000.View view)
        {
            #region Input Validation
            if (view == null)
            {
                throw new ArgumentNullException("view");
            }
            #endregion // Input Validation

            Epi.Data.IDbDriver db            = sourceProject.CollectedData.GetDatabase();
            DataTable          viewMetaTable = db.Select(db.CreateQuery("SELECT [Name], [Type], [Datatable] FROM [" + view.Name + "] WHERE [Type] = 'SOURCE' AND [Name] LIKE 'CODE%'"));

            foreach (DataRow row in viewMetaTable.Rows)
            {
                string dataTableName = row["Datatable"].ToString();
                string sourceName    = row["Name"].ToString();

                DataTable viewMetaTable1 = db.Select(db.CreateQuery("SELECT [Name], [Lists] FROM [" + view.Name + "] WHERE [Lists] LIKE '%" + sourceName + ",%'"));
                if (viewMetaTable1.Rows.Count == 0)
                {
                    // There are a lot of these, and they have no effect on the upgrade process, so skip them... they're pointless to show to the user.
                    //problems.Add(new KeyValuePair<ProjectUpgradeProblemType, string>(ProjectUpgradeProblemType.Notification, "View " + view.Name + " contains a SOURCE reference called " + sourceName + " that does not have a corresponding field."));
                }
                else
                {
                    if (string.IsNullOrEmpty(dataTableName))
                    {
                        errorList.Add(ImportExportMessageType.Error, "1023", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1023, view.Name, sourceName));
                    }
                    else if (!db.TableExists(dataTableName))
                    {
                        errorList.Add(ImportExportMessageType.Error, "1024", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1024, view.Name, sourceName, dataTableName, dataTableName));
                    }
                }
            }
        }
        /// <summary>
        /// Checks all the fields in a given Epi Info 3.5.x view for generic problems.
        /// </summary>
        /// <param name="view">The Epi Info 3.5.x view</param>
        /// <param name="db">The data driver associated with the view's project</param>
        private void CheckAllFields(Epi.Epi2000.View view, Epi.Data.IDbDriver db)
        {
            #region Input Validation
            if (view == null)
            {
                throw new ArgumentNullException("view");
            }
            if (db == null)
            {
                throw new ArgumentNullException("db");
            }
            #endregion // Input Validation

            List <DataTable> wideTables = new List <DataTable>();

            bool hasTables = false;

            foreach (string wideTableName in view.TableNames)
            {
                if (!string.IsNullOrEmpty(wideTableName) && db.TableExists(wideTableName))
                {
                    DataTable wTable = db.GetTopTwoTable(wideTableName);
                    wTable.TableName = wideTableName;
                    wideTables.Add(wTable);
                    hasTables = true;
                }
            }

            DataTable allFieldsTable = sourceProject.Metadata.GetFieldsAsDataTable(view.Name);
            foreach (DataRow fRow in allFieldsTable.Rows)
            {
                string fieldName = fRow["Name"].ToString();

                CheckFieldProperties(view, fRow);

                MetaFieldType fieldType = Epi.Epi2000.MetadataDbProvider.InferFieldType(fRow);
                if (fieldType == MetaFieldType.CommandButton ||
                    fieldType == MetaFieldType.Grid ||
                    fieldType == MetaFieldType.Group ||
                    fieldType == MetaFieldType.LabelTitle ||
                    fieldType == MetaFieldType.Mirror ||
                    fieldType == MetaFieldType.Relate)
                {
                    continue;
                }

                if (!hasTables)
                {
                    continue;
                }

                string columnDataType = string.Empty;
                string wideTableName  = string.Empty;

                foreach (DataTable wideTable in wideTables)
                {
                    if (wideTable.Columns.Contains(fieldName))
                    {
                        columnDataType = wideTable.Columns[fieldName].DataType.ToString();
                        wideTableName  = wideTable.TableName;
                        break;
                    }
                }

                if (string.IsNullOrEmpty(columnDataType))
                {
                    if (fieldType != MetaFieldType.CommandButton && fieldType != MetaFieldType.Grid && fieldType != MetaFieldType.Group && fieldType != MetaFieldType.LabelTitle && fieldType != MetaFieldType.Mirror && fieldType != MetaFieldType.Relate)
                    {
                        errorList.Add(ImportExportMessageType.Error, "3002", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3002, fieldName, view.Name));
                    }
                }
                else
                {
                    switch (fieldType)
                    {
                    case MetaFieldType.Checkbox:
                        if (!columnDataType.Equals("System.Boolean"))
                        {
                            errorList.Add(ImportExportMessageType.Error, "3005", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3005, fieldName, view.Name, columnDataType));
                        }
                        break;

                    case MetaFieldType.YesNo:
                        if (!(columnDataType.Equals("System.Byte") || columnDataType.Equals("System.Byte")))
                        {
                            errorList.Add(ImportExportMessageType.Error, "3006", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3006, fieldName, view.Name, columnDataType));
                        }
                        break;

                    case MetaFieldType.Codes:
                    case MetaFieldType.CommentLegal:
                    case MetaFieldType.LegalValues:
                    case MetaFieldType.Text:
                    case MetaFieldType.TextUppercase:
                        if (!columnDataType.Equals("System.String"))
                        {
                            errorList.Add(ImportExportMessageType.Error, "3007", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3007, fieldName, view.Name, columnDataType));
                        }
                        break;

                    case MetaFieldType.Number:
                        if (!columnDataType.Equals("System.Single") && !columnDataType.Equals("System.Double"))
                        {
                            errorList.Add(ImportExportMessageType.Error, "3008", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3008, fieldName, view.Name, columnDataType));
                        }
                        break;

                    case MetaFieldType.Date:
                    case MetaFieldType.DateTime:
                    case MetaFieldType.Time:
                        if (!columnDataType.Equals("System.DateTime"))
                        {
                            errorList.Add(ImportExportMessageType.Error, "3009", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E3009, fieldName, view.Name, columnDataType));
                        }
                        break;
                    }
                }
            }
        }
        /// <summary>
        /// Checks the columns in the view table for problems.
        /// </summary>
        /// <param name="view">The Epi Info 3.5.x view to check</param>
        private void CheckViewColumns(Epi.Epi2000.View view)
        {
            #region Input Validation
            if (view == null)
            {
                throw new ArgumentNullException("view");
            }
            #endregion // Input Validation

            Epi.Data.IDbDriver db            = sourceProject.CollectedData.GetDatabase();
            DataTable          viewMetaTable = db.Select(db.CreateQuery("SELECT * FROM [" + view.Name + "]"));

            if (!viewMetaTable.Columns.Contains("PageNumber"))
            {
                errorList.Add(ImportExportMessageType.Error, "1030", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1030, view.Name));
            }
            else if (!(viewMetaTable.Columns["PageNumber"].DataType.ToString().Equals("System.Byte") || viewMetaTable.Columns["PageNumber"].DataType.ToString().Equals("System.Int16") || viewMetaTable.Columns["PageNumber"].DataType.ToString().Equals("System.Int32")))
            {
                errorList.Add(ImportExportMessageType.Error, "1031", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1031, view.Name, viewMetaTable.Columns["PageNumber"].DataType.ToString()));
            }

            if (!viewMetaTable.Columns.Contains("Name"))
            {
                errorList.Add(ImportExportMessageType.Error, "1032", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1032, view.Name));
            }
            else if (!viewMetaTable.Columns["Name"].DataType.ToString().Equals("System.String"))
            {
                errorList.Add(ImportExportMessageType.Error, "1033", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1033, view.Name, viewMetaTable.Columns["Name"].DataType.ToString()));
            }

            if (!viewMetaTable.Columns.Contains("Prompt"))
            {
                errorList.Add(ImportExportMessageType.Error, "1034", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1034, view.Name));
            }
            else if (!viewMetaTable.Columns["Prompt"].DataType.ToString().Equals("System.String"))
            {
                errorList.Add(ImportExportMessageType.Error, "1035", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1035, view.Name, viewMetaTable.Columns["Prompt"].DataType.ToString()));
            }

            if (!viewMetaTable.Columns.Contains("Type"))
            {
                errorList.Add(ImportExportMessageType.Error, "1036", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1036, view.Name));
            }
            else if (!viewMetaTable.Columns["Type"].DataType.ToString().Equals("System.String"))
            {
                errorList.Add(ImportExportMessageType.Error, "1037", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1037, view.Name, viewMetaTable.Columns["Type"].DataType.ToString()));
            }

            if (!viewMetaTable.Columns.Contains("Database"))
            {
                errorList.Add(ImportExportMessageType.Error, "1070", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1070, view.Name));
            }
            else if (!viewMetaTable.Columns["Database"].DataType.ToString().Equals("System.String"))
            {
                errorList.Add(ImportExportMessageType.Error, "1071", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1071, view.Name, viewMetaTable.Columns["Database"].DataType.ToString()));
            }

            if (!viewMetaTable.Columns.Contains("Datafield"))
            {
                errorList.Add(ImportExportMessageType.Error, "1072", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1072, view.Name));
            }
            else if (!viewMetaTable.Columns["Datafield"].DataType.ToString().Equals("System.String"))
            {
                errorList.Add(ImportExportMessageType.Error, "1073", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1073, view.Name, viewMetaTable.Columns["Datafield"].DataType.ToString()));
            }

            if (!viewMetaTable.Columns.Contains("Datatable"))
            {
                errorList.Add(ImportExportMessageType.Error, "1074", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1074, view.Name));
            }
            else if (!viewMetaTable.Columns["Datatable"].DataType.ToString().Equals("System.String"))
            {
                errorList.Add(ImportExportMessageType.Error, "1075", string.Format(ImportExportSharedStrings.UPGRADE_PROBLEM_CHECK_ERROR_E1075, view.Name, viewMetaTable.Columns["Datatable"].DataType.ToString()));
            }
        }