SQL Schema

 internal class SqlSchema
    {
        private string SqlForGetStoreProcedures = "select distinct(name) from sysobjects where type='p' ";
        public string SqlForGetViews = "select distinct(name) from sysobjects where type='v' ";
        private Database.DatabaseType type;
        public bool GetSchema(Database database)
        {
            bool flag;
            using (new SqlConnection())
            {
                try
                {
                    this.type = database.Type;
                    DBHelper helper = new DBHelper(DBHelper.DatabaseTypes.Sql, database.ConnectionString);
                    DataSet ds = helper.ExecuteQuery(CommandType.Text, this.SqlForGetTable, null);
                    database.Tables = this.GetSQLTableList(ds);
                    ds = helper.ExecuteQuery(CommandType.Text, this.SqlForGetViews, null);
                    database.Views = this.GetSQLViewList(ds);
                    ds = helper.ExecuteQuery(CommandType.Text, this.SqlForGetStoreProcedures, null);
                    database.StoreProcedures = this.GetSQLStoreProcedureList(ds);
                    flag = true;
                }
                catch
                {
                    flag = false;
                }
            }
            return flag;
        }
        private Field GetSQLField(DataRow r)
        {
            Field field = new Field();
            field.AllowNull = ObjectHelper.GetBool(r["AllowNull"]);
            field.DefaultValue = ObjectHelper.GetString(r["DefaultValue"]);
            field.FieldDescn = ObjectHelper.GetString(r["FieldDescn"]);
            field.FieldLength = ObjectHelper.GetInt(r["FieldLength"]);
            field.FieldName = ObjectHelper.GetString(r["FieldName"]);
            field.FieldNumber = ObjectHelper.GetInt(r["FieldNumber"]);
            field.FieldSize = ObjectHelper.GetInt(r["FieldSize"]);
            field.SqlTypeString = ObjectHelper.GetString(r["FieldType"]);
            field.IsIdentifier = ObjectHelper.GetBool(r["IsIdentifier"]);
            field.IsKeyField = ObjectHelper.GetBool(r["IsKeyField"]);
            field.TableName = ObjectHelper.GetString(r["TableName"]);
            return field;
        }
        private List<string> GetSQLStoreProcedureList(DataSet ds)
        {
            List<string> list = new List<string>();
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                list.Add(row[0].ToString());
            }
            return list;
        }
        private List<Table> GetSQLTableList(DataSet ds)
        {
            DataTable table = ds.Tables[0];
            List<Table> list = new List<Table>();
            foreach (DataRow row in table.Rows)
            {
                Field sQLField = this.GetSQLField(row);
                bool flag = false;
                foreach (Table table2 in list)
                {
                    if (sQLField.TableName == table2.Fields[0].TableName)
                    {
                        table2.Fields.Add(sQLField);
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    Table table3 = new Table();
                    table3.Name = sQLField.TableName;
                    List<Field> list2 = new List<Field>();
                    list2.Add(sQLField);
                    table3.Fields = list2;
                    list.Add(table3);
                }
            }
            return list;
        }
        private List<string> GetSQLViewList(DataSet ds)
        {
            List<string> list = new List<string>();
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                list.Add(row[0].ToString());
            }
            return list;
        }
        private string SqlForGetTable
        {
            get
            {
                StringBuilder builder = new StringBuilder();
                builder.Append("SELECT d.name N'TableName',a.colorder N'FieldNumber',a.name N'FieldName', ");
                builder.Append("(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '1'else '0' end) N'IsIdentifier',");
                builder.Append("(case when (SELECT count(*) ");
                builder.Append(" FROM sysobjects WHERE (name in (SELECT name FROM sysindexes ");
                builder.Append(" WHERE (id = a.id) AND (indid in (SELECT indid FROM sysindexkeys");
                builder.Append(" WHERE (id = a.id) AND (colid in (SELECT colid FROM syscolumns");
                builder.Append(" WHERE (id = a.id) AND (name = a.name))))))) AND (xtype = 'PK'))>0 ");
                builder.Append(" then '1' else '0' end) N'IsKeyField', b.name N'FieldType',a.length N'FieldSize', ");
                builder.Append(" COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'FieldLength', ");
                builder.Append(" isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'DecimalDigits', ");
                builder.Append(" (case when a.isnullable=1 then '1'else '0' end) N'AllowNull', isnull(e.text,'') N'DefaultValue', ");
                builder.Append(" isnull(g.[value],'') AS N'FieldDescn' ");
                builder.Append(" FROM syscolumns a left join systypes b on a.xtype=b.xusertype inner join sysobjects d ");
                builder.Append(" on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' left join syscomments e on a.cdefault=e.id ");
                if (this.type == Database.DatabaseType.Sql2005)
                {
                    builder.Append(" left join sys.extended_properties g on a.id=g.major_id AND a.colid = g.minor_id order by object_name(a.id),a.colorder");
                }
                else
                {
                    builder.Append(" left join sysproperties g on a.id=g.id AND a.colid = g.smallid order by object_name(a.id),a.colorder ");
                }
                return builder.ToString();
            }
        }
    }

转载于:https://www.cnblogs.com/TNTZWC/archive/2011/05/22/2053242.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server中,Schema是用来组织和管理数据库对象的命名空间。它可以被用来将不同的数据库对象逻辑上分组,并提供了更好的安全性和权限控制。Schema可以包含表、视图、存储过程、函数等对象。 在给定的引用内容中,引用是一个SQL查询语句,用于查找名为"TableA"的表所属的Schema。引用是另一个SQL查询语句,用于获取Schema的名称和拥有者。而引用是一个回答,解释了为什么在SQL Server中,默认的Schema是当前登录用户的default schema。 所以,SQL Server的Schema是用来组织和管理数据库对象的命名空间的概念。它可以帮助我们更好地组织和管理数据库对象,并提供更好的安全性和权限控制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SQL Server: 数据库模式SCHEMA](https://blog.csdn.net/Henry_Wu001/article/details/128048439)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [SQL SERVER 2005中的Schema详解](https://blog.csdn.net/weixin_33989780/article/details/94711962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值