public InvalidDBColumnMappingException(string description, DBColumnMapping mapping, LeafPropertyNode node) : base() { this.m_description = description; this.m_mapping = mapping; this.m_node = node; }
/// <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); }