如何使用ado.net查找表的主键列?

时间:2008-12-16 19:13:09

标签: .net ado.net

有可靠的纯.net方式吗?我一直发现的解决方案要么需要猜测,要么他们有一个特定于数据库提供商的解决方案。通常查询一些内部系统表以获取此信息。

5 个答案:

答案 0 :(得分:4)

每个DataTable对象都有一个主键属性,它是一个表示表主键的数据列数组。

例如:

string[] GetPrimaryKeys(SqlConnection connection, string tableName)
{
    using(SqlDataAdapter adapter = new SqlDataAdapter("select * from " + tableName, connection))
    using(DataTable table = new DataTable(tableName))
    {
        return adapter
            .FillSchema(table, SchemaType.Mapped)
            .PrimayKey
            .Select(c => c.ColumnName)
            .ToArray();
    }
}

答案 1 :(得分:2)

唯一的方法[错]正如伊戈尔在评论中提到的,你可以调用FillSchema()这里是一个链接...... FillSchema()

是查询数据库的架构信息,这将取决于数据库供应商......

这是特定于SQL Server的,例如......

select kcu.TABLE_SCHEMA, kcu.TABLE_NAME, 
  kcu.CONSTRAINT_NAME, tc.CONSTRAINT_TYPE, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
  join INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu
    on kcu.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA
   and kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
   and kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA
   and kcu.TABLE_NAME = tc.TABLE_NAME
 where tc.CONSTRAINT_TYPE in ( 'PRIMARY KEY', 'UNIQUE' )
 order by kcu.TABLE_SCHEMA, kcu.TABLE_NAME, 
      tc.CONSTRAINT_TYPE, kcu.CONSTRAINT_NAME, kcu.ORDINAL_POSITION;

答案 2 :(得分:1)

只是为了补充伊戈尔的答案。您实际上不需要查询整个数据子集,只需使用adapter.FillSchema(table,SchemaType.Mapped),然后从数据表中获取主键。

Linkage

(如果你正在使用SQL,你可以从系统视图中获取它们,但我假设你已经知道了。)

答案 3 :(得分:0)

只是标记到此查询。 ADO.Net中是否有一种方法可以从一组表中提取一个通用(即独立于数据库供应商)的模式。我正在考虑的不仅是列名,类型和主键(我知道这很容易获得),还有外键集合。我可以使用sqlserver2005特定逻辑轻松地完成所有这些工作,但是很想看到一个与数据库无关的对象模型方法。

我会看这个空间:)

祝你好运大师......

答案 4 :(得分:0)

有一个库Kailua - The forgotten methods in the ADO.NET API. ,它为前5个供应商提供了这个和其他元数据。此信息是特定于供应商的。