/// <summary>
        /// Executes the select.
        /// </summary>
        /// <param name="connection">The connection.</param>
        /// <param name="text">The text.</param>
        /// <returns></returns>
        public static Table executeSelect(SqlConnection connection, String text)
        {
            SqlCommand myCommand = new SqlCommand(text, connection);

            Table table = new Table();

            SqlDataReader myReader = null;

            try
            {
                myReader = myCommand.ExecuteReader();

                Boolean fieldsDone = false;

                while (myReader.Read())
                {
                    Row row = new Row();

                    for (int i = 0; i < myReader.FieldCount; i++)
                    {
                        if (fieldsDone == false)
                        {
                            TableField f = new TableField();
                            f.Name = myReader.GetName(i);
                            table.FieldCont.Fields.Add(f);
                        }

                        Value val = new Value();

                        val.Type = myReader.GetDataTypeName(i);

                        if (myReader.IsDBNull(i))
                        {
                            val.Data = "NULL";
                        }
                        else if (val.Type == "bit")
                        {
                            /*
                             * Byte [] buf = new Byte [2];
                             * myReader.GetBytes(i, 0, buf, 0, 1);
                             * val.Data = buf.ToString();
                             */
                            val.Data = myReader.GetBoolean(i).ToString();
                        }
                        else if (val.Type == "tinyint")
                        {
                            val.Data = myReader.GetByte(i).ToString();
                        }
                        else if (val.Type == "smallint")
                        {
                            val.Data = myReader.GetInt16(i).ToString();
                        }
                        else if (val.Type == "int")
                        {
                            val.Data = myReader.GetInt32(i).ToString();
                        }
                        else if (val.Type == "bigint")
                        {
                            val.Data = myReader.GetInt64(i).ToString();
                        }
                        else if (val.Type == "float")
                        {
                            val.Data = myReader.GetDouble(i).ToString();
                        }
                        else if (val.Type == "decimal")
                        {
                            val.Data = myReader.GetDecimal(i).ToString();
                        }
                        else if (val.Type == "numeric")
                        {
                            val.Data = myReader.GetDouble(i).ToString();
                        }
                        else if (val.Type == "text" || val.Type == "char" || val.Type == "varchar")
                        {
                            val.Data = myReader.GetString(i);
                        }
                        else if (val.Type == "ntext" || val.Type == "nchar" || val.Type == "nvarchar")
                        {
                            val.Data = myReader.GetString(i);
                        }
                        else if (val.Type == "datetime")
                        {
                            val.Data = myReader.GetDateTime(i).ToString();
                        }
                        else
                        {
                            val.Data = String.Empty;
                        }

                        row.Values.Add(val);
                    }

                    table.Rows.Add(row);

                    fieldsDone = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (myReader != null)
                {
                    myReader.Close();
                }
            }

            return(table);
        }
Esempio n. 2
0
        /// <summary>
        /// Gets the table data.
        /// </summary>
        /// <param name="Target">The target.</param>
        public void GetTableData(Table Target, Configuration config)
        {
            SqlConnection myConnection = Connection.connect();

            if (myConnection == null)
            {
                return;
            }

            Target.FieldCont      = new TableFieldContainer(Target);
            Target.DataCont       = new DataContainer(Target);
            Target.ConstraintCont = new ConstraintContainer(Target);

            Table TableList = ConnectionAdapter.executeSelect
                              (
                myConnection,
                String.Format
                (
                    "SELECT name, object_id, parent_object_id FROM sys.objects WHERE type_desc='USER_TABLE' and name='{0}'",
                    Target.Name
                )
                              );

            String table_name       = TableList.Rows[0].Values[0].Data;
            String object_id        = TableList.Rows[0].Values[1].Data;
            String parent_object_id = TableList.Rows[0].Values[2].Data;

            String query = String.Format
                           (
                "SELECT sys.columns.name, sys.types.name, sys.columns.max_length, sys.columns.is_nullable, sys.columns.is_identity " +
                "FROM sys.columns " +
                "INNER JOIN sys.types " +
                "ON sys.columns.system_type_id=sys.types.system_type_id " +
                "AND sys.columns.user_type_id=sys.types.user_type_id " +
                "WHERE sys.columns.object_id='{0}'",
                object_id
                           );

            Table ColumnList = ConnectionAdapter.executeSelect(myConnection, query);

            foreach (Row col in ColumnList.Rows)
            {
                String type     = col.Values[1].Data;
                String num      = col.Values[2].Data;
                String nullable = col.Values[3].Data;
                String identity = col.Values[4].Data;

                if (IsTextType(type) == true && num != String.Empty && num != "NULL")
                {
                    type += "(" + num + ")";
                }

                TableField f = new TableField(col.Values[0].Data, type, nullable.ToLower() == "true" ? true : false, identity.ToLower() == "true" ? true : false);
                f.Parent = Target;

                Target.FieldCont.Fields.Add(f);
            }

            //----------------------------------------------------------------
            // Handle constraints

            query = String.Format("SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME='{0}'", table_name);

            Table ConstraintList = ConnectionAdapter.executeSelect(myConnection, query);

            foreach (Row current_row in ConstraintList.Rows)
            {
                Constraint NewConstraint = new Constraint();

                NewConstraint.Name   = current_row.Values[0].Data;
                NewConstraint.Type   = Constraint.SQLConstraintTypeToConstraintType(current_row.Values[1].Data);
                NewConstraint.Parent = Target;

                if (NewConstraint.Type == Constraint.ConstraintType.Check)
                {
                    query = String.Format("SELECT CHECK_CLAUSE FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS WHERE CONSTRAINT_NAME='{0}'", NewConstraint.Name);

                    Table ConstraintText = ConnectionAdapter.executeSelect(myConnection, query);

                    if (ConstraintText.Rows.Count > 0)
                    {
                        NewConstraint.Text = ConstraintText.Rows[0].Values[0].Data;
                    }
                }
                else if (NewConstraint.Type == Constraint.ConstraintType.ForeignKey)
                {
                    query = String.Format
                            (
                        "SELECT " +
                        "CONSTRAINT_NAME = REF_CONST.CONSTRAINT_NAME, " +
                        "TABLE_NAME = FK.TABLE_NAME, " +
                        "COLUMN_NAME = FK_COLS.COLUMN_NAME, " +
                        "REFERENCED_TABLE_NAME = PK.TABLE_NAME, " +
                        "REFERENCED_COLUMN_NAME = PK_COLS.COLUMN_NAME " +
                        "FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS REF_CONST " +
                        "INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK " +
                        "ON REF_CONST.CONSTRAINT_CATALOG = FK.CONSTRAINT_CATALOG " +
                        "AND REF_CONST.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA " +
                        "AND REF_CONST.CONSTRAINT_NAME = FK.CONSTRAINT_NAME " +
                        "AND FK.CONSTRAINT_TYPE = 'FOREIGN KEY' " +
                        "INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON REF_CONST.UNIQUE_CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG " +
                        "AND REF_CONST.UNIQUE_CONSTRAINT_SCHEMA = PK.CONSTRAINT_SCHEMA " +
                        "AND REF_CONST.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME " +
                        "AND PK.CONSTRAINT_TYPE = 'PRIMARY KEY' " +
                        "INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE FK_COLS ON REF_CONST.CONSTRAINT_NAME = FK_COLS.CONSTRAINT_NAME " +
                        "INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PK_COLS ON PK.CONSTRAINT_NAME = PK_COLS.CONSTRAINT_NAME " +
                        "WHERE REF_CONST.CONSTRAINT_NAME = '{0}'",
                        NewConstraint.Name
                            );

                    Table ConstraintText = ConnectionAdapter.executeSelect(myConnection, query);

                    if (ConstraintText != null && ConstraintText.Rows.Count > 0)
                    {
                        NewConstraint.ReferencedTable = ConstraintText.Rows[0].Values[3].Data;
                        NewConstraint.ReferencedFieldNames.Add(ConstraintText.Rows[0].Values[4].Data);
                    }
                }

                query = String.Format
                        (
                    "SELECT COLUMN_NAME " +
                    "FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE " +
                    "WHERE TABLE_NAME='{0}' AND CONSTRAINT_NAME='{1}'",
                    table_name,
                    NewConstraint.Name
                        );

                Table ConstraintRows = ConnectionAdapter.executeSelect(myConnection, query);

                foreach (Row rw in ConstraintRows.Rows)
                {
                    NewConstraint.FieldNames.Add(rw.Values[0].Data);
                }

                Target.ConstraintCont.Constraints.Add(NewConstraint);
            }

            // Handle data

            if (config.AnalyzeData)
            {
                Target.DataCont = new DataContainer(Target);
            }

            myConnection.Close();
        }