DataColumnMapping.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. //------------------------------------------------------------------------------
  2. // <copyright file="DataColumnMapping.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. // <owner current="true" primary="true">Microsoft</owner>
  6. // <owner current="true" primary="false">Microsoft</owner>
  7. //------------------------------------------------------------------------------
  8. namespace System.Data.Common {
  9. using System;
  10. using System.ComponentModel;
  11. using System.ComponentModel.Design.Serialization;
  12. using System.Data;
  13. using System.Diagnostics;
  14. using System.Globalization;
  15. using System.Reflection;
  16. [
  17. System.ComponentModel.TypeConverterAttribute(typeof(System.Data.Common.DataColumnMapping.DataColumnMappingConverter))
  18. ]
  19. public sealed class DataColumnMapping : MarshalByRefObject, IColumnMapping, ICloneable {
  20. private DataColumnMappingCollection parent;
  21. private string _dataSetColumnName;
  22. private string _sourceColumnName;
  23. public DataColumnMapping() {
  24. }
  25. public DataColumnMapping(string sourceColumn, string dataSetColumn) {
  26. SourceColumn = sourceColumn;
  27. DataSetColumn = dataSetColumn;
  28. }
  29. [
  30. DefaultValue(""),
  31. ResCategoryAttribute(Res.DataCategory_Mapping),
  32. ResDescriptionAttribute(Res.DataColumnMapping_DataSetColumn),
  33. ]
  34. public string DataSetColumn {
  35. get {
  36. string dataSetColumnName = _dataSetColumnName;
  37. return ((null != dataSetColumnName) ? dataSetColumnName : ADP.StrEmpty);
  38. }
  39. set {
  40. _dataSetColumnName = value;
  41. }
  42. }
  43. internal DataColumnMappingCollection Parent {
  44. get {
  45. return parent;
  46. }
  47. set {
  48. parent = value;
  49. }
  50. }
  51. [
  52. DefaultValue(""),
  53. ResCategoryAttribute(Res.DataCategory_Mapping),
  54. ResDescriptionAttribute(Res.DataColumnMapping_SourceColumn),
  55. ]
  56. public string SourceColumn {
  57. get {
  58. string sourceColumnName = _sourceColumnName;
  59. return ((null != sourceColumnName) ? sourceColumnName : ADP.StrEmpty);
  60. }
  61. set {
  62. if ((null != Parent) && (0 != ADP.SrcCompare(_sourceColumnName, value))) {
  63. Parent.ValidateSourceColumn(-1, value);
  64. }
  65. _sourceColumnName = value;
  66. }
  67. }
  68. object ICloneable.Clone() {
  69. DataColumnMapping clone = new DataColumnMapping(); // MDAC 81448
  70. clone._sourceColumnName = _sourceColumnName;
  71. clone._dataSetColumnName = _dataSetColumnName;
  72. return clone;
  73. }
  74. [ EditorBrowsableAttribute(EditorBrowsableState.Advanced) ] // MDAC 69508
  75. public DataColumn GetDataColumnBySchemaAction(DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) {
  76. return GetDataColumnBySchemaAction(SourceColumn, DataSetColumn, dataTable, dataType, schemaAction);
  77. }
  78. [ EditorBrowsableAttribute(EditorBrowsableState.Advanced) ] // MDAC 69508
  79. static public DataColumn GetDataColumnBySchemaAction(string sourceColumn, string dataSetColumn, DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) {
  80. if (null == dataTable) {
  81. throw ADP.ArgumentNull("dataTable");
  82. }
  83. if (ADP.IsEmpty(dataSetColumn)) {
  84. #if DEBUG
  85. if (AdapterSwitches.DataSchema.TraceWarning) {
  86. Debug.WriteLine("explicit filtering of SourceColumn \"" + sourceColumn + "\"");
  87. }
  88. #endif
  89. return null;
  90. }
  91. DataColumnCollection columns = dataTable.Columns;
  92. Debug.Assert(null != columns, "GetDataColumnBySchemaAction: unexpected null DataColumnCollection");
  93. int index = columns.IndexOf(dataSetColumn);
  94. if ((0 <= index) && (index < columns.Count)) {
  95. DataColumn dataColumn = columns[index];
  96. Debug.Assert(null != dataColumn, "GetDataColumnBySchemaAction: unexpected null dataColumn");
  97. if (!ADP.IsEmpty(dataColumn.Expression)) {
  98. #if DEBUG
  99. if (AdapterSwitches.DataSchema.TraceError) {
  100. Debug.WriteLine("schema mismatch on DataColumn \"" + dataSetColumn + "\" which is a computed column");
  101. }
  102. #endif
  103. throw ADP.ColumnSchemaExpression(sourceColumn, dataSetColumn);
  104. }
  105. if ((null == dataType) || (dataType.IsArray == dataColumn.DataType.IsArray)) {
  106. #if DEBUG
  107. if (AdapterSwitches.DataSchema.TraceInfo) {
  108. Debug.WriteLine("schema match on DataColumn \"" + dataSetColumn + "\"");
  109. }
  110. #endif
  111. return dataColumn;
  112. }
  113. #if DEBUG
  114. if (AdapterSwitches.DataSchema.TraceWarning) {
  115. Debug.WriteLine("schema mismatch on DataColumn \"" + dataSetColumn + "\" " + dataType.Name + " != " + dataColumn.DataType.Name);
  116. }
  117. #endif
  118. throw ADP.ColumnSchemaMismatch(sourceColumn, dataType, dataColumn);
  119. }
  120. return CreateDataColumnBySchemaAction(sourceColumn, dataSetColumn, dataTable, dataType, schemaAction);
  121. }
  122. static internal DataColumn CreateDataColumnBySchemaAction(string sourceColumn, string dataSetColumn, DataTable dataTable, Type dataType, MissingSchemaAction schemaAction) {
  123. Debug.Assert(dataTable != null, "Should not call with a null DataTable");
  124. if (ADP.IsEmpty(dataSetColumn)) {
  125. return null;
  126. }
  127. switch (schemaAction) {
  128. case MissingSchemaAction.Add:
  129. case MissingSchemaAction.AddWithKey:
  130. #if DEBUG
  131. if (AdapterSwitches.DataSchema.TraceInfo) {
  132. Debug.WriteLine("schema add of DataColumn \"" + dataSetColumn + "\" <" + Convert.ToString(dataType, CultureInfo.InvariantCulture) +">");
  133. }
  134. #endif
  135. return new DataColumn(dataSetColumn, dataType);
  136. case MissingSchemaAction.Ignore:
  137. #if DEBUG
  138. if (AdapterSwitches.DataSchema.TraceWarning) {
  139. Debug.WriteLine("schema filter of DataColumn \"" + dataSetColumn + "\" <" + Convert.ToString(dataType, CultureInfo.InvariantCulture) +">");
  140. }
  141. #endif
  142. return null;
  143. case MissingSchemaAction.Error:
  144. #if DEBUG
  145. if (AdapterSwitches.DataSchema.TraceError) {
  146. Debug.WriteLine("schema error on DataColumn \"" + dataSetColumn + "\" <" + Convert.ToString(dataType, CultureInfo.InvariantCulture) +">");
  147. }
  148. #endif
  149. throw ADP.ColumnSchemaMissing(dataSetColumn, dataTable.TableName, sourceColumn);
  150. }
  151. throw ADP.InvalidMissingSchemaAction(schemaAction);
  152. }
  153. public override String ToString() {
  154. return SourceColumn;
  155. }
  156. sealed internal class DataColumnMappingConverter : System.ComponentModel.ExpandableObjectConverter {
  157. // converter classes should have public ctor
  158. public DataColumnMappingConverter() {
  159. }
  160. override public bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
  161. if (typeof(InstanceDescriptor) == destinationType) {
  162. return true;
  163. }
  164. return base.CanConvertTo(context, destinationType);
  165. }
  166. override public object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
  167. if (null == destinationType) {
  168. throw ADP.ArgumentNull("destinationType");
  169. }
  170. if ((typeof(InstanceDescriptor) == destinationType) && (value is DataColumnMapping)) {
  171. DataColumnMapping mapping = (DataColumnMapping)value;
  172. object[] values = new object[] { mapping.SourceColumn, mapping.DataSetColumn };
  173. Type[] types = new Type[] { typeof(string), typeof(string) };
  174. ConstructorInfo ctor = typeof(DataColumnMapping).GetConstructor(types);
  175. return new InstanceDescriptor(ctor, values);
  176. }
  177. return base.ConvertTo(context, culture, value, destinationType);
  178. }
  179. }
  180. }
  181. }