Y a-t-il un moyen .net pur de le faire de manière fiable? Les solutions que je trouve toujours nécessitent soit de deviner, soit elles ont une solution spécifique à un fournisseur de base de données. Habituellement, interroger une table système interne pour obtenir cette information.Comment puis-je trouver les colonnes de clé primaire d'une table en utilisant ado.net?
Répondre
Chaque objet DataTable possède une propriété PrimaryKey qui est un tableau de DataColumns représentant la clé primaire de la table.
Par exemple:
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();
}
}
Juste pour ajouter à la réponse d'Igor. Vous n'avez pas besoin d'interroger un sous-ensemble entier de données, vous pouvez simplement utiliser adapter.FillSchema (table, SchemaType.Mapped), puis récupérer les clés primaires de la table de données.
(Si vous utilisez SQL cependant, vous pouvez les obtenir du point de vue du système bien, mais je suppose que vous savez déjà.)
La seule façon [mauvaise] Comme Igor mentionné dans un commentaire, vous pouvez appeler FillSchema() Voici un lien ... FillSchema()
est à l'information requête de schéma de la base de données, qui dépendent du fournisseur de base de données ...
Ceci est spécifique à SQL Server, par exemple ...
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;
juste le marquage sur cette requête. est-il possible dans ADO.Net d'obtenir un schéma générique (c'est-à-dire indépendant du fournisseur de base de données) extrait d'une sélection de tables. Je pense non seulement aux noms de colonnes, aux types et aux clés primaires (que je sais assez faciles à obtenir) mais aussi aux collections de clés étrangères. Je peux faire tout cela assez facilement en utilisant la logique spécifique de sqlserver2005, mais j'adorerais voir une approche de modèle d'objet qui agnostique de base de données.
je vais regarder cet espace :)
bons gourous chance ...
Vous pouvez ajouter ceci comme une question séparée . J'aimerais connaître la réponse. –
Il y a une bibliothèque, Kailua - The forgotten methods in the ADO.NET API., qui ne fournit cela et des métadonnées supplémentaires pour les 5 premiers fournisseurs. Cette information est spécifique au fournisseur.
Intéressant, je n'utilise pas de datatable car cela implique des commandes sql mais il me semble que je pourrais créer une datatable pour obtenir les informations de la clé primaire. –
Pourquoi ne pas appeler FillSchema()? Ça marche! –
Oui Igor, vous avez raison, désolé ... Voici le lien ... http://msdn.microsoft.com/fr-fr/library/152bda9x.aspx –