Пример #1
0
        private IList <ITableSourceForeignKeyInfo> GetForeignKeysInfo(DB2LUWTableSourceInfo tableSource)
        {
            IList <ITableSourceForeignKeyInfo> foreignKeys = new List <ITableSourceForeignKeyInfo>();

            string query = "SELECT FKS.*, RCS.DELETE_RULE AS CASCADE "
                           + "FROM SYSIBM.SQLFOREIGNKEYS FKS "
                           + "LEFT JOIN SYSIBM.REFERENTIAL_CONSTRAINTS RCS ON RCS.CONSTRAINT_NAME = FKS.FK_NAME "
                           + "WHERE FKTABLE_SCHEM = '" + tableSource.Database.Identifier + "' "
                           + "and FKTABLE_NAME = '" + tableSource.Name + "'"
                           + "and CONSTRAINT_SCHEMA = '" + tableSource.Database.Identifier + "'";

            using (IDbConnection conn = DatabaseServices.TransactionService.CreateConnection()) {
                IDbCommand cmd = DatabaseServices.ExecutionService.CreateCommand(conn, query);
                cmd.CommandTimeout = QueryTimeout;
                using (IDataReader reader = cmd.ExecuteReader()) {
                    while (reader.Read())
                    {
                        string                     foreignKeyName               = (string)reader["FK_NAME"];
                        string                     columnName                   = (string)reader["FKCOLUMN_NAME"];
                        string                     referencedSchemaName         = (string)reader["PKTABLE_SCHEM"];
                        string                     referencedTableName          = (string)reader["PKTABLE_NAME"];
                        string                     referencedColumnName         = (string)reader["PKCOLUMN_NAME"];
                        bool                       isCascadeDelete              = "CASCADE".EqualsIgnoreCase((string)reader["CASCADE"]);
                        string                     qualifiedReferencedTableName = GetQualifiedIdentifier(referencedSchemaName, referencedTableName);
                        var                        a = tableSource.Database;
                        ITableSourceInfo           referencedTableSource = new DB2LUWTableSourceInfo(DatabaseServices, tableSource.Database, referencedTableName, qualifiedReferencedTableName);
                        ITableSourceForeignKeyInfo foreignKeyInfo        = new DB2LUWTableSourceForeignKeyInfo(tableSource, foreignKeyName, columnName, referencedTableSource, referencedColumnName, isCascadeDelete);
                        foreignKeys.Add(foreignKeyInfo);
                    }
                }
                return(foreignKeys);
            }
        }
Пример #2
0
        private IList <ITableSourceColumnInfo> GetColumnsInfo(DB2LUWTableSourceInfo tableSource)
        {
            IList <ITableSourceColumnInfo> columnsInfo = new List <ITableSourceColumnInfo>();

            using (IDbConnection conn = DatabaseServices.TransactionService.CreateConnection()) {
                string query = @"SELECT COLS.*, PKS.PK_NAME, cast(CHK.TEXT as varchar(2000)) as CHECK_CLAUSE, UDTS.ORDERING_ROUT_NAME  
				FROM SYSCAT.COLUMNS COLS 
				INNER JOIN SYSCAT.TABLES TAB ON TAB.TABNAME = COLS.TABNAME AND TAB.TABSCHEMA = COLS.TABSCHEMA               
				LEFT JOIN SYSIBM.SQLPRIMARYKEYS  PKS ON PKS.COLUMN_NAME = COLS.COLNAME AND PKS.TABLE_NAME = COLS.TABNAME AND PKS.TABLE_SCHEM = COLS.TABSCHEMA 
				LEFT JOIN SYSCAT.TABDEP DEP ON DEP.TABSCHEMA = TAB.TABSCHEMA and DEP.TABNAME = TAB.TABNAME 
				LEFT JOIN SYSCAT.COLCHECKS COL_CHK 
					ON (TAB.TYPE = 'T' and COL_CHK.TABNAME = TAB.TABNAME and COL_CHK.TABSCHEMA = TAB.TABSCHEMA and COLS.COLNAME = COL_CHK.COLNAME)
					OR (TAB.TYPE in ('V', 'L') and COL_CHK.TABNAME = DEP.BNAME and COL_CHK.TABSCHEMA = TAB.TABSCHEMA and COLS.COLNAME = COL_CHK.COLNAME )
                LEFT JOIN SYSCAT.CHECKS CHK on COL_CHK.constname = CHK.constname and COL_CHK.tabschema = CHK.tabschema and COL_CHK.tabname = CHK.tabname
				LEFT JOIN SYSIBM.UDT_S UDTS ON UDTS.UDT_NAME = COLS.TYPENAME 
				WHERE COLS.TABNAME = '"                 + tableSource.Name + "' and TAB.TABSCHEMA = '" + tableSource.Database.Identifier + "'";


                IDbCommand cmd = DatabaseServices.ExecutionService.CreateCommand(conn, query);
                cmd.CommandTimeout = QueryTimeout;

                using (IDataReader reader = cmd.ExecuteReader()) {
                    int primaryKeyColumnCount = 0;
                    while (reader.Read())
                    {
                        string columnName = (string)reader["COLNAME"];

                        IDataTypeInfo datatype = CreateDataTypeInfo(reader["TYPENAME"] == DBNull.Value ? null : (string)reader["TYPENAME"],
                                                                    reader["LENGTH"] == DBNull.Value ? 0 : Convert.ToInt32(reader["LENGTH"]),
                                                                    reader["LENGTH"] == DBNull.Value ? 0 : Convert.ToInt32(reader["LENGTH"]),
                                                                    reader["SCALE"] == DBNull.Value ? 0 : Convert.ToInt32(reader["SCALE"]),
                                                                    reader["CHECK_CLAUSE"] == DBNull.Value ? null : (string)reader["CHECK_CLAUSE"],
                                                                    reader["ORDERING_ROUT_NAME"] == DBNull.Value ? null : (string)reader["ORDERING_ROUT_NAME"],
                                                                    reader["CODEPAGE"] == DBNull.Value ? 0 : Convert.ToInt32(reader["CODEPAGE"]));

                        bool isMandatory     = "N".EqualsIgnoreCase((string)reader["NULLS"]);
                        bool isPrimaryKey    = (reader["PK_NAME"] != DBNull.Value);
                        bool isAutoGenerated = "Y".EqualsIgnoreCase((string)reader["IDENTITY"]);

                        DB2LUWTableSourceColumnInfo info = new DB2LUWTableSourceColumnInfo(tableSource, columnName, datatype, isMandatory, isPrimaryKey, isAutoGenerated);
                        columnsInfo.Add(info);
                        primaryKeyColumnCount += isPrimaryKey ? 1 : 0;
                    }
                    if (primaryKeyColumnCount > 1)
                    {
                        //we don't support composite primary keys so setting all to non primary key
                        IList <ITableSourceColumnInfo> columnsInfoCopy = new List <ITableSourceColumnInfo>();

                        foreach (ITableSourceColumnInfo c in columnsInfo)
                        {
                            columnsInfoCopy.Add(new DB2LUWTableSourceColumnInfo(c.TableSource, c.Name, c.DataType, c.IsMandatory, false, c.IsAutoGenerated));
                        }
                        columnsInfo = columnsInfoCopy;
                    }
                }
            }
            return(columnsInfo);
        }
Пример #3
0
        private bool CheckTableExists(IDbConnection conn, DB2LUWTableSourceInfo tableSource)
        {
            String query = "SELECT  TABNAME as TABLE_NAME "
                           + "FROM SYSCAT.TABLES "
                           + "WHERE TABNAME = '" + tableSource.Name + "' and TABSCHEMA = '" + tableSource.Database.Identifier + "'";



            IDbCommand cmd = DatabaseServices.ExecutionService.CreateCommand(conn, query);

            cmd.CommandTimeout = QueryTimeout;
            using (IDataReader reader = cmd.ExecuteReader()) {
                return(reader.Read());
            }
        }
Пример #4
0
        public override IEnumerable <ITableSourceColumnInfo> GetTableSourceColumns(ITableSourceInfo tableSource)
        {
            DB2LUWTableSourceInfo tableInfo = tableSource as DB2LUWTableSourceInfo;

            if (tableInfo == null)
            {
                return(null);
            }
            using (IDbConnection conn = DatabaseServices.TransactionService.CreateConnection()) {
                if (!CheckTableExists(conn, tableInfo))
                {
                    throw new IntrospectionServiceException("'" + tableSource.DisplayName + "' is not a valid physical table name.");
                }
            }
            return(GetColumnsInfo(tableInfo));
        }