我准备实现这样一个功能。不知道有什么办法没有。listboxA中显示数据库所有的表,
利用一个button的click事件,找出listboxA中被选中的表的所有有关系的表,并将结果显示在listboxB中。例:数据库中有表1,表2,表3,表4,表5
-表1的外键指向 -〉表2
-表3的外键指向 -〉表1
-表5的外键指向 -〉表4
如果选择了表2,存在关系的所有表就是表1,表2,表3 
如果选择了表4,存在关系的所有表就是表5--------------
不知道这种针对已存在的表的表之间关系的判断,或者查找的方法有没有?我考虑了一个非常笨的方法,利用
SqlConnection.GetSchema("ForeignKeys",res);
找出他们的外键关系,例如"FK_表1_表2",然后用字符串读取查找有没有关联表,可这样表的数目增多的话,查找起来就太麻烦了。感觉不可行,不知道还有什么好的实现方法?希望大家提供意见

解决方案 »

  1.   

    原来做过一个。呵呵。看看下面代码 ,是不是能实现你要的效果。
     public class KeyOperation
        {
            public static void GetPK(Service user, Table table)
            {
                string sql = string.Format("exec sp_pKeys '{0}'", table.Name);
                SqlConnection conn = DBHelper.GetConnection(user);
                using (conn)
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    try
                    {
                        conn.Open();
                    }
                    catch (SqlException)
                    {
                        return;
                    }
                    using (DataTable dt = DBHelper.GetDataSet(sql, conn))
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            foreach (Column column in table.Columns.Values)
                            {
                                if (row["COLUMN_NAME"].ToString() == column.Name)
                                {
                                    column.DBtype = DataBaseObjectType.PrimaryKey;
                                    column.PK_Name = row["PK_NAME"].ToString();
                                }
                            }
                        }
                    }
                    conn.Dispose();
                }        }
            public static List<ForeignKey> GetFK(Service user, string tableName)
            {
                List<ForeignKey> keys = new List<ForeignKey>();
                string sql = string.Format("exec sp_fKeys '{0}'", tableName);
                SqlConnection conn = DBHelper.GetConnection(user);
                using (conn)
                {
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    try
                    {
                        conn.Open();
                    }
                    catch (SqlException)
                    {
                        return null;
                    }
                    using (DataTable dt = DBHelper.GetDataSet(sql, conn))
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            ForeignKey fkey = new ForeignKey();
                            fkey.Name = row["FKCOLUMN_NAME"].ToString();
                            fkey.TableName = row["FKTABLE_NAME"].ToString();
                            fkey.FK_Name = row["FK_NAME"].ToString();
                            fkey.PrimaryType = row["PKTABLE_NAME"].ToString();
                            fkey.PrimaryKey = row["PKCOLUMN_NAME"].ToString();
                            keys.Add(fkey);
                        }
                    }
                    conn.Dispose();
                }
                return keys;
            }    }