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
- HierarchicalDataSourceControl.cs
- BindingValueChangedEventArgs.cs
- validationstate.cs
- AssemblyBuilder.cs
- SqlException.cs
- DataGridCommandEventArgs.cs
- InputLanguageProfileNotifySink.cs
- SendMailErrorEventArgs.cs
- ColumnWidthChangingEvent.cs
- Sentence.cs
- RemotingException.cs
- Duration.cs
- EllipticalNodeOperations.cs
- DataControlCommands.cs
- ObjectViewListener.cs
- RunInstallerAttribute.cs
- DataRowCollection.cs
- ToolStripDropDown.cs
- Line.cs
- ChainedAsyncResult.cs
- columnmapfactory.cs
- RankException.cs
- OperationCanceledException.cs
- LongAverageAggregationOperator.cs
- SqlDataReaderSmi.cs
- UrlPropertyAttribute.cs
- NativeMethods.cs
- ReverseQueryOperator.cs
- documentsequencetextpointer.cs
- baseaxisquery.cs
- Control.cs
- ImpersonateTokenRef.cs
- IgnoreSectionHandler.cs
- SoapFormatter.cs
- NavigationFailedEventArgs.cs
- RuntimeHelpers.cs
- ToolStripProgressBar.cs
- LogArchiveSnapshot.cs
- KeysConverter.cs
- SourceFilter.cs
- CodeArrayCreateExpression.cs
- AttributeData.cs
- FlowDocumentReaderAutomationPeer.cs
- ProfessionalColors.cs
- DecimalKeyFrameCollection.cs
- XPathScanner.cs
- ProfileService.cs
- SettingsPropertyCollection.cs
- InternalException.cs
- FixedMaxHeap.cs
- Int16Storage.cs
- ByteStreamMessageEncodingElement.cs
- SqlClientPermission.cs
- SrgsElementFactory.cs
- DateTimeOffsetConverter.cs
- SmtpNetworkElement.cs
- UidManager.cs
- CompilerHelpers.cs
- CollectionAdapters.cs
- ThreadAbortException.cs
- Walker.cs
- ConstraintCollection.cs
- _StreamFramer.cs
- ContextBase.cs
- PropertySourceInfo.cs
- MaskedTextProvider.cs
- AsyncResult.cs
- ProfileBuildProvider.cs
- OleDbError.cs
- InstanceLockQueryResult.cs
- HttpModule.cs
- StringFunctions.cs
- xamlnodes.cs
- DayRenderEvent.cs
- SafeCryptoHandles.cs
- ColumnClickEvent.cs
- CFStream.cs
- FilterException.cs
- RealizationDrawingContextWalker.cs
- CounterCreationDataCollection.cs
- DataServiceKeyAttribute.cs
- ArrayExtension.cs
- Rfc2898DeriveBytes.cs
- securitycriticaldata.cs
- DataServiceProcessingPipelineEventArgs.cs
- DetailsViewRowCollection.cs
- webbrowsersite.cs
- AsyncStreamReader.cs
- HyperLink.cs
- DeviceContexts.cs
- SslStream.cs
- MoveSizeWinEventHandler.cs
- StatusStrip.cs
- ChildrenQuery.cs
- TableLayoutStyle.cs
- DocumentStatusResources.cs
- EventMemberCodeDomSerializer.cs
- ScrollChrome.cs
- TextEffect.cs
- ComponentChangingEvent.cs