Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / System / data / design / TypedColumnHandler.cs / 2 / TypedColumnHandler.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All Rights Reserved. // Information Contained Herein is Proprietary and Confidential. // //----------------------------------------------------------------------------- namespace System.Data.Design { using System; using System.CodeDom; using System.Collections; using System.ComponentModel; using System.Data; using System.Design; using System.Reflection; internal sealed class TypedColumnHandler { private TypedDataSourceCodeGenerator codeGenerator = null; private DataTable table = null; private DesignTable designTable = null; private DesignColumnCollection columns = null; internal TypedColumnHandler(DesignTable designTable, TypedDataSourceCodeGenerator codeGenerator) { this.codeGenerator = codeGenerator; this.table = designTable.DataTable; this.designTable = designTable; this.columns = designTable.DesignColumns; } internal void AddPrivateVariables(CodeTypeDeclaration dataTableClass) { if(dataTableClass == null) { throw new InternalException("Table CodeTypeDeclaration should not be null."); } if( columns == null ) { return; } foreach(DesignColumn column in columns) { //\\ private DataColumn; dataTableClass.Members.Add(CodeGenHelper.FieldDecl(CodeGenHelper.GlobalType(typeof(System.Data.DataColumn)), column.GeneratorColumnVarNameInTable)); } } internal void AddTableColumnProperties(CodeTypeDeclaration dataTableClass) { if( columns == null ) { return; } foreach(DesignColumn column in columns) { //\\ public DataColumn { //\\ get { return this. ; } //\\ } CodeMemberProperty colProp = CodeGenHelper.PropertyDecl( CodeGenHelper.GlobalType(typeof(System.Data.DataColumn)), column.GeneratorColumnPropNameInTable, MemberAttributes.Public | MemberAttributes.Final ); colProp.GetStatements.Add( CodeGenHelper.Return( CodeGenHelper.Field(CodeGenHelper.This(), column.GeneratorColumnVarNameInTable) ) ); dataTableClass.Members.Add(colProp); } } internal void AddRowColumnProperties(CodeTypeDeclaration rowClass) { bool storageInitialized = false; string rowClassName = codeGenerator.TableHandler.Tables[table.TableName].GeneratorRowClassName; string tableFieldName = codeGenerator.TableHandler.Tables[table.TableName].GeneratorTableVarName; foreach(DesignColumn designColumn in columns) { DataColumn column = designColumn.DataColumn; Type dataType = column.DataType; string rowColumnName = designColumn.GeneratorColumnPropNameInRow; string tableColumnName = designColumn.GeneratorColumnPropNameInTable; GenericNameHandler propertyScopeNameHandler = new GenericNameHandler(new string[] { rowColumnName }, codeGenerator.CodeProvider); //\\ public { //\\ get { //\\ try{ //\\ return (( )(this[this.table . Column])); //\\ }catch(InvalidCastException e) { //\\ throw new StrongTypingException("StrongTyping_CananotAccessDBNull", e); //\\ } //\\ } //\\or //\\ get { //\\ if(Is Null()){ //\\ return ( ); //\\ }else { //\\ return (( )(this[this.table . Column])); //\\ } //\\ } //\\or //\\ get { //\\ if(Is Null()){ //\\ return _nullValue; //\\ }else { //\\ return (( )(this[this.table . Column])); //\\ } //\\ } //\\ //\\ set {this[this.table . Column] = value;} //\\ } //\\ //\\if required: //\\ private static _nullValue = ...; CodeMemberProperty rowProp = CodeGenHelper.PropertyDecl( CodeGenHelper.Type(dataType), rowColumnName, MemberAttributes.Public | MemberAttributes.Final ); CodeStatement getStmnt = CodeGenHelper.Return( CodeGenHelper.Cast( CodeGenHelper.GlobalType(dataType), CodeGenHelper.Indexer( CodeGenHelper.This(), CodeGenHelper.Property( CodeGenHelper.Field(CodeGenHelper.This(), tableFieldName), tableColumnName ) ) ) ); if(column.AllowDBNull) { string nullValue = (string) column.ExtendedProperties["nullValue"]; if(nullValue == null || nullValue == "_throw") { getStmnt = CodeGenHelper.Try( getStmnt, CodeGenHelper.Catch( CodeGenHelper.GlobalType(typeof(System.InvalidCastException)), propertyScopeNameHandler.AddNameToList("e"), CodeGenHelper.Throw( CodeGenHelper.GlobalType(typeof(System.Data.StrongTypingException)), SR.GetString(SR.CG_ColumnIsDBNull, column.ColumnName, table.TableName), propertyScopeNameHandler.GetNameFromList("e") ) ) ); }else { CodeExpression nullValueFieldInit = null; // in some cases we generate it CodeExpression nullValueExpr; if(nullValue == "_null") { if(column.DataType.IsSubclassOf(typeof(System.ValueType))) { codeGenerator.ProblemList.Add( new DSGeneratorProblem(SR.GetString(SR.CG_TypeCantBeNull, column.ColumnName, column.DataType.Name), ProblemSeverity.NonFatalError, designColumn) ); continue; // with next column. } nullValueExpr = CodeGenHelper.Primitive(null); } else if (nullValue == "_empty") { if (column.DataType == typeof(string)) { nullValueExpr = CodeGenHelper.Property(CodeGenHelper.TypeExpr(CodeGenHelper.GlobalType(column.DataType)), "Empty"); } else { nullValueExpr = CodeGenHelper.Field( CodeGenHelper.TypeExpr(CodeGenHelper.Type(rowClassName)), rowColumnName + "_nullValue" ); //\\ private static _nullValue = new (); /* check that object can be constructed with parameterless constructor */ ConstructorInfo constructor = column.DataType.GetConstructor(new Type[] { typeof(string) }); if (constructor == null) { codeGenerator.ProblemList.Add(new DSGeneratorProblem(SR.GetString(SR.CG_NoCtor0, column.ColumnName, column.DataType.Name), ProblemSeverity.NonFatalError, designColumn)); continue; // with next column. } constructor.Invoke(new Object[] { }); // can throw here. nullValueFieldInit = CodeGenHelper.New(CodeGenHelper.Type(column.DataType), new CodeExpression[] { }); } } else { if (!storageInitialized) { table.NewRow(); // by this we force DataTable create DataStorage for each column in a table. storageInitialized = true; } object nullValueObj = codeGenerator.RowHandler.RowGenerator.ConvertXmlToObject.Invoke(column, new object[] { nullValue }); // an exception will be thrown if nullValue can't be conwerted to col.DataType DSGeneratorProblem problem = CodeGenHelper.GenerateValueExprAndFieldInit(designColumn, nullValueObj, nullValue, rowClassName, rowColumnName + "_nullValue", out nullValueExpr, out nullValueFieldInit); if (problem != null) { codeGenerator.ProblemList.Add(problem); continue; // with next column } } getStmnt = CodeGenHelper.If( CodeGenHelper.MethodCall(CodeGenHelper.This(), "Is" + rowColumnName + "Null"), new CodeStatement[] {CodeGenHelper.Return(nullValueExpr)}, new CodeStatement[] {getStmnt} ); if(nullValueFieldInit != null) { CodeMemberField nullValueField = CodeGenHelper.FieldDecl( CodeGenHelper.Type(column.DataType.FullName), rowColumnName + "_nullValue" ); nullValueField.Attributes = MemberAttributes.Static | MemberAttributes.Private; nullValueField.InitExpression = nullValueFieldInit; rowClass.Members.Add(nullValueField); } } } rowProp.GetStatements.Add(getStmnt); rowProp.SetStatements.Add( CodeGenHelper.Assign( CodeGenHelper.Indexer( CodeGenHelper.This(), CodeGenHelper.Property( CodeGenHelper.Field(CodeGenHelper.This(), tableFieldName), tableColumnName ) ), CodeGenHelper.Value() ) ); rowClass.Members.Add(rowProp); if (column.AllowDBNull) { //\\ public bool Is Null() { //\\ return this.IsNull(this.table . Column); //\\ } string candidateName = "Is" + rowColumnName + "Null"; string validatedName = MemberNameValidator.GenerateIdName(candidateName, this.codeGenerator.CodeProvider, false /*useSuffix*/); CodeMemberMethod isNull = CodeGenHelper.MethodDecl( CodeGenHelper.GlobalType(typeof(System.Boolean)), validatedName, MemberAttributes.Public | MemberAttributes.Final ); isNull.Statements.Add( CodeGenHelper.Return( CodeGenHelper.MethodCall( CodeGenHelper.This(), "IsNull", CodeGenHelper.Property( CodeGenHelper.Field(CodeGenHelper.This(), tableFieldName), tableColumnName ) ) ) ); rowClass.Members.Add(isNull); //\\ public void Set Null() { //\\ this[this.table . Column] = DBNull.Value; //\\ } candidateName = "Set" + rowColumnName + "Null"; validatedName = MemberNameValidator.GenerateIdName(candidateName, this.codeGenerator.CodeProvider, false /*useSuffix*/); CodeMemberMethod setNull = CodeGenHelper.MethodDecl( CodeGenHelper.GlobalType(typeof(void)), validatedName, MemberAttributes.Public | MemberAttributes.Final ); setNull.Statements.Add( CodeGenHelper.Assign( CodeGenHelper.Indexer( CodeGenHelper.This(), CodeGenHelper.Property( CodeGenHelper.Field(CodeGenHelper.This(), tableFieldName), tableColumnName ) ), CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(Convert)), "DBNull") ) ); rowClass.Members.Add(setNull); } } } internal void AddRowGetRelatedRowsMethods(CodeTypeDeclaration rowClass) { DataRelationCollection childRelations = table.ChildRelations; for (int i = 0; i < childRelations.Count; i++) { //\\ public [] Get Rows() { //\\ return ( []) base.GetChildRows(this.Table.ChildRelations[" "]); //\\ } DataRelation relation = childRelations[i]; string rowConcreteClassName = codeGenerator.TableHandler.Tables[relation.ChildTable.TableName].GeneratorRowClassName; CodeMemberMethod childArray = CodeGenHelper.MethodDecl( CodeGenHelper.Type(rowConcreteClassName, 1), codeGenerator.RelationHandler.Relations[relation.RelationName].GeneratorChildPropName, MemberAttributes.Public | MemberAttributes.Final ); childArray.Statements.Add( CodeGenHelper.If( CodeGenHelper.IdEQ( CodeGenHelper.Indexer( CodeGenHelper.Property( CodeGenHelper.Property(CodeGenHelper.This(), "Table"), "ChildRelations" ), CodeGenHelper.Str(relation.RelationName) ), CodeGenHelper.Primitive(null) ), CodeGenHelper.Return( new CodeArrayCreateExpression(rowConcreteClassName, 0) ), CodeGenHelper.Return( CodeGenHelper.Cast( CodeGenHelper.Type(rowConcreteClassName, 1), CodeGenHelper.MethodCall( CodeGenHelper.Base(), "GetChildRows", CodeGenHelper.Indexer( CodeGenHelper.Property( CodeGenHelper.Property(CodeGenHelper.This(), "Table"), "ChildRelations" ), CodeGenHelper.Str(relation.RelationName) ) ) ) ) ) ); rowClass.Members.Add(childArray); } DataRelationCollection parentRelations = table.ParentRelations; for (int i = 0; i < parentRelations.Count; i++) { //\\ public Parent { //\\ get { //\\ return (( )(this.GetParentRow(this.Table.ParentRelations[" "]))); //\\ } //\\ set { //\\ this.SetParentRow(value, this.Table.ParentRelations[" "]); //\\ } //\\ } DataRelation relation = parentRelations[i]; string parentTypedRowName = codeGenerator.TableHandler.Tables[relation.ParentTable.TableName].GeneratorRowClassName; CodeMemberProperty parentTableProp = CodeGenHelper.PropertyDecl( CodeGenHelper.Type(parentTypedRowName), codeGenerator.RelationHandler.Relations[relation.RelationName].GeneratorParentPropName, MemberAttributes.Public | MemberAttributes.Final ); parentTableProp.GetStatements.Add( CodeGenHelper.Return( CodeGenHelper.Cast( CodeGenHelper.Type(parentTypedRowName), CodeGenHelper.MethodCall( CodeGenHelper.This(), "GetParentRow", CodeGenHelper.Indexer( CodeGenHelper.Property( CodeGenHelper.Property(CodeGenHelper.This(), "Table"), "ParentRelations" ), CodeGenHelper.Str(relation.RelationName) ) ) ) ) ); parentTableProp.SetStatements.Add( CodeGenHelper.MethodCall( CodeGenHelper.This(), "SetParentRow", new CodeExpression[] { CodeGenHelper.Value(), CodeGenHelper.Indexer( CodeGenHelper.Property( CodeGenHelper.Property(CodeGenHelper.This(), "Table"), "ParentRelations" ), CodeGenHelper.Str(relation.RelationName) ) } ) ); rowClass.Members.Add(parentTableProp); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ReferenceSchema.cs
- COAUTHINFO.cs
- IPPacketInformation.cs
- ToolStripDropDownButton.cs
- FastPropertyAccessor.cs
- ModelPerspective.cs
- TextServicesContext.cs
- ConnectionsZone.cs
- ToolStripSettings.cs
- XsltLibrary.cs
- DataGridLinkButton.cs
- TypographyProperties.cs
- OleDbRowUpdatedEvent.cs
- OutputCacheProfile.cs
- EnumerableRowCollection.cs
- ExtensionSimplifierMarkupObject.cs
- Button.cs
- BamlRecords.cs
- InvalidWMPVersionException.cs
- DiscoveryOperationContextExtension.cs
- EventsTab.cs
- PolyBezierSegmentFigureLogic.cs
- PropertyChangedEventManager.cs
- AutomationPattern.cs
- Repeater.cs
- SqlFactory.cs
- WebPartTransformerAttribute.cs
- ThicknessAnimation.cs
- PropertyTabChangedEvent.cs
- CompModSwitches.cs
- Int32Converter.cs
- XmlDictionaryString.cs
- CacheVirtualItemsEvent.cs
- ProfileEventArgs.cs
- MediaContext.cs
- TextDecorationUnitValidation.cs
- OleDbParameter.cs
- DataControlButton.cs
- SecurityUniqueId.cs
- ValidationRuleCollection.cs
- CachedFontFace.cs
- TreeViewBindingsEditor.cs
- StateFinalizationActivity.cs
- TCPClient.cs
- BinaryParser.cs
- SqlCacheDependencySection.cs
- SvcMapFile.cs
- AuthorizationSection.cs
- InputMethodStateTypeInfo.cs
- ReadOnlyDataSourceView.cs
- EmbeddedObject.cs
- PenLineJoinValidation.cs
- DataObjectCopyingEventArgs.cs
- TreeWalkHelper.cs
- ImageBrush.cs
- ConfigViewGenerator.cs
- CommandBinding.cs
- EntityViewGenerationConstants.cs
- ObjectPersistData.cs
- SafeHandles.cs
- DescendantQuery.cs
- _HeaderInfoTable.cs
- ServiceThrottle.cs
- BitmapEffectDrawing.cs
- BindStream.cs
- Rfc2898DeriveBytes.cs
- SuppressIldasmAttribute.cs
- CodeAttributeArgumentCollection.cs
- XPathNavigatorKeyComparer.cs
- CircleEase.cs
- KeyNotFoundException.cs
- ListViewCommandEventArgs.cs
- ToolStripDropTargetManager.cs
- URLString.cs
- MulticastNotSupportedException.cs
- XamlStyleSerializer.cs
- RichTextBoxConstants.cs
- DeclarativeCatalogPart.cs
- HtmlInputHidden.cs
- Pick.cs
- ConfigurationManager.cs
- NavigationService.cs
- DescriptionAttribute.cs
- UpdatableWrapper.cs
- SqlDuplicator.cs
- PropertyContainer.cs
- FontConverter.cs
- WorkItem.cs
- ImageMetadata.cs
- XmlFormatMapping.cs
- ConfigurationElement.cs
- DataGridParentRows.cs
- HttpGetServerProtocol.cs
- X509ServiceCertificateAuthenticationElement.cs
- ItemsPanelTemplate.cs
- XmlSerializableServices.cs
- SerTrace.cs
- Comparer.cs
- XmlObjectSerializerWriteContextComplex.cs
- ProcessManager.cs