/// <inheritdoc />
        public IEnumerable <IDbViewFieldEntity> GetFields(IDbViewEntity view)
        {
            ISqlObject     owner       = new SqlServerSource("INFORMATION_SCHEMA");
            ISqlExpression tableName   = new SqlServerConstantExpressionFactory().Create(view.Name);
            ISqlExpression tableSchema = new SqlServerConstantExpressionFactory().Create(view.Schema);
            ISqlObject     columnsView = new SqlServerSource(owner, "COLUMNS");

            ISqlObject nameField       = new SqlServerField(columnsView, "COLUMN_NAME", "Name");
            ISqlObject indexField      = new SqlServerField(columnsView, "ORDINAL_POSITION", "Index");
            ISqlObject typeField       = new SqlServerField(columnsView, "DATA_TYPE", "TypeName");
            ISqlObject maxLengthField  = new SqlServerField(columnsView, "CHARACTER_MAXIMUM_LENGTH", "MaxLength");
            ISqlObject isNullableField = new SqlServerField(columnsView, "IS_NULLABLE", "IsNullable");

            ISqlSelectStatement statement = new SqlServerSelectStatement();

            statement.SelectClause.AddExpressions(nameField, indexField, typeField, maxLengthField, isNullableField);
            statement.FromClause.SetSource(columnsView);
            statement.WhereClause.Condition = new SqlServerField(columnsView, "TABLE_NAME", null).Equal(tableName).And(new SqlServerField(columnsView, "TABLE_SCHEMA", null).Equal(tableSchema));
            statement.OrderClause.AddExpression(indexField, SqlOrder.Asc);

            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();

            builder.DataSource     = view.Database.Source.Name;
            builder.InitialCatalog = view.Database.Name;
            if (!(builder.IntegratedSecurity = view.Database.Source.DbCredential.IntegratedSecurity))
            {
                builder.UserID   = view.Database.Source.DbCredential.UserName;
                builder.Password = view.Database.Source.DbCredential.Password;
            }

            ICollection <IDbViewFieldEntity> fields       = new List <IDbViewFieldEntity>();
            IList <ISqlExpression>           selectFields = new List <ISqlExpression>(statement.SelectClause.Expressions);

            using (IDataReader reader = SqlHelper.ExecuteSelect(new SqlConnection(builder.ConnectionString), statement)) {
                while (reader.Read())
                {
                    fields.Add(new DbViewFieldEntity(reader.GetString(selectFields.IndexOf(nameField)),
                                                     reader.GetInt32(selectFields.IndexOf(indexField)),
                                                     SqlServerUtility.GetRuntimeType(reader.GetString(selectFields.IndexOf(typeField))),
                                                     SqlServerUtility.GetDbType(reader.GetString(selectFields.IndexOf(typeField))),
                                                     (int)SqlServerUtility.GetSqlDbType(reader.GetString(selectFields.IndexOf(typeField))),
                                                     reader.GetString(selectFields.IndexOf(typeField)),
                                                     reader.IsDBNull(selectFields.IndexOf(maxLengthField)) ? 0 : reader.GetInt32(selectFields.IndexOf(maxLengthField)),
                                                     reader.GetString(selectFields.IndexOf(isNullableField)).Equals("YES", StringComparison.OrdinalIgnoreCase),
                                                     view,
                                                     null,
                                                     null));
                }
            }

            return(fields);
        }
Esempio n. 2
0
        public void GenerateEntityCodeTest_View()
        {
            IDbViewEntity view = (from v in new DbDatabaseEntity(new DbSourceEntity(this.m_dataSource, null, new SqlServerDatabaseEntityProvider()), "Xphter.Framework.Test", new SqlServerDataEntityProvider()).Views
                                  where v.Name.Equals("viewGeneration0", StringComparison.OrdinalIgnoreCase)
                                  select v).FirstOrDefault();

            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
            DbCodeGenerator target   = new DbCodeGenerator(new SqlServerCodeProvider(), null, provider);
            CodeCompileUnit unit     = target.GenerateCompileUnit();

            target.GenerateEntityCode(target.GenerateNamespace(unit, this.m_entityNamespaceName), view);

            CodeGeneratorOptions options = new CodeGeneratorOptions();

            options.BlankLinesBetweenMembers = true;
            options.BracingStyle             = "Block";
            options.ElseOnClosing            = true;
            options.IndentString             = "  ";
            options.VerbatimOrder            = true;
            using (TextWriter writer = new StreamWriter(string.Format("{0}.{1}", target.GetEntityCodeFilename(view), provider.FileExtension), false, Encoding.UTF8)) {
                provider.GenerateCodeFromCompileUnit(unit, writer, options);
            }
        }