Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Data / System / Data / Common / SQLTypes / SqlUDTStorage.cs / 1305376 / SqlUDTStorage.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //[....] //[....] //----------------------------------------------------------------------------- namespace System.Data.Common { using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Xml; using System.IO; using System.Xml.Serialization; using System.Globalization; using System.Collections; using System.Collections.Generic; using System.Diagnostics; internal sealed class SqlUdtStorage : DataStorage { private object[] values; private readonly bool implementsIXmlSerializable = false; private readonly bool implementsIComparable = false; private static readonly DictionaryTypeToNull = new Dictionary (); public SqlUdtStorage(DataColumn column, Type type) : this(column, type, GetStaticNullForUdtType(type)) { } private SqlUdtStorage(DataColumn column, Type type, object nullValue) : base(column, type, nullValue, nullValue, typeof(ICloneable).IsAssignableFrom(type)) { implementsIXmlSerializable = typeof(IXmlSerializable).IsAssignableFrom(type); implementsIComparable = typeof(IComparable).IsAssignableFrom(type); } // Webdata 104340, to support oracle types and other INUllable types that have static Null as field internal static object GetStaticNullForUdtType(Type type) { object value; if (!TypeToNull.TryGetValue(type, out value)) { System.Reflection.PropertyInfo propInfo = type.GetProperty("Null", System.Reflection.BindingFlags.Public |System.Reflection.BindingFlags.Static); if (propInfo != null) value = propInfo.GetValue(null, null); else { System.Reflection.FieldInfo fieldInfo = type.GetField("Null", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); if (fieldInfo != null) { value = fieldInfo.GetValue(null); } else { throw ExceptionBuilder.INullableUDTwithoutStaticNull(type.AssemblyQualifiedName); } } lock(TypeToNull) { //if(50 < TypeToNull.Count) { // TypeToNull.Clear(); //} TypeToNull[type] = value; } } return value; } override public bool IsNull(int record) { return (((INullable)values[record]).IsNull); } override public Object Aggregate(int[] records, AggregateType kind) { throw ExceptionBuilder.AggregateException(kind, DataType); } override public int Compare(int recordNo1, int recordNo2) { return (CompareValueTo(recordNo1, values[recordNo2])); } override public int CompareValueTo(int recordNo1, Object value) { if (DBNull.Value == value) { // it is not meaningful compare UDT with DBNull.Value WebData 113372 value = NullValue; } if(implementsIComparable) { IComparable comparable = (IComparable)values[recordNo1]; return comparable.CompareTo(value); } else if (NullValue == value) { INullable nullableValue = (INullable)values[recordNo1]; return nullableValue.IsNull ? 0 : 1; // left may be null, right is null } // else throw ExceptionBuilder.IComparableNotImplemented(DataType.AssemblyQualifiedName); } override public void Copy(int recordNo1, int recordNo2) { CopyBits(recordNo1, recordNo2); values[recordNo2] = values[recordNo1]; } override public Object Get(int recordNo) { return (values[recordNo]); } override public void Set(int recordNo, Object value) { if (DBNull.Value == value) { values[recordNo] = NullValue; SetNullBit(recordNo, true); } else if (null == value) { if (IsValueType) { throw ExceptionBuilder.StorageSetFailed(); } else { values[recordNo] = NullValue; SetNullBit(recordNo, true); } } else if (!DataType.IsInstanceOfType(value)) { throw ExceptionBuilder.StorageSetFailed(); } else { // WebData 113331 do not clone the value values[recordNo] = value; SetNullBit(recordNo, false); } } override public void SetCapacity(int capacity) { object[] newValues = new object[capacity]; if (values != null) { Array.Copy(values, 0, newValues, 0, Math.Min(capacity, values.Length)); } values = newValues; base.SetCapacity(capacity); } override public object ConvertXmlToObject(string s) { if (implementsIXmlSerializable) { object Obj = System.Activator.CreateInstance (DataType, true); string tempStr =string.Concat(" ", s, ""); // this is done since you can give fragmet to reader, bug 98767 StringReader strReader = new StringReader(tempStr); using (XmlTextReader xmlTextReader = new XmlTextReader(strReader)) { ((IXmlSerializable)Obj).ReadXml(xmlTextReader); } return Obj; } StringReader strreader = new StringReader(s); XmlSerializer deserializerWithOutRootAttribute = ObjectStorage.GetXmlSerializer(DataType); return(deserializerWithOutRootAttribute.Deserialize(strreader)); } public override object ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib) { if (null == xmlAttrib) { string typeName = xmlReader.GetAttribute(Keywords.MSD_INSTANCETYPE, Keywords.MSDNS); if (typeName == null) { string xsdTypeName = xmlReader.GetAttribute(Keywords.MSD_INSTANCETYPE, Keywords.XSINS); // this xsd type if (null != xsdTypeName) { typeName = XSDSchema.XsdtoClr(xsdTypeName).FullName; } } Type type = (typeName == null)? DataType : Type.GetType(typeName); object Obj = System.Activator.CreateInstance (type, true); Debug.Assert(xmlReader is DataTextReader, "Invalid DataTextReader is being passed to customer"); ((IXmlSerializable)Obj).ReadXml(xmlReader); return Obj; } else{ XmlSerializer deserializerWithRootAttribute = ObjectStorage.GetXmlSerializer(DataType, xmlAttrib); return(deserializerWithRootAttribute.Deserialize(xmlReader)); } } override public string ConvertObjectToXml(object value) { StringWriter strwriter = new StringWriter(FormatProvider); if (implementsIXmlSerializable) { using (XmlTextWriter xmlTextWriter = new XmlTextWriter (strwriter)) { ((IXmlSerializable)value).WriteXml(xmlTextWriter); } } else { XmlSerializer serializerWithOutRootAttribute = ObjectStorage.GetXmlSerializer(value.GetType()); serializerWithOutRootAttribute.Serialize(strwriter, value); } return (strwriter.ToString ()); } public override void ConvertObjectToXml(object value, XmlWriter xmlWriter, XmlRootAttribute xmlAttrib) { if (null == xmlAttrib) { Debug.Assert(xmlWriter is DataTextWriter, "Invalid DataTextWriter is being passed to customer"); ((IXmlSerializable)value).WriteXml(xmlWriter); } else { // we support polymorphism only for types that implements IXmlSerializable. // Assumption: value is the same type as DataType XmlSerializer serializerWithRootAttribute = ObjectStorage.GetXmlSerializer(DataType, xmlAttrib); serializerWithRootAttribute.Serialize(xmlWriter, value); } } override protected object GetEmptyStorage(int recordCount) { return new Object[recordCount]; } override protected void CopyValue(int record, object store, BitArray nullbits, int storeIndex) { Object[] typedStore = (Object[]) store; typedStore[storeIndex] = values[record]; nullbits.Set(storeIndex, IsNull(record)); } override protected void SetStorage(object store, BitArray nullbits) { values = (Object[]) store; //SetNullStorage(nullbits); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- NativeActivity.cs
- BamlResourceDeserializer.cs
- NotSupportedException.cs
- ContextMenuAutomationPeer.cs
- XsdDateTime.cs
- SqlInternalConnectionSmi.cs
- KnownColorTable.cs
- StylusShape.cs
- OleDbInfoMessageEvent.cs
- WindowsAltTab.cs
- FixedTextView.cs
- EqualityComparer.cs
- ExecutionContext.cs
- BamlLocalizabilityResolver.cs
- DataContractAttribute.cs
- DesignerActionItem.cs
- Ipv6Element.cs
- SchemaImporter.cs
- WebPartCancelEventArgs.cs
- BuiltInExpr.cs
- HybridDictionary.cs
- DateTimeOffsetStorage.cs
- WindowsFont.cs
- XmlNullResolver.cs
- EpmCustomContentSerializer.cs
- PromptBuilder.cs
- SystemResources.cs
- ActivityInfo.cs
- Validator.cs
- WindowsIPAddress.cs
- _HeaderInfoTable.cs
- ClientUtils.cs
- MyContact.cs
- ItemsPanelTemplate.cs
- Point3DCollection.cs
- ControlValuePropertyAttribute.cs
- FocusManager.cs
- CodeTypeDeclaration.cs
- ServiceNameElement.cs
- CultureTable.cs
- DataGridViewRowConverter.cs
- ScalarOps.cs
- ValidationSummary.cs
- HtmlMeta.cs
- CheckBoxFlatAdapter.cs
- SpeechDetectedEventArgs.cs
- BindingCollection.cs
- BindingMemberInfo.cs
- DataSysAttribute.cs
- WebPartEditorCancelVerb.cs
- MetadataItemEmitter.cs
- GeometryCombineModeValidation.cs
- DiscreteKeyFrames.cs
- IResourceProvider.cs
- PrintEvent.cs
- ParseElementCollection.cs
- DataGridViewCellMouseEventArgs.cs
- sqlmetadatafactory.cs
- SQLSingleStorage.cs
- DataServiceProcessingPipelineEventArgs.cs
- CodeTypeOfExpression.cs
- ServiceBusyException.cs
- BuildDependencySet.cs
- InplaceBitmapMetadataWriter.cs
- PersianCalendar.cs
- ControlParameter.cs
- ObjectParameterCollection.cs
- ECDiffieHellmanCngPublicKey.cs
- UnsafeNativeMethods.cs
- DataTableReaderListener.cs
- PreviewPageInfo.cs
- CompiledQuery.cs
- SequentialUshortCollection.cs
- GradientStopCollection.cs
- DoubleIndependentAnimationStorage.cs
- CurrencyManager.cs
- HtmlDocument.cs
- ToolStripOverflow.cs
- XmlBindingWorker.cs
- TabletDeviceInfo.cs
- EntityCommandExecutionException.cs
- CodeObject.cs
- UTF32Encoding.cs
- ActiveXSite.cs
- NoResizeHandleGlyph.cs
- DbConnectionPoolIdentity.cs
- AccessViolationException.cs
- entityreference_tresulttype.cs
- BaseContextMenu.cs
- XmlAttributeProperties.cs
- TimeoutException.cs
- WebDescriptionAttribute.cs
- HttpServerVarsCollection.cs
- XpsS0ValidatingLoader.cs
- BooleanSwitch.cs
- UnmanagedMemoryStream.cs
- CompiledXpathExpr.cs
- StorageAssociationTypeMapping.cs
- TextContainerHelper.cs
- ClientSession.cs