Просмотр исходного кода

2004-06-06 Atsushi Enomoto <[email protected]>

	* XmlDataDocument.cs :
	  - It was not handling SimpleContent. This fixes bug #56951.
	  - It was not converting values into DataType of the DataColumn.

svn path=/trunk/mcs/; revision=28931
Atsushi Eno 21 лет назад
Родитель
Сommit
fbd34f4d08

+ 6 - 0
mcs/class/System.Data/System.Xml/ChangeLog

@@ -1,3 +1,9 @@
+2004-06-06  Atsushi Enomoto <[email protected]>
+
+	* XmlDataDocument.cs :
+	  - It was not handling SimpleContent. This fixes bug #56951.
+	  - It was not converting values into DataType of the DataColumn.
+
 2004-05-17  Atsushi Enomoto <[email protected]>
 
 	* XmlDataDocument.cs :

+ 44 - 6
mcs/class/System.Data/System.Xml/XmlDataDocument.cs

@@ -335,8 +335,10 @@ namespace System.Xml
 				if (!row.Table.Columns.Contains (args.Node.ParentNode.Name))
 					return;
 
-				if (row [args.Node.ParentNode.Name].ToString () != args.Node.InnerText)		
-					row [args.Node.ParentNode.Name] = args.Node.InnerText;		
+				if (row [args.Node.ParentNode.Name].ToString () != args.Node.InnerText) {
+					DataColumn col = row.Table.Columns [args.Node.ParentNode.Name];
+					row [col] = StringToObject (col.DataType, args.Node.InnerText);
+				}
 
 			} finally {
 				raiseDataSetEvents = escapedRaiseDataSetEvents;
@@ -433,7 +435,7 @@ namespace System.Xml
 				if (attr != null) { // fill attribute value
 					DataColumn col = row.Table.Columns [attr.LocalName];
 					if (col != null)
-						row [col] = args.Node.Value;
+						row [col] = StringToObject (col.DataType, args.Node.Value);
 				} else {
 					DataRow childRow = GetRowFromElement (args.Node as XmlElement);
 					if (childRow != null) {
@@ -443,11 +445,19 @@ namespace System.Xml
 						if (childRow.RowState != DataRowState.Detached && row.RowState != DataRowState.Detached) {
 							FillRelationship (row, childRow, args.NewParent, args.Node);
 						}
-					} else {
-						// child might be a column
+					} else if (args.Node.NodeType == XmlNodeType.Element) {
+						// child element might be a column
 						DataColumn col = row.Table.Columns [args.Node.LocalName];
 						if (col != null)
-							row [col] = args.Node.InnerText;
+							row [col] = StringToObject (col.DataType, args.Node.InnerText);
+					} else if (args.Node is XmlCharacterData) {
+						if (args.Node.NodeType != XmlNodeType.Comment) {
+							for (int i = 0; i < row.Table.Columns.Count; i++) {
+								DataColumn col = row.Table.Columns [i];
+								if (col.ColumnMapping == MappingType.SimpleContent)
+									row [col] = StringToObject (col.DataType, args.Node.Value);
+							}
+						}
 					}
 				}
 			} finally {
@@ -771,6 +781,34 @@ namespace System.Xml
 			this.NodeRemoving += new XmlNodeChangedEventHandler (OnNodeRemoving);
 			this.NodeRemoved += new XmlNodeChangedEventHandler (OnNodeRemoved);
 		}
+
+		internal static object StringToObject (Type type, string value)
+		{
+			if (type == null) return value;
+
+			switch (Type.GetTypeCode (type)) {
+				case TypeCode.Boolean: return XmlConvert.ToBoolean (value);
+				case TypeCode.Byte: return XmlConvert.ToByte (value);
+				case TypeCode.Char: return (char)XmlConvert.ToInt32 (value);
+				case TypeCode.DateTime: return XmlConvert.ToDateTime (value);
+				case TypeCode.Decimal: return XmlConvert.ToDecimal (value);
+				case TypeCode.Double: return XmlConvert.ToDouble (value);
+				case TypeCode.Int16: return XmlConvert.ToInt16 (value);
+				case TypeCode.Int32: return XmlConvert.ToInt32 (value);
+				case TypeCode.Int64: return XmlConvert.ToInt64 (value);
+				case TypeCode.SByte: return XmlConvert.ToSByte (value);
+				case TypeCode.Single: return XmlConvert.ToSingle (value);
+				case TypeCode.UInt16: return XmlConvert.ToUInt16 (value);
+				case TypeCode.UInt32: return XmlConvert.ToUInt32 (value);
+				case TypeCode.UInt64: return XmlConvert.ToUInt64 (value);
+			}
+
+			if (type == typeof (TimeSpan)) return XmlConvert.ToTimeSpan (value);
+			if (type == typeof (Guid)) return XmlConvert.ToGuid (value);
+			if (type == typeof (byte[])) return Convert.FromBase64String (value);
+
+			return Convert.ChangeType (value, type);
+		}
 		#endregion // Private methods
 	}
 }