2008-12-16 2 views

Répondre

4

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

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. –

+1

Pourquoi ne pas appeler FillSchema()? Ça marche! –

+1

Oui Igor, vous avez raison, désolé ... Voici le lien ... http://msdn.microsoft.com/fr-fr/library/152bda9x.aspx –

1

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.

Linkage

(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à.)

2

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

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 ...

+0

Vous pouvez ajouter ceci comme une question séparée . J'aimerais connaître la réponse. –