Code:
/ FX-1434 / FX-1434 / 1.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
- RemoteCryptoRsaServiceProvider.cs
- DllNotFoundException.cs
- SchemaObjectWriter.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- MetadataExchangeBindings.cs
- WindowsScrollBar.cs
- SiteIdentityPermission.cs
- FontEmbeddingManager.cs
- RangeValueProviderWrapper.cs
- StorageMappingItemLoader.cs
- FontFamily.cs
- Matrix.cs
- HttpDebugHandler.cs
- SoapIncludeAttribute.cs
- FunctionCommandText.cs
- TypeDescriptorContext.cs
- ConfigurationStrings.cs
- KeyValuePair.cs
- DesignerFrame.cs
- sitestring.cs
- BatchParser.cs
- CounterSample.cs
- ExtensionCollection.cs
- DesignerHelpers.cs
- ThreadExceptionEvent.cs
- ThreadStaticAttribute.cs
- QueryConverter.cs
- KeyGestureValueSerializer.cs
- OleDbConnectionFactory.cs
- BaseCAMarshaler.cs
- EventListener.cs
- InfoCardConstants.cs
- AttributeProviderAttribute.cs
- WebPartVerbsEventArgs.cs
- ToolStripPanelRenderEventArgs.cs
- RequestQueue.cs
- QilInvoke.cs
- HostProtectionException.cs
- DesignerActionVerbItem.cs
- BindToObject.cs
- RegexReplacement.cs
- jithelpers.cs
- RightNameExpirationInfoPair.cs
- CompoundFileDeflateTransform.cs
- NativeMethods.cs
- Int64KeyFrameCollection.cs
- EpmContentDeSerializerBase.cs
- DirtyTextRange.cs
- ToolStripContainerActionList.cs
- BamlCollectionHolder.cs
- EncryptedKey.cs
- SmiEventSink_Default.cs
- GradientBrush.cs
- HostTimeoutsElement.cs
- ThreadAbortException.cs
- ProfileWorkflowElement.cs
- StickyNoteHelper.cs
- _Events.cs
- FrameSecurityDescriptor.cs
- BinaryExpression.cs
- RepeatButtonAutomationPeer.cs
- ThicknessAnimation.cs
- VariableExpressionConverter.cs
- MarkerProperties.cs
- WindowsFormsDesignerOptionService.cs
- MouseBinding.cs
- PagerSettings.cs
- HttpResponse.cs
- LinkArea.cs
- ImageCodecInfoPrivate.cs
- SkipQueryOptionExpression.cs
- Profiler.cs
- QilStrConcat.cs
- SignedXmlDebugLog.cs
- UpdateException.cs
- WindowsNonControl.cs
- NotifyInputEventArgs.cs
- infer.cs
- WebSysDefaultValueAttribute.cs
- DataGridViewBand.cs
- TransformCollection.cs
- DesignTimeXamlWriter.cs
- WorkflowRuntimeSection.cs
- QfeChecker.cs
- RefreshPropertiesAttribute.cs
- TextPointerBase.cs
- XhtmlConformanceSection.cs
- TextRange.cs
- DuplicateWaitObjectException.cs
- X509ChainElement.cs
- StreamMarshaler.cs
- EdmProviderManifest.cs
- FreezableCollection.cs
- ComponentCollection.cs
- CompositeActivityDesigner.cs
- CodeEntryPointMethod.cs
- Debug.cs
- XsdValidatingReader.cs
- AnimationTimeline.cs
- DebugView.cs