Example #1
0
        public static IEnumerable <ForeignKey> GetForeignKeys(Table table, IfxConnection cn)
        {
            var fkqis = new List <ForeignKeyQueryInfo>();

            cn.Open();

            var command = cn.CreateCommand();

            command.CommandType = CommandType.Text;
            command.CommandText = "select st.tabid from 'informix'.systables st where st.tabname = ?";
            command.Parameters.Add("st.tabname", table.ActualName);
            int?tabid = null;

            try {
                tabid = command.ExecuteScalar() as int?;
            }
            catch (Exception) {
            }

            if (tabid.HasValue)
            {
                command.CommandText = @"
                    select
                    si.part1,  si.part2,  si.part3,  si.part4,
                    si.part5,  si.part6,  si.part7,  si.part8,
                    si.part9,  si.part10, si.part11, si.part12,
                    si.part13, si.part14, si.part15, si.part16, 
                    trim(st.tabname) as fktabname,
                    si.tabid as fktabid,
                    trim(rt.tabname) as pktabname,
                    rc.tabid as pktabid,
                    sr.primary as pkconstraintid
                    from
                    'informix'.systables st,
                    'informix'.sysconstraints sc,
                    'informix'.sysindexes si,
                    'informix'.sysreferences sr,
                    'informix'.systables rt,
                    'informix'.sysconstraints rc
                    where
                    st.tabid = ?
                    and st.tabid = sc.tabid
                    and sc.constrtype = 'R'
                    and sc.constrid = sr.constrid
                    and sc.tabid = si.tabid
                    and sc.idxname = si.idxname
                    and rt.tabid = sr.ptabid
                    and rc.tabid = sr.ptabid
                    and sr.primary = rc.constrid";
                command.Parameters.Clear();
                command.Parameters.Add("st.tabid", tabid);

                using (var reader = command.ExecuteReader()) {
                    for (; reader.Read();)
                    {
                        var fkqi = new ForeignKeyQueryInfo();
                        fkqi.FKTabName      = reader["fktabname"] as string;
                        fkqi.FKTabId        = Convert.ToInt32(reader["fktabid"]);
                        fkqi.PKTabName      = reader["pktabname"] as string;
                        fkqi.PKTabId        = Convert.ToInt32(reader["pktabid"]);
                        fkqi.PKConstraintId = Convert.ToInt32(reader["pkconstraintid"]);
                        for (int i = 0; i < 16; i++)
                        {
                            int part = Convert.ToInt32(reader.GetValue(i));
                            if (part == 0)
                            {
                                break;
                            }
                            fkqi.FKParts.Add(part);
                        }
                        fkqis.Add(fkqi);
                    }
                }

                command.CommandText = @"
                    select
                    part1,  part2,  part3,  part4,
                    part5,  part6,  part7,  part8,
                    part9,  part10, part11, part12,
                    part13, part14, part15, part16
                    from
                    'informix'.sysindexes si,
                    'informix'.sysconstraints sc
                    where
                    si.tabid = sc.tabid
                    and si.idxname = sc.idxname
                    and sc.constrid = ?";
                command.Parameters.Clear();
                command.Parameters.Add("sc.constrid", null);

                foreach (var fkqi in fkqis)
                {
                    command.Parameters["sc.constrid"].Value = fkqi.PKConstraintId;
                    using (var reader = command.ExecuteReader()) {
                        for (; reader.Read();)
                        {
                            for (int i = 0; i < 16; i++)
                            {
                                int part = Convert.ToInt32(reader.GetValue(i));
                                if (part == 0)
                                {
                                    break;
                                }
                                fkqi.PKParts.Add(part);
                            }
                        }
                    }
                }

                command.CommandText = "select trim(sc.colname) from 'informix'.syscolumns sc where sc.tabid = ? and sc.colno = ?";
                command.Parameters.Clear();
                command.Parameters.Add("sc.tabid", null);
                command.Parameters.Add("sc.colno", null);

                foreach (var fkqi in fkqis)
                {
                    command.Parameters["sc.tabid"].Value = fkqi.FKTabId;
                    foreach (int part in fkqi.FKParts)
                    {
                        command.Parameters["sc.colno"].Value = part;
                        string columnName = command.ExecuteScalar() as string;
                        fkqi.FKColumnNames.Add(columnName);
                    }

                    command.Parameters["sc.tabid"].Value = fkqi.PKTabId;
                    foreach (int part in fkqi.PKParts)
                    {
                        command.Parameters["sc.colno"].Value = part;
                        string columnName = command.ExecuteScalar() as string;
                        fkqi.PKColumnNames.Add(columnName);
                    }
                }
            }

            var results =
                from fkqi in fkqis
                select new ForeignKey(
                    detailTable: new ObjectName(null, fkqi.FKTabName),
                    columns: fkqi.FKColumnNames,
                    masterTable: new ObjectName(null, fkqi.PKTabName),
                    masterColumns: fkqi.PKColumnNames);

            return(results.ToArray());
        }
        public static IEnumerable<ForeignKey> GetForeignKeys(Table table, IfxConnection cn)
        {
            var fkqis = new List<ForeignKeyQueryInfo>();

            cn.Open();

            var command = cn.CreateCommand();
            command.CommandType = CommandType.Text;
            command.CommandText = "select st.tabid from 'informix'.systables st where st.tabname = ?";
            command.Parameters.Add("st.tabname", table.ActualName);
            int? tabid = null;
            try {
                tabid = command.ExecuteScalar() as int?;
            }
            catch (Exception) {
            }

            if (tabid.HasValue) {

                command.CommandText = @"
                    select
                    si.part1,  si.part2,  si.part3,  si.part4,
                    si.part5,  si.part6,  si.part7,  si.part8,
                    si.part9,  si.part10, si.part11, si.part12,
                    si.part13, si.part14, si.part15, si.part16, 
                    trim(st.tabname) as fktabname,
                    si.tabid as fktabid,
                    trim(rt.tabname) as pktabname,
                    rc.tabid as pktabid,
                    sr.primary as pkconstraintid
                    from
                    'informix'.systables st,
                    'informix'.sysconstraints sc,
                    'informix'.sysindexes si,
                    'informix'.sysreferences sr,
                    'informix'.systables rt,
                    'informix'.sysconstraints rc
                    where
                    st.tabid = ?
                    and st.tabid = sc.tabid
                    and sc.constrtype = 'R'
                    and sc.constrid = sr.constrid
                    and sc.tabid = si.tabid
                    and sc.idxname = si.idxname
                    and rt.tabid = sr.ptabid
                    and rc.tabid = sr.ptabid
                    and sr.primary = rc.constrid";
                command.Parameters.Clear();
                command.Parameters.Add("st.tabid", tabid);

                using (var reader = command.ExecuteReader()) {
                    for (; reader.Read(); ) {
                        var fkqi = new ForeignKeyQueryInfo();
                        fkqi.FKTabName = reader["fktabname"] as string;
                        fkqi.FKTabId = Convert.ToInt32(reader["fktabid"]);
                        fkqi.PKTabName = reader["pktabname"] as string;
                        fkqi.PKTabId = Convert.ToInt32(reader["pktabid"]);
                        fkqi.PKConstraintId = Convert.ToInt32(reader["pkconstraintid"]);
                        for (int i = 0; i < 16; i++) {
                            int part = Convert.ToInt32(reader.GetValue(i));
                            if (part == 0) break;
                            fkqi.FKParts.Add(part);
                        }
                        fkqis.Add(fkqi);
                    }
                }

                command.CommandText = @"
                    select
                    part1,  part2,  part3,  part4,
                    part5,  part6,  part7,  part8,
                    part9,  part10, part11, part12,
                    part13, part14, part15, part16
                    from
                    'informix'.sysindexes si,
                    'informix'.sysconstraints sc
                    where
                    si.tabid = sc.tabid
                    and si.idxname = sc.idxname
                    and sc.constrid = ?";
                command.Parameters.Clear();
                command.Parameters.Add("sc.constrid", null);

                foreach (var fkqi in fkqis) {
                    command.Parameters["sc.constrid"].Value = fkqi.PKConstraintId;
                    using (var reader = command.ExecuteReader()) {
                        for (; reader.Read(); ) {
                            for (int i = 0; i < 16; i++) {
                                int part = Convert.ToInt32(reader.GetValue(i));
                                if (part == 0) break;
                                fkqi.PKParts.Add(part);
                            }
                        }
                    }
                }

                command.CommandText = "select trim(sc.colname) from 'informix'.syscolumns sc where sc.tabid = ? and sc.colno = ?";
                command.Parameters.Clear();
                command.Parameters.Add("sc.tabid", null);
                command.Parameters.Add("sc.colno", null);

                foreach (var fkqi in fkqis) {

                    command.Parameters["sc.tabid"].Value = fkqi.FKTabId;
                    foreach (int part in fkqi.FKParts) {
                        command.Parameters["sc.colno"].Value = part;
                        string columnName = command.ExecuteScalar() as string;
                        fkqi.FKColumnNames.Add(columnName);
                    }

                    command.Parameters["sc.tabid"].Value = fkqi.PKTabId;
                    foreach (int part in fkqi.PKParts) {
                        command.Parameters["sc.colno"].Value = part;
                        string columnName = command.ExecuteScalar() as string;
                        fkqi.PKColumnNames.Add(columnName);
                    }
                }
            }

            var results =
                from fkqi in fkqis
                select new ForeignKey(
                    detailTable: new ObjectName(null, fkqi.FKTabName),
                    columns: fkqi.FKColumnNames,
                    masterTable: new ObjectName(null, fkqi.PKTabName),
                    masterColumns: fkqi.PKColumnNames);

            return results.ToArray();
        }