Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / System / data / design / TypedDataSourceCodeGenerator.cs / 7 / TypedDataSourceCodeGenerator.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All Rights Reserved. // Information Contained Herein is Proprietary and Confidential. // //----------------------------------------------------------------------------- namespace System.Data.Design { using System.Diagnostics; using System; using System.IO; using System.Data; using System.Data.Common; using System.CodeDom; using System.Text; using System.Xml; using System.Xml.Serialization; using System.Collections; using System.Reflection; using System.Globalization; using System.CodeDom.Compiler; using System.Runtime.InteropServices; using GenerateOption = TypedDataSetGenerator.GenerateOption; internal enum TypeEnum { CLR, SQL, } internal enum DbObjectType { Unknown, Table, View, StoredProcedure, Function, Package, PackageBody } internal enum CommandOperation { Unknown, Select, Insert, Update, Delete } // Well-known, invariant provider names. internal class ManagedProviderNames { // private constructor to avoid class being instantiated. private ManagedProviderNames() { } public static string SqlClient { get { return "System.Data.SqlClient"; } } } internal sealed class TypedDataSourceCodeGenerator{ private DesignDataSource designDataSource = null; private CodeDomProvider codeProvider = null; private ArrayList problemList = new ArrayList(); private TypedTableHandler tableHandler = null; private RelationHandler relationHandler = null; private TypedRowHandler rowHandler = null; private bool generateExtendedProperties = false; private IDictionary userData = null; private bool generateSingleNamespace = false; private GenerateOption generateOption; private string dataSetNamespace = null; internal TypedDataSourceCodeGenerator() : base() { } internal CodeDomProvider CodeProvider { get { return this.codeProvider; } set { this.codeProvider = value; } } internal IDictionary UserData { get { return userData; } set { userData = value; } } internal string DataSourceName { get { return designDataSource.GeneratorDataSetName; } } internal ArrayList ProblemList { get { return problemList; } } internal TypedTableHandler TableHandler { get { return tableHandler; } } internal RelationHandler RelationHandler { get { return relationHandler; } } internal TypedRowHandler RowHandler { get { return rowHandler; } } internal bool GenerateExtendedProperties { get { return generateExtendedProperties; } } internal bool GenerateSingleNamespace { get { return generateSingleNamespace; } set { generateSingleNamespace = value; } } internal GenerateOption GenerateOptions { get { return generateOption; } } internal string DataSetNamespace { get { return dataSetNamespace; } } internal void GenerateDataSource(DesignDataSource dtDataSource, CodeCompileUnit codeCompileUnit, CodeNamespace mainNamespace, string dataSetNamespace, GenerateOption generateOption) { Debug.Assert(dtDataSource != null); designDataSource = dtDataSource; this.generateOption = generateOption; this.dataSetNamespace = dataSetNamespace; bool generateHierarchicalUpdate = (generateOption & GenerateOption.HierarchicalUpdate) == GenerateOption.HierarchicalUpdate; generateHierarchicalUpdate = generateHierarchicalUpdate && dtDataSource.EnableTableAdapterManager; AddUserData(codeCompileUnit); // create the typed datasource class declaration and add it to the namespace CodeTypeDeclaration dataSourceClass = CreateDataSourceDeclaration(dtDataSource); mainNamespace.Types.Add(dataSourceClass); bool supportsMultipleNamespaces = CodeGenHelper.SupportsMultipleNamespaces(this.codeProvider); CodeNamespace adaptersNamespace = null; if (!GenerateSingleNamespace && supportsMultipleNamespaces) { string adaptersNsName = this.CreateAdaptersNamespace(dtDataSource.GeneratorDataSetName); if (!StringUtil.Empty(mainNamespace.Name)) { adaptersNsName = mainNamespace.Name + "." + adaptersNsName; } adaptersNamespace = new CodeNamespace(adaptersNsName); } DataComponentGenerator componentGenerator = new DataComponentGenerator(this); bool hasAnyTableAdapter = false; foreach(DesignTable table in dtDataSource.DesignTables) { if(table.TableType != TableType.RadTable) { continue; } hasAnyTableAdapter = true; table.PropertyCache = new DesignTable.CodeGenPropertyCache(table); CodeTypeDeclaration componentType = componentGenerator.GenerateDataComponent(table, false, generateHierarchicalUpdate); if (GenerateSingleNamespace) { mainNamespace.Types.Add(componentType); } else { if (supportsMultipleNamespaces) { adaptersNamespace.Types.Add(componentType); } else { componentType.Name = dataSourceClass.Name + componentType.Name; mainNamespace.Types.Add(componentType); } } } generateHierarchicalUpdate = generateHierarchicalUpdate && hasAnyTableAdapter; if(dtDataSource.Sources != null && dtDataSource.Sources.Count > 0) { // create a 'fake' table and set names and sources on it DesignTable functionsTable = new DesignTable(); functionsTable.TableType = TableType.RadTable; functionsTable.MainSource = null; functionsTable.GeneratorDataComponentClassName = dtDataSource.GeneratorFunctionsComponentClassName; foreach(Source source in dtDataSource.Sources) { functionsTable.Sources.Add(source); } CodeTypeDeclaration componentType = componentGenerator.GenerateDataComponent(functionsTable, true, generateHierarchicalUpdate); // generate the FunctionsDataComponent out of the fake table if (GenerateSingleNamespace) { mainNamespace.Types.Add(componentType); } else { if (supportsMultipleNamespaces) { adaptersNamespace.Types.Add(componentType); } else { componentType.Name = dataSourceClass.Name + componentType.Name; mainNamespace.Types.Add(componentType); } } } if (adaptersNamespace != null && adaptersNamespace.Types.Count > 0) { codeCompileUnit.Namespaces.Add(adaptersNamespace); } if (generateHierarchicalUpdate) { TableAdapterManagerGenerator adapterManagerGenerator = new TableAdapterManagerGenerator(this); CodeTypeDeclaration adapterManagerType = adapterManagerGenerator.GenerateAdapterManager(designDataSource,dataSourceClass); if (GenerateSingleNamespace) { mainNamespace.Types.Add(adapterManagerType); } else { if (supportsMultipleNamespaces) { adaptersNamespace.Types.Add(adapterManagerType); } else { adapterManagerType.Name = dataSourceClass.Name + adapterManagerType.Name; mainNamespace.Types.Add(adapterManagerType); } } } } private void AddUserData(CodeCompileUnit compileUnit) { if (this.UserData != null) { foreach (object key in this.UserData.Keys) { compileUnit.UserData.Add(key, userData[key]); } } } private CodeTypeDeclaration CreateDataSourceDeclaration(DesignDataSource dtDataSource) { // Let's check if we have a DataSource name if( dtDataSource.Name == null ) { // throw new DataSourceGeneratorException("DataSource name cannot be null."); } // Ensure the generator names are set in the DesignDataSource NameHandler nameHandler = new NameHandler(this.codeProvider); nameHandler.GenerateMemberNames(dtDataSource, this.problemList); // Create CodeTypeDeclaration for DataSource class CodeTypeDeclaration dataSourceClass = CodeGenHelper.Class(dtDataSource.GeneratorDataSetName, true, dtDataSource.Modifier); // Set BaseType dataSourceClass.BaseTypes.Add(CodeGenHelper.GlobalType(typeof(System.Data.DataSet))); // Set Attributes dataSourceClass.CustomAttributes.Add(CodeGenHelper.AttributeDecl("System.Serializable")); dataSourceClass.CustomAttributes.Add(CodeGenHelper.AttributeDecl("System.ComponentModel.DesignerCategoryAttribute", CodeGenHelper.Str("code"))); dataSourceClass.CustomAttributes.Add(CodeGenHelper.AttributeDecl("System.ComponentModel.ToolboxItem", CodeGenHelper.Primitive(true))); dataSourceClass.CustomAttributes.Add(CodeGenHelper.AttributeDecl(typeof(XmlSchemaProviderAttribute).FullName, CodeGenHelper.Primitive("GetTypedDataSetSchema"))); dataSourceClass.CustomAttributes.Add(CodeGenHelper.AttributeDecl(typeof(XmlRootAttribute).FullName, CodeGenHelper.Primitive(dtDataSource.GeneratorDataSetName))); dataSourceClass.CustomAttributes.Add(CodeGenHelper.AttributeDecl(typeof(System.ComponentModel.Design.HelpKeywordAttribute).FullName, CodeGenHelper.Str("vs.data.DataSet"))); dataSourceClass.Comments.Add(CodeGenHelper.Comment("Represents a strongly typed in-memory cache of data.", true)); // Create and Init the Table Handler tableHandler = new TypedTableHandler(this, dtDataSource.DesignTables); // Create and Init the Relation Handler relationHandler = new RelationHandler(this, dtDataSource.DesignRelations); // Create the Typed Row Handler rowHandler = new TypedRowHandler(this, dtDataSource.DesignTables); // Create and Init the Typed DataSet Method Generator DatasetMethodGenerator dsMethodGenerator = new DatasetMethodGenerator(this, dtDataSource); // Generate 1 private variable for each typed table tableHandler.AddPrivateVars(dataSourceClass); // Generate 1 public property for each typed table tableHandler.AddTableProperties(dataSourceClass); // Generate 1 private variable for each relation relationHandler.AddPrivateVars(dataSourceClass); // Generate typed dataset methods dsMethodGenerator.AddMethods(dataSourceClass); // Generate typed row event handlers rowHandler.AddTypedRowEventHandlers(dataSourceClass); // Generate typed table classes tableHandler.AddTableClasses(dataSourceClass); // Generate typed row classes rowHandler.AddTypedRows(dataSourceClass); // Generate typed row event args rowHandler.AddTypedRowEventArgs(dataSourceClass); #if _WHACK_ // twhitney: we don't use default instances anymore #endif return dataSourceClass; } internal static ArrayList GetProviderAssemblies(DesignDataSource designDS) { Debug.Assert(designDS != null); ArrayList providerAssemblies = new ArrayList(); foreach (IDesignConnection connection in designDS.DesignConnections) { IDbConnection dbConnection = connection.CreateEmptyDbConnection(); Debug.Assert(dbConnection != null); if (dbConnection != null) { Assembly providerAssembly = dbConnection.GetType().Assembly; if (!providerAssemblies.Contains(providerAssembly)) { providerAssemblies.Add(providerAssembly); } } } return providerAssemblies; } private string CreateAdaptersNamespace(string generatorDataSetName) { if (generatorDataSetName.StartsWith("[", StringComparison.Ordinal) && generatorDataSetName.EndsWith("]", StringComparison.Ordinal)) { // special case for VB: the class name can be enclosed in brackets, but if we concatenate it to // create the namespace name it's not valid any more (see VSWhidbey #361647). generatorDataSetName = generatorDataSetName.Substring(1, generatorDataSetName.Length - 2); } return MemberNameValidator.GenerateIdName(generatorDataSetName + "TableAdapters", this.CodeProvider, false/*useSuffix*/); } } } // 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
- HttpCapabilitiesSectionHandler.cs
- WeakReferenceList.cs
- WebPartEditorOkVerb.cs
- EditorAttribute.cs
- ListParaClient.cs
- TdsParserSessionPool.cs
- TypeUnloadedException.cs
- HostingEnvironmentSection.cs
- ToolStripItemEventArgs.cs
- TablePatternIdentifiers.cs
- AsymmetricAlgorithm.cs
- EntityTemplateFactory.cs
- ReadOnlyTernaryTree.cs
- DrawingCollection.cs
- SlotInfo.cs
- ControlAdapter.cs
- StrokeNodeData.cs
- InlineUIContainer.cs
- XmlSchemaFacet.cs
- CodeExpressionStatement.cs
- ZoneButton.cs
- ReflectEventDescriptor.cs
- HtmlEmptyTagControlBuilder.cs
- ScriptModule.cs
- ADMembershipUser.cs
- ValueQuery.cs
- ToolStripSettings.cs
- PathFigure.cs
- DataColumnMappingCollection.cs
- NegotiationTokenAuthenticatorStateCache.cs
- NavigatingCancelEventArgs.cs
- xdrvalidator.cs
- LinearQuaternionKeyFrame.cs
- TCEAdapterGenerator.cs
- LambdaCompiler.Unary.cs
- ToolStripItem.cs
- ACE.cs
- GeneralTransformGroup.cs
- BaseUriHelper.cs
- CallContext.cs
- ListBoxItem.cs
- ExecutionEngineException.cs
- Rect3DConverter.cs
- CqlParser.cs
- LinkedResource.cs
- IconBitmapDecoder.cs
- GeneralTransform3DTo2D.cs
- EntityDataSourceContextCreatedEventArgs.cs
- TypedElement.cs
- ActivityBindForm.Designer.cs
- AsmxEndpointPickerExtension.cs
- SplitterPanel.cs
- OleServicesContext.cs
- ConnectionManagementSection.cs
- PerformanceCounterManager.cs
- StrongName.cs
- RecordManager.cs
- XhtmlMobileTextWriter.cs
- Matrix3D.cs
- ProfileServiceManager.cs
- EntityTypeBase.cs
- StateInitialization.cs
- ColumnTypeConverter.cs
- DelegateBodyWriter.cs
- DrawingContextDrawingContextWalker.cs
- HotSpotCollectionEditor.cs
- MimeObjectFactory.cs
- MembershipSection.cs
- StickyNoteAnnotations.cs
- _ChunkParse.cs
- DtcInterfaces.cs
- BitmapCodecInfoInternal.cs
- ChannelManagerBase.cs
- WebServiceResponseDesigner.cs
- SecurityAlgorithmSuite.cs
- CopyOfAction.cs
- ValueType.cs
- RectConverter.cs
- MultiPropertyDescriptorGridEntry.cs
- WebHttpBindingElement.cs
- GenerateHelper.cs
- FixedSOMImage.cs
- SiteMapNodeCollection.cs
- OuterGlowBitmapEffect.cs
- GenericEnumConverter.cs
- WebPartEditorApplyVerb.cs
- MembershipPasswordException.cs
- PrintDocument.cs
- SqlCacheDependencyDatabaseCollection.cs
- ClientSponsor.cs
- DrawingContext.cs
- RequestTimeoutManager.cs
- CodeGen.cs
- ProcessStartInfo.cs
- SectionVisual.cs
- QilBinary.cs
- HtmlObjectListAdapter.cs
- CheckedPointers.cs
- GridItem.cs
- BufferedResponseStream.cs