2008-12-16 42 views
4

有没有一种纯粹的.net方法可靠地做到这一点?我一直在寻找的解决方案需要猜测,或者他们有专门针对数据库提供商的解决方案。通常查询一些内部系统表来获取这些信息。如何使用ado.net查找表的主键列?

回答

4

每个DataTable对象都有一个PrimaryKey属性,这是一个DataColumns数组,代表表的主键。

例如:

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(); 
    } 
} 
+0

有趣的是,我没有使用数据表,因为这涉及到sql命令,但它确实看起来像我可以创建一个数据表来获取主键信息。 – 2008-12-16 19:24:22

+1

如何调用FillSchema()?这样可行! – 2008-12-16 19:33:46

1

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

Linkage

(如果你使用SQL虽然,你可以从系统的角度让他们虽然,但我假设你已经知道了。)

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; 
0

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

我都会看着这个空间:)

好运大师......