2011-05-25 60 views
0

处理C#asp.net vs2008。与读者 = Command.ExecuteReader(CommandBehavior.KeyInfo)我试图获得外键,有没有办法得到它? 如果我写ado.net CommandBehavior.KeyInfo/getSchema方法

 string sql = string.Format("Select * from {0}", tableName); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand(sql, conn); 
    cmd.CommandType = CommandType.Text; 
    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.KeyInfo); 

    DataTable schema = reader.GetSchemaTable(); 

然后在isKey = true设置为初级key.I想外键从这个command.Is有什么办法得到它。 如有任何查询请询问。预先感谢。

回答

0

如果您有管理特权。你可以从下面的查询中得到结果。

SELECT 
K_Table = FK.TABLE_NAME, 
FK_Column = CU.COLUMN_NAME, 
PK_Table = PK.TABLE_NAME, 
PK_Column = PT.COLUMN_NAME, 
Constraint_Name = C.CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN (
SELECT i1.TABLE_NAME, i2.COLUMN_NAME 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
) PT ON PT.TABLE_NAME = PK.TABLE_NAME 
Where FK.TABLE_NAME = YourtableName 

您可以在代码中使用下面的代码背后

System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Connection String"); 
      con.Open(); 

      string str = "SELECT "; 
      str+= " K_Table = FK.TABLE_NAME,"; 
      str+= " FK_Column = CU.COLUMN_NAME,"; 
      str+= " PK_Table = PK.TABLE_NAME,"; 
      str+= " PK_Column = PT.COLUMN_NAME,"; 
      str+= " Constraint_Name = C.CONSTRAINT_NAME"; 
      str+= " FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C"; 
      str+= " INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME"; 
      str+= " INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME"; 

      str+= " INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME"; 
      str+= " INNER JOIN ("; 
      str+= " SELECT i1.TABLE_NAME, i2.COLUMN_NAME"; 
      str+= " FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1"; 
      str+= " INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME"; 
      str+= " WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'"; 
      str+= ") PT ON PT.TABLE_NAME = PK.TABLE_NAME"; 
      str+= " Where FK.TABLE_NAME = 'f'"; 

      System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(str, con); 
      System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader(); 
      if (dr.Read()) 
      { 

      } 
0

ADO.NET当前不从数据源返回外键信息。 CommandBehavior.KeyInfo仅引用主键信息。

http://support.microsoft.com/kb/310107

使用该::

**选择

fk.CONSTRAINT_NAME,fk.UNIQUE_CONSTRAINT_NAME,CN .TABLE_NAME,cn.COLUMN_NAME

from

个INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS为Fk

加入INFORMATION_SCHEMA.TABLE_CONSTRAINTS作为PK

pk.CONSTRAINT_NAME = fk.UNIQUE_CONSTRAINT_NAME

上cn.CONSTRAINT_NAME加入INFORMATION_SCHEMA.KEY_COLUMN_USAGE作为CN

= fk.CONSTRAINT_NAME

where cn.TABLE_NA ME ='tablename'**