コード例 #1
0
        List <TableIndex> LoadIndices(Table tbl)
        {
            const string sql = @"SELECT DISTINCT OBJECT_SCHEMA_NAME(T.[object_id],DB_ID()) AS [Schema],  
              T.[name] AS [table_name], I.[name] AS [index_name], AC.[name] AS [column_name],  
              I.[type_desc], I.[is_unique], I.[data_space_id], I.[ignore_dup_key], I.[is_primary_key], 
              I.[is_unique_constraint], I.[fill_factor],    I.[is_padded], I.[is_disabled], I.[is_hypothetical], 
              I.[allow_row_locks], I.[allow_page_locks], IC.[is_descending_key], IC.[is_included_column] 
            FROM sys.[tables] AS T  
              INNER JOIN sys.[indexes] I ON T.[object_id] = I.[object_id]  
              INNER JOIN sys.[index_columns] IC ON I.[object_id] = IC.[object_id] 
              INNER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id] AND IC.[column_id] = AC.[column_id] 
            WHERE T.[is_ms_shipped] = 0 AND I.[type_desc] <> 'HEAP' 
            AND I.is_primary_key = 0 AND T.[name] = @tableName and OBJECT_SCHEMA_NAME(T.[object_id],DB_ID()) = @schemaName";

            using (var cmd = this._factory.CreateCommand())
            {
                cmd.Connection  = this._connection;
                cmd.CommandText = sql;

                var p = cmd.CreateParameter();
                p.ParameterName = "@tableName";
                p.Value         = tbl.Name;
                cmd.Parameters.Add(p);

                p = cmd.CreateParameter();
                p.ParameterName = "@schemaName";
                p.Value         = tbl.Schema;
                cmd.Parameters.Add(p);

                var result = new List <TableIndex>();

                using (IDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        string thisTable = rdr["table_name"].ToString();

                        if (tbl.Name.ToLower() == thisTable.ToLower())
                        {
                            var indexName = rdr["index_name"].ToString();
                            if (!result.Exists(i => i.Name == indexName))
                            {
                                TableIndex index = new TableIndex();
                                index.Name         = indexName;
                                index.IsUnique     = rdr.GetBoolean(rdr.GetOrdinal("is_unique"));
                                index.IndexColumns = new List <IndexColumn>();
                                index.IndexColumns.Add(new IndexColumn {
                                    Name = rdr["column_name"].ToString(), IsAsc = !rdr.GetBoolean(rdr.GetOrdinal("is_descending_key"))
                                });
                                result.Add(index);
                            }
                            else
                            {
                                result.Single(i => i.Name == indexName).IndexColumns.Add(new IndexColumn {
                                    Name = rdr["column_name"].ToString(), IsAsc = !rdr.GetBoolean(rdr.GetOrdinal("is_descending_key"))
                                });
                            }
                        }
                    }
                }
                return(result);
            }
        }
コード例 #2
0
        List<TableIndex> LoadIndices(string tableName)
        {
            var result=new List<TableIndex>();
		
            using (var cmd1=this._factory.CreateCommand())
            {			
                cmd1.Connection=this._connection;
                cmd1.CommandText=String.Format(INDEX_SQL,tableName);
                using (IDataReader rdr1=cmd1.ExecuteReader())
                {
                    while(rdr1.Read())
                    {			
                        TableIndex indx=new TableIndex();
                        indx.Name=rdr1["name"].ToString();					
                        indx.SQL=rdr1["sql"].ToString();
                        indx.IndexColumns = new List<IndexColumn>();
                        indx.IsUnique = indx.SQL.ToUpper().Contains("UNIQUE");
                        using (var cmd2=this._factory.CreateCommand())
                        {
                            cmd2.Connection=this._connection;
                            cmd2.CommandText=String.Format(INDEX_INFO_SQL,indx.Name);			            
                            using (IDataReader rdr2=cmd2.ExecuteReader())
                            {
                                while(rdr2.Read())
                                {	IndexColumn col = new IndexColumn();								
                                    col.Name = rdr2["name"].ToString();
                                    indx.IndexColumns.Add(col);
                                }
                            }
                        }
                        result.Add(indx);
                    }
                }
            }
            return result;
        }
コード例 #3
0
        List<TableIndex> LoadIndices(string schemaName, string tableName)
        {
            //var result=new List<TableIndex>();
            var indquery = string.Format(@"
select indlst.relname as indname,indlst.oid as indoid,indlst.indkey as indkey,tbllst.oid as tbloid,tbllst.relname as tblname from (select c.relname,c.oid,i.indkey from pg_index as i 
    inner join pg_class as c on i.indexrelid=c.oid
    inner join pg_namespace as ns on c.relnamespace=ns.oid
    where ns.nspname='{0}' and i.indisprimary = false) as indlst
  inner join (select i.indexrelid,c.oid,c.relname from pg_index as i
    inner join pg_class as c on i.indrelid=c.oid
    where c.relname='{1}'
    ) as tbllst on indlst.oid = tbllst.indexrelid
", schemaName, tableName);
            var colquery = @"
select att.attrelid,att.attname,att.attnum from pg_attribute as att
    where att.attnum>0
";
            using(var indTable = new DataTable())
            using(var colTable = new DataTable())
            {
                using (var indcmd = this._factory.CreateCommand())
                using (var colcmd = this._factory.CreateCommand())
                {
                    indcmd.Connection = this._connection;
                    colcmd.Connection = this._connection;
                    indcmd.CommandText = indquery;
                    colcmd.CommandText = colquery;
                    using (var indadp = this._factory.CreateDataAdapter())
                    using (var coladp = this._factory.CreateDataAdapter())
                    {
                        indadp.SelectCommand = indcmd;
                        coladp.SelectCommand = colcmd;
                        indadp.Fill(indTable);
                        coladp.Fill(colTable);
                    }
                }
                var dic = new List<TableIndex>();
                foreach(DataRow indrow in indTable.Rows)
                {
                    var indname = indrow["indname"].ToString();
                    var indcols = indrow["indkey"].ToString().Split(' ');
                    var idx = new TableIndex();
                    idx.IndexColumns = new List<IndexColumn>();
                    idx.Name = indname;
                    idx.SQL = "";
                    idx.IndexColumns.AddRange(
                        colTable.Rows.Cast<DataRow>()
                        .Where(col => indcols.Any(indcolnum => col["attnum"].ToString() == indcolnum && indrow["tbloid"].ToString() == col["attrelid"].ToString()))
                        .Select(col => new IndexColumn() { IsAsc = true, Name = col["attname"].ToString() }))
                        ;
                    dic.Add(idx);
                }
                return dic;
            }
        }