1 //------------------------------------------------------------------------------
2 // <copyright file="DataColumnMapping.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
9 namespace System.Data.Common {
12 using System.ComponentModel;
13 using System.ComponentModel.Design.Serialization;
15 using System.Diagnostics;
16 using System.Globalization;
17 using System.Reflection;
20 System.ComponentModel.TypeConverterAttribute(typeof(System.Data.Common.DataColumnMapping.DataColumnMappingConverter))
22 public sealed class DataColumnMapping : MarshalByRefObject, IColumnMapping, ICloneable {
23 private DataColumnMappingCollection parent;
24 private string _dataSetColumnName;
25 private string _sourceColumnName;
27 public DataColumnMapping() {
30 public DataColumnMapping(string sourceColumn, string dataSetColumn) {
31 SourceColumn = sourceColumn;
32 DataSetColumn = dataSetColumn;
37 ResCategoryAttribute(Res.DataCategory_Mapping),
38 ResDescriptionAttribute(Res.DataColumnMapping_DataSetColumn),
40 public string DataSetColumn {
42 string dataSetColumnName = _dataSetColumnName;
43 return ((null != dataSetColumnName) ? dataSetColumnName : ADP.StrEmpty);
46 _dataSetColumnName = value;
50 internal DataColumnMappingCollection Parent {
61 ResCategoryAttribute(Res.DataCategory_Mapping),
62 ResDescriptionAttribute(Res.DataColumnMapping_SourceColumn),
64 public string SourceColumn {
66 string sourceColumnName = _sourceColumnName;
67 return ((null != sourceColumnName) ? sourceColumnName : ADP.StrEmpty);
70 if ((null != Parent) && (0 != ADP.SrcCompare(_sourceColumnName, value))) {
71 Parent.ValidateSourceColumn(-1, value);
73 _sourceColumnName = value;
77 object ICloneable.Clone() {
78 DataColumnMapping clone = new DataColumnMapping(); // MDAC 81448
79 clone._sourceColumnName = _sourceColumnName;
80 clone._dataSetColumnName = _dataSetColumnName;
84 [ EditorBrowsableAttribute(EditorBrowsableState.Advanced) ] // MDAC 69508
85 public DataColumn GetDataColumnBySchemaAction(DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) {
86 return GetDataColumnBySchemaAction(SourceColumn, DataSetColumn, dataTable, dataType, schemaAction);
89 [ EditorBrowsableAttribute(EditorBrowsableState.Advanced) ] // MDAC 69508
90 static public DataColumn GetDataColumnBySchemaAction(string sourceColumn, string dataSetColumn, DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) {
91 if (null == dataTable) {
92 throw ADP.ArgumentNull("dataTable");
94 if (ADP.IsEmpty(dataSetColumn)) {
96 if (AdapterSwitches.DataSchema.TraceWarning) {
97 Debug.WriteLine("explicit filtering of SourceColumn \"" + sourceColumn + "\"");
102 DataColumnCollection columns = dataTable.Columns;
103 Debug.Assert(null != columns, "GetDataColumnBySchemaAction: unexpected null DataColumnCollection");
105 int index = columns.IndexOf(dataSetColumn);
106 if ((0 <= index) && (index < columns.Count)) {
107 DataColumn dataColumn = columns[index];
108 Debug.Assert(null != dataColumn, "GetDataColumnBySchemaAction: unexpected null dataColumn");
110 if (!ADP.IsEmpty(dataColumn.Expression)) {
112 if (AdapterSwitches.DataSchema.TraceError) {
113 Debug.WriteLine("schema mismatch on DataColumn \"" + dataSetColumn + "\" which is a computed column");
116 throw ADP.ColumnSchemaExpression(sourceColumn, dataSetColumn);
118 if ((null == dataType) || (dataType.IsArray == dataColumn.DataType.IsArray)) {
120 if (AdapterSwitches.DataSchema.TraceInfo) {
121 Debug.WriteLine("schema match on DataColumn \"" + dataSetColumn + "\"");
127 if (AdapterSwitches.DataSchema.TraceWarning) {
128 Debug.WriteLine("schema mismatch on DataColumn \"" + dataSetColumn + "\" " + dataType.Name + " != " + dataColumn.DataType.Name);
131 throw ADP.ColumnSchemaMismatch(sourceColumn, dataType, dataColumn);
134 return CreateDataColumnBySchemaAction(sourceColumn, dataSetColumn, dataTable, dataType, schemaAction);
137 static internal DataColumn CreateDataColumnBySchemaAction(string sourceColumn, string dataSetColumn, DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) {
138 Debug.Assert(dataTable != null, "Should not call with a null DataTable");
139 if (ADP.IsEmpty(dataSetColumn)) {
143 switch (schemaAction) {
144 case MissingSchemaAction.Add:
145 case MissingSchemaAction.AddWithKey:
147 if (AdapterSwitches.DataSchema.TraceInfo) {
148 Debug.WriteLine("schema add of DataColumn \"" + dataSetColumn + "\" <" + Convert.ToString(dataType, CultureInfo.InvariantCulture) +">");
151 return new DataColumn(dataSetColumn, dataType);
153 case MissingSchemaAction.Ignore:
155 if (AdapterSwitches.DataSchema.TraceWarning) {
156 Debug.WriteLine("schema filter of DataColumn \"" + dataSetColumn + "\" <" + Convert.ToString(dataType, CultureInfo.InvariantCulture) +">");
161 case MissingSchemaAction.Error:
163 if (AdapterSwitches.DataSchema.TraceError) {
164 Debug.WriteLine("schema error on DataColumn \"" + dataSetColumn + "\" <" + Convert.ToString(dataType, CultureInfo.InvariantCulture) +">");
167 throw ADP.ColumnSchemaMissing(dataSetColumn, dataTable.TableName, sourceColumn);
169 throw ADP.InvalidMissingSchemaAction(schemaAction);
172 public override String ToString() {
176 sealed internal class DataColumnMappingConverter : System.ComponentModel.ExpandableObjectConverter {
178 // converter classes should have public ctor
179 public DataColumnMappingConverter() {
182 override public bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
183 if (typeof(InstanceDescriptor) == destinationType) {
186 return base.CanConvertTo(context, destinationType);
189 override public object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
190 if (null == destinationType) {
191 throw ADP.ArgumentNull("destinationType");
194 if ((typeof(InstanceDescriptor) == destinationType) && (value is DataColumnMapping)) {
195 DataColumnMapping mapping = (DataColumnMapping)value;
197 object[] values = new object[] { mapping.SourceColumn, mapping.DataSetColumn };
198 Type[] types = new Type[] { typeof(string), typeof(string) };
200 ConstructorInfo ctor = typeof(DataColumnMapping).GetConstructor(types);
201 return new InstanceDescriptor(ctor, values);
203 return base.ConvertTo(context, culture, value, destinationType);