有可靠的纯.net方式吗?我一直发现的解决方案要么需要猜测,要么他们有一个特定于数据库提供商的解决方案。通常查询一些内部系统表以获取此信息。
答案 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),然后从数据表中获取主键。
(如果你正在使用SQL,你可以从系统视图中获取它们,但我假设你已经知道了。)
答案 3 :(得分:0)
只是标记到此查询。 ADO.Net中是否有一种方法可以从一组表中提取一个通用(即独立于数据库供应商)的模式。我正在考虑的不仅是列名,类型和主键(我知道这很容易获得),还有外键集合。我可以使用sqlserver2005特定逻辑轻松地完成所有这些工作,但是很想看到一个与数据库无关的对象模型方法。
我会看这个空间:)
祝你好运大师......答案 4 :(得分:0)
有一个库Kailua - The forgotten methods in the ADO.NET API. ,它为前5个供应商提供了这个和其他元数据。此信息是特定于供应商的。