public InvalidDBColumnMappingException(string description, DBColumnMapping mapping, LeafPropertyNode node) : base()
 {
     this.m_description = description;
     this.m_mapping     = mapping;
     this.m_node        = node;
 }
Beispiel #2
0
        /// <summary>
        ///     说明:此方法用于利用数据库表的列字段的:位置或名称,将DbColumnMapping补全。
        ///     如果输入的propertyInfo.PropertyType不是“原子类型”或“String”,显然在数据库中不会有匹配的列;所以直接返回
        /// </summary>
        /// <param name="propertyInfo"></param>
        /// <param name="mapping"></param>
        private void PopulateDbColumnMapping(LeafPropertyNode leaf, DBColumnMapping mapping)
        {
            DataTable schemaTable = this.SchemaTable;

            if (mapping.IsDestColumnNameOk() && mapping.IsDestColumnOffsetOk())
            {
                DataColumn col = schemaTable.Columns[mapping.DestColumnOffset];

                if (col == null)
                {
                    if (mapping.Option == ColumnMappingOption.Optional)
                    {
                        m_classLogger.DebugFormat("Optional column mapping ignored for table {0}: {1}", m_destinationTablename, mapping);
                        mapping.DestColumnOffset = -1;
                        return;
                    }
                    else
                    {
                        var desc = string.Format(
                            "can not find column with offset {0} in table {1} ",
                            mapping.DestColumnOffset,
                            m_destinationTablename);

                        throw new InvalidDBColumnMappingException(desc, mapping, leaf);
                    }
                }

                if (col.ColumnName != mapping.DestColumnName)
                {
                    var desc = string.Format(
                        "Column name from db {0} is inconsistent with that in db mapping {1} ",
                        col.ColumnName,
                        mapping);

                    throw new InvalidDBColumnMappingException(desc, mapping, leaf);
                }

                return;
            }

            //说明当前的mapping的列名称出错(null),而位置参数正确。则读取数据库表获得要相应的列名称
            if (!mapping.IsDestColumnNameOk() && mapping.IsDestColumnOffsetOk())
            {
                DataColumn col = schemaTable.Columns[mapping.DestColumnOffset];
                if (col == null)
                {
                    if (mapping.Option == ColumnMappingOption.Optional)
                    {
                        m_classLogger.DebugFormat("Optional column mapping ignored for table {0}: {1}", m_destinationTablename, mapping);
                        mapping.DestColumnOffset = -1;
                        return;
                    }
                    else
                    {
                        var desc = string.Format(
                            "can not find column with offset {0} in table {1} ",
                            mapping.DestColumnOffset,
                            m_destinationTablename);

                        throw new InvalidDBColumnMappingException(desc, mapping, leaf);
                    }
                }

                mapping.DestColumnName = col.ColumnName;
                this.m_classLogger.DebugFormat("Populated column name for DBColumnMapping: {0} on property node: {1} by table {2}",
                                               mapping,
                                               leaf,
                                               m_destinationTablename);
                return;
            }

            //说明当前的mapping的列名称存在,而位置参数出错(-1)。则读取数据库表获得相应的列位置参数
            if (mapping.IsDestColumnNameOk() && !mapping.IsDestColumnOffsetOk())
            {
                DataColumn col = schemaTable.Columns[mapping.DestColumnName];
                if (col == null)
                {
                    if (mapping.Option == ColumnMappingOption.Optional)
                    {
                        m_classLogger.DebugFormat(
                            "Optional column mapping ignored for table {0}: {1}",
                            m_destinationTablename,
                            mapping);
                        mapping.DestColumnOffset = -1;
                        return;
                    }
                    else
                    {
                        var desc = string.Format(
                            "can not find column with name {0} in table {1} ",
                            mapping.DestColumnName,
                            m_destinationTablename);

                        throw new InvalidDBColumnMappingException(desc, mapping, leaf);
                    }
                }

                mapping.DestColumnOffset = col.Ordinal;
                this.m_classLogger.DebugFormat("Populated column offset for DBColumnMapping: {0} on property node: {1} by table {2}",
                                               mapping,
                                               leaf,
                                               m_destinationTablename);
                return;
            }

            //说明当前的mapping列名称不存在,位置参数也不存在,因此,根据PropertyInfo.Name读取数据库
            DataColumn guessColumn = schemaTable.Columns[leaf.PropertyInfo.Name];

            if (guessColumn == null)
            {
                if (mapping.Option == ColumnMappingOption.Optional)
                {
                    m_classLogger.DebugFormat("Optional column mapping ignored for table {0}: {1}", m_destinationTablename, mapping);
                    mapping.DestColumnOffset = -1;
                    return;
                }
                else
                {
                    var desc = string.Format(
                        "can not find column with property name {0} in table {1} ",
                        leaf.PropertyInfo.Name,
                        m_destinationTablename);

                    throw new InvalidDBColumnMappingException(desc, mapping, leaf);
                }
            }
            mapping.DestColumnOffset = guessColumn.Ordinal;
            mapping.DestColumnName   = guessColumn.ColumnName;

            this.m_classLogger.DebugFormat("Populated column name and offset for DBColumnMapping: {0} on property node: {1} by table {2}",
                                           mapping,
                                           leaf,
                                           m_destinationTablename);
        }