private ArrayList DiscoverIndexes(SqlEntityElement sqlentity, SqlConnection connection)
        {
            ArrayList list = new ArrayList();

            DataTable table = new DataTable();

            String sql = "declare @objid int \n";

            sql += "set @objid = object_id('" + sqlentity.Name + "') \n";
            sql += "select INDEXPROPERTY(@objid, name, 'IsUnique') IsUnique, INDEXPROPERTY(@objid, name, 'IsClustered') IsClustered, name \n";
            sql += "from sysindexes \n";
            sql += "where id = @objid and indid > 0 and indid < 255 and (status & 64)=0 and name not in (select name from sysobjects) \n";
            sql += "order by indid \n";

            SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);

            adapter.Fill(table);

            foreach (DataRow row in table.Rows)
            {
                IndexElement index = new IndexElement();
                index.Name      = row["NAME"].ToString();
                index.Clustered = !row["IsClustered"].ToString().Equals("0");
                index.Unique    = !row["IsUnique"].ToString().Equals("0");
                index.Columns   = DiscoverIndexColumns(sqlentity, index, connection);
                list.Add(index);
            }

            return(list);
        }
        private ArrayList DiscoverSqlEntities(SqlConnection connection, IParser vd)
        {
            ArrayList list = new ArrayList();

            // Get a list of the entities in the database
            DataTable      table   = new DataTable();
            SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = '" + connection.Database + "'", connection);

            adapter.Fill(table);

            foreach (DataRow row in table.Rows)
            {
                if (row["TABLE_TYPE"].ToString() == "BASE TABLE" && row["TABLE_NAME"].ToString() != "dtproperties")
                {
                    SqlEntityElement sqlentity = new SqlEntityElement();
                    sqlentity.Name        = row["TABLE_NAME"].ToString();
                    sqlentity.View        = "vw" + sqlentity.Name;
                    sqlentity.Columns     = DiscoverColumns(sqlentity, connection);
                    sqlentity.Constraints = DiscoverConstraints(sqlentity, connection);
                    sqlentity.Indexes     = DiscoverIndexes(sqlentity, connection);
                    list.Add(sqlentity);
                }
            }

            return(list);
        }
        private ArrayList DiscoverForeignKeyColumns(SqlEntityElement sqlentity, ConstraintElement constraint, SqlConnection connection)
        {
            ArrayList list = new ArrayList();

            String s = "select 1 ORDINAL_POSITION, c.name COLUMN_NAME, rc.name FOREIGN_COLUMN ";

            s += "from syscolumns c ";
            s += "left join sysreferences r on c.id = r.fkeyid and c.colid=r.fkey1 and r.constid=object_id('" + constraint.Name + "') ";
            s += "left join syscolumns rc on rc.id=r.rkeyid and rc.colid=r.rkey1 ";
            s += "where c.id = object_id('" + sqlentity.Name + "') and r.constid is not null ";

            DataTable table = new DataTable();
            String    sql   = s;

            for (int i = 2; i <= 16; i++)
            {
                sql += " union ";
                sql += s.Replace("1", i.ToString());
            }
            SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);

            adapter.Fill(table);

            foreach (DataRow row in table.Rows)
            {
                ColumnElement column = new ColumnElement();
                column.Name          = row["COLUMN_NAME"].ToString();
                column.ForeignColumn = row["FOREIGN_COLUMN"].ToString();
                list.Add(column);
            }

            return(list);
        }
        private ArrayList DiscoverIndexColumns(SqlEntityElement sqlentity, IndexElement index, SqlConnection connection)
        {
            ArrayList list = new ArrayList();

            DataTable table = new DataTable();

            String sql = "DECLARE @indid smallint, \n";

            sql += "	@indname sysname,  \n";
            sql += "   	@indkey int,  \n";
            sql += "	@name varchar(30) \n";
            sql += " \n";
            sql += "SET NOCOUNT ON \n";
            sql += " \n";
            sql += "set @name='" + sqlentity.Name + "' \n";
            sql += "set @indname='" + index.Name + "' \n";
            sql += " \n";
            sql += "select @indid=indid from sysindexes where id=object_id(@name) and name=@indname \n";
            sql += "   \n";
            sql += "	create table #spindtab \n";
            sql += "	( \n";
            sql += "		TABLE_NAME			sysname	collate database_default NULL, \n";
            sql += "		INDEX_NAME			sysname	collate database_default NULL, \n";
            sql += "		COLUMN_NAME			sysname	collate database_default NULL, \n";
            sql += "		SORT_DIRECTION			varchar(50) NULL, \n";
            sql += "		ORDINAL_POSITION		int \n";
            sql += "	) \n";
            sql += " \n";
            sql += "     SET @indkey = 1 \n";
            sql += "     WHILE @indkey <= 16 and INDEX_COL(@name, @indid, @indkey) is not null \n";
            sql += "      BEGIN \n";
            sql += "	insert into #spindtab(table_name, index_name, column_name, ordinal_position, sort_direction) values(@name, @indname, INDEX_COL(@name, @indid, @indkey), @indkey, case when indexkey_property(object_id(@name), @indid, 1, 'isdescending')=1 then 'DESC' else '' end) \n";
            sql += "        SET @indkey = @indkey + 1 \n";
            sql += "      END \n";
            sql += " \n";
            sql += "select * from #spindtab order by ordinal_position \n";
            sql += " \n";
            sql += "drop table #spindtab \n";
            sql += " \n";
            sql += "SET NOCOUNT OFF \n";

            SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);

            adapter.Fill(table);

            foreach (DataRow row in table.Rows)
            {
                ColumnElement column = new ColumnElement();
                column.Name          = row["COLUMN_NAME"].ToString();
                column.SortDirection = row["SORT_DIRECTION"].ToString();
                list.Add(column);
            }

            return(list);
        }
        private DataTable GetTableColumns(SqlEntityElement sqlentity, SqlConnection connection)
        {
            String sql = "	SELECT	INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, \n";

            sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, \n";
            sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, \n";
            sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.NUMERIC_SCALE, \n";
            sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.NUMERIC_PRECISION, \n";
            sql = sql + " 		systypes.length AS COLUMN_LENGTH, \n";
            sql = sql + " 		syscolumns.iscomputed AS COLUMN_COMPUTED, \n";
            sql = sql + "		'0' IsViewColumn, \n";
            sql = sql + "		coalesce(VC.colid, 1000+ORDINAL_POSITION) COLUMN_ID, \n";
            sql = sql + "		ColumnProperty(OBJECT_ID(INFORMATION_SCHEMA.COLUMNS.TABLE_NAME), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'IsIdentity') AS IsIdentity, \n";
            sql = sql + "		ColumnProperty(OBJECT_ID(INFORMATION_SCHEMA.COLUMNS.TABLE_NAME), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'IsRowGuidCol') AS IsRowGuidCol, \n";
            sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE \n";
            sql = sql + " 	FROM INFORMATION_SCHEMA.COLUMNS \n";
            sql = sql + "  	INNER JOIN systypes ON INFORMATION_SCHEMA.COLUMNS.DATA_TYPE = systypes.name \n";
            sql = sql + "  	INNER JOIN syscolumns ON INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = syscolumns.name  AND syscolumns.id = OBJECT_ID('" + sqlentity.Name + "') \n";
            sql = sql + "	left join syscolumns vc on INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = vc.name AND vc.id = OBJECT_ID('"+ sqlentity.Name + "') \n";
            sql = sql + "  	WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = '" + sqlentity.Name + "' \n";

            // if basing data objects on views, get additional fields found in the corresponding view (by naming convention of vw + tablename) -- should be configuration option
            if (sqlentity.UseViews && sqlentity.View.Length > 1)
            {
                sql = sql + "union \n";
                sql = sql + "	SELECT	INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, \n";
                sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, \n";
                sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, \n";
                sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.NUMERIC_SCALE, \n";
                sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.NUMERIC_PRECISION, \n";
                sql = sql + "  		systypes.length AS COLUMN_LENGTH, \n";
                sql = sql + "  		syscolumns.iscomputed AS COLUMN_COMPUTED, \n";
                sql = sql + " 		'1' IsViewColumn, \n";
                sql = sql + "		ORDINAL_POSITION COLUMN_ID, \n";
                sql = sql + "		ColumnProperty(OBJECT_ID(INFORMATION_SCHEMA.COLUMNS.TABLE_NAME), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'IsIdentity') AS IsIdentity, \n";
                sql = sql + "		ColumnProperty(OBJECT_ID(INFORMATION_SCHEMA.COLUMNS.TABLE_NAME), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'IsRowGuidCol') AS IsRowGuidCol, \n";
                sql = sql + " 		INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE \n";
                sql = sql + " 	FROM INFORMATION_SCHEMA.COLUMNS \n";
                sql = sql + " 	INNER JOIN systypes ON INFORMATION_SCHEMA.COLUMNS.DATA_TYPE = systypes.name \n";
                sql = sql + " 	INNER JOIN syscolumns ON INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = syscolumns.name \n";
                sql = sql + " 	WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = '"+ sqlentity.View + "' AND syscolumns.id = OBJECT_ID('" + sqlentity.View + "') \n";
                sql = sql + " 	and INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME not in (select INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = '"+ sqlentity.Name + "') \n";
            }
            sql = sql + "order by column_id \n";

            // Fill the dataset with the information for the current table
            DataTable      table   = new DataTable();
            SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);

            adapter.Fill(table);
            return(table);
        }
Example #6
0
        private void ShowDatabases(Int32 level, String nodeText, String parentNodeText)
        {
            if (level == 0 || level == 1 || level == 2)
            {
                listView1.Items.Clear();
                listView1.Columns.Clear();
                listView1.Columns.Add("Name", -1, HorizontalAlignment.Left);
                listView1.Columns.Add("Key", -1, HorizontalAlignment.Left);
                listView1.Columns.Add("Directory", -1, HorizontalAlignment.Left);
                listView1.Columns.Add("Gen Insert", -1, HorizontalAlignment.Left);
                listView1.Columns.Add("Gen Update", -1, HorizontalAlignment.Left);
                listView1.Columns.Add("Gen Delete", -1, HorizontalAlignment.Left);
                listView1.Columns.Add("Gen Select", -1, HorizontalAlignment.Left);
                listView1.Columns.Add("Timeout", -1, HorizontalAlignment.Right);

                IList list;
                if (level == 0)
                {
                    list = databases;
                }
                else if (level == 1)
                {
                    list = new ArrayList();
                    list.Add(DatabaseElement.FindByName((ArrayList)databases, nodeText));
                }
                else
                {
                    list = new ArrayList();
                    DatabaseElement  database  = DatabaseElement.FindByName((ArrayList)databases, treeView1.SelectedNode.Parent.Text);
                    SqlEntityElement sqlentity = database.FindSqlEntityByName(nodeText);
                    list.Add(sqlentity);
                }

                foreach (SqlEntityData database in list)
                {
                    //SqlEntityData database = (SqlEntityData)o;
                    ListViewItem lvi = new ListViewItem(database.Name);
                    lvi.SubItems.Add(database.Key);
                    lvi.SubItems.Add(database.SqlScriptDirectory);
                    lvi.SubItems.Add(database.GenerateInsertStoredProcScript.ToString());
                    lvi.SubItems.Add(database.GenerateUpdateStoredProcScript.ToString());
                    lvi.SubItems.Add(database.GenerateDeleteStoredProcScript.ToString());
                    lvi.SubItems.Add(database.GenerateSelectStoredProcScript.ToString());
                    lvi.SubItems.Add(database.CommandTimeout.ToString());
                    listView1.Items.Add(lvi);
                }
            }
        }
        private ArrayList DiscoverConstraints(SqlEntityElement sqlentity, SqlConnection connection)
        {
            ArrayList list = new ArrayList();

            DataTable table = new DataTable();
            String    sql   = "SELECT c.*, coalesce((i.status & 16),0) ClusteredIndex, coalesce(rt.TABLE_NAME,'') ForeignEntity, coalesce(cc.CHECK_CLAUSE, '') CheckClause ";

            sql += "FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS c ";
            sql += "left join sysindexes i on c.CONSTRAINT_NAME=i.name ";
            sql += "left join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS r on c.CONSTRAINT_NAME=r.CONSTRAINT_NAME ";
            sql += "left join INFORMATION_SCHEMA.TABLE_CONSTRAINTS rt on r.UNIQUE_CONSTRAINT_NAME=rt.CONSTRAINT_NAME ";
            sql += "left join INFORMATION_SCHEMA.CHECK_CONSTRAINTS cc on c.CONSTRAINT_NAME=cc.CONSTRAINT_NAME ";
            sql += "where c.table_name='" + sqlentity.Name + "' ";

            SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);

            adapter.Fill(table);

            foreach (DataRow row in table.Rows)
            {
                ConstraintElement constraint = new ConstraintElement();
                constraint.Name      = row["CONSTRAINT_NAME"].ToString();
                constraint.Type      = row["CONSTRAINT_TYPE"].ToString();
                constraint.Clustered = Int32.Parse(row["ClusteredIndex"].ToString()) != 0;
//		constraint.ForeignEntity = row["ForeignEntity"].ToString();
                constraint.CheckClause = row["CheckClause"].ToString();

                if (constraint.Type.ToUpper().Equals("PRIMARY KEY") || constraint.Type.ToUpper().Equals("UNIQUE"))
                {
                    constraint.Columns = DiscoverPrimaryKeyColumns(sqlentity, constraint, connection);
                }
                if (constraint.Type.ToUpper().Equals("FOREIGN KEY"))
                {
                    constraint.Columns = DiscoverForeignKeyColumns(sqlentity, constraint, connection);
                }

                list.Add(constraint);
            }
            return(list);
        }
        private ArrayList DiscoverPrimaryKeyColumns(SqlEntityElement sqlentity, ConstraintElement constraint, SqlConnection connection)
        {
            ArrayList list = new ArrayList();

            DataTable table = new DataTable();
            String    sql   = "SELECT * ";

            sql += "FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  ";
            sql += "where table_name='" + sqlentity.Name + "' and constraint_name='" + constraint.Name + "'  ";
            sql += "order by ORDINAL_POSITION  ";
            SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);

            adapter.Fill(table);

            foreach (DataRow row in table.Rows)
            {
                ColumnElement column = new ColumnElement();
                column.Name = row["COLUMN_NAME"].ToString();
                list.Add(column);
            }

            return(list);
        }
Example #9
0
 private void CreateSqlElementAssociations(ParserValidationDelegate vd)
 {
     // find and assign the foreign entity and EnumElement now that they are parsed
     foreach (DatabaseElement database in databases)
     {
         foreach (SqlEntityElement sqlEntity in database.SqlEntities)
         {
             foreach (ConstraintElement constraint in sqlEntity.Constraints)
             {
                 if (constraint.ForeignEntity.Name.Length > 0)
                 {
                     SqlEntityElement entity = SqlEntityElement.FindByName(DatabaseElement.GetAllSqlEntities(databases), constraint.ForeignEntity.Name);
                     if (entity != null)
                     {
                         constraint.ForeignEntity = (SqlEntityElement)entity.Clone();
                     }
                     else
                     {
                         vd(ParserValidationArgs.NewError("ForeignEntity (" + constraint.ForeignEntity.Name + ") specified in constraint " + constraint.Name + " could not be found as an defined entity"));
                     }
                 }
                 if (constraint.CheckEnum.Name.Length > 0)
                 {
                     EnumElement entity = EnumElement.FindByName(enumtypes as ArrayList, constraint.CheckEnum.Name);
                     if (entity != null)
                     {
                         constraint.CheckEnum = (EnumElement)entity.Clone();
                     }
                     else
                     {
                         vd(ParserValidationArgs.NewError("CheckEnum (" + constraint.CheckEnum.Name + ") specified in constraint " + constraint.Name + " could not be found as an defined entity"));
                     }
                 }
             }
         }
     }
 }
        private ArrayList DiscoverColumns(SqlEntityElement sqlentity, SqlConnection connection)
        {
            ArrayList list = new ArrayList();

            DataTable columns = GetTableColumns(sqlentity, connection);

            foreach (DataRow row in columns.Rows)
            {
                if (row["COLUMN_COMPUTED"].ToString() == "0")
                {
                    ColumnElement column = new ColumnElement();
                    column.Name = row["COLUMN_NAME"].ToString();

                    column.SqlType.Name = row["DATA_TYPE"].ToString();
                    // if the sql type is defined, default to all values defined in it
                    if (sqltypes.ContainsKey(column.SqlType.Name))
                    {
                        column.SqlType = (SqlTypeElement)((SqlTypeElement)sqltypes[column.SqlType.Name]).Clone();
                    }
                    else
                    {
                        WriteToLog("SqlType " + column.SqlType.Name + " was not defined");
                    }

                    column.SqlType.Length = row["CHARACTER_MAXIMUM_LENGTH"].ToString().Length > 0 ? (Int32)row["CHARACTER_MAXIMUM_LENGTH"] : (Int32)(Int16)row["COLUMN_LENGTH"];
                    if (!System.DBNull.Value.Equals(row["NUMERIC_PRECISION"]))
                    {
                        column.SqlType.Precision = (Int32)(Byte)row["NUMERIC_PRECISION"];
                    }
                    if (!System.DBNull.Value.Equals(row["NUMERIC_SCALE"]))
                    {
                        column.SqlType.Scale = (Int32)row["NUMERIC_SCALE"];
                    }
                    column.Identity   = row["IsIdentity"].ToString() == "1";
                    column.RowGuidCol = row["IsRowGuidCol"].ToString() == "1";
                    column.ViewColumn = row["IsViewColumn"].ToString() == "1";
                    column.Required   = row["IS_NULLABLE"].ToString().Trim().ToUpper().Equals("NO");

                    // Check for unicode columns
                    if (column.SqlType.Name.ToLower() == "nchar" || column.SqlType.Name.ToLower() == "nvarchar" || column.SqlType.Name.ToLower() == "ntext")
                    {
                        column.SqlType.Length = column.SqlType.Length / 2;
                    }

                    // Check for text or ntext columns, which require a different length from what SQL Server reports
                    if (column.SqlType.Name.ToLower() == "text")
                    {
                        column.SqlType.Length = 2147483647;
                    }
                    else if (column.SqlType.Name.ToLower() == "ntext")
                    {
                        column.SqlType.Length = 1073741823;
                    }

                    // Append the array to the array list
                    list.Add(column);
                }
            }

            return(list);
        }