2009-07-22 7 views
1

J'essaie d'écrire du code générique dans VB.NET qui détermine si une table de base de données SQL Server contient ou non une colonne d'identité et, le cas échéant, de renvoyer le nom de cette colonne.Détermination d'un nom de colonne d'identité SQL Server dans .NET

Je travaille dans Visual Basic 2008 Express et j'ai créé une base de données SQL, "MyDatabase" avec 1 table appelée "MyTable". Dans cette table, j'ai 3 colonnes, "ID", "Column1" et "Column2". Je sais, je sais ... des noms inventifs. Sous Propriétés de la colonne dans l'Explorateur de base de données, j'ai défini la colonne "ID" "Identity Specification" sur "yes" et j'ai défini la valeur "Is Identity" sur "yes".

J'ai besoin que le code .NET retourne "ID" comme colonne d'identité. Cela peut-il être fait par LINQ ou par d'autres moyens?

Merci beaucoup d'avance!

chance

Répondre

2

Si vous avez un LINQ to SQL DataContext, vous pouvez obtenir des métadonnées de table en interrogeant le contexte de données MappingSource:

var ctx = new YourDataContext(); 
var identityAndKey = ctx.Mapping.MappingSource 
           .GetModel(typeof(YourDataContext)) 
           .GetMetaType(typeof(YourTable)) 
           .DataMembers 
           .SingleOrDefault(i => i.IsDbGenerated && 
                 i.IsPrimaryKey); 

Vous obtiendrez une instance MetaDataMember, qui est la propriété clé primaire et DbGenerated (Identité) de votre classe de données. Le nom de la colonne est disponible sur la propriété Name. Avec un peu de réflexion, vous pourriez être en mesure de réutiliser ce code pour n'importe quel contexte table/données.

0

Vous pouvez appeler sp_columns procédure stockée pour obtenir cette information et plus:

SqlConnection sqlConx = new SqlConnection(p_conectionStrWithDB); 
sqlConx.Open(); 
SqlCommand cmd = new SqlCommand("sp_columns", sqlConx); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add(new SqlParameter("@table_name", TableName)); 
DataTable tblColumns = new DataTable(); 
SqlDataAdapter da = new SqlDataAdapter(cmd); 
da.Fill(tblColumns); 

Edit: Vous pouvez également obtenir des informations sur les clés primaires comme ceci:

SqlConnection sqlConx = new SqlConnection(p_conectionStrWithDB); 
sqlConx.Open(); 
SqlCommand cmd = new SqlCommand("sp_pkeys", sqlConx); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add(new SqlParameter("@table_name", tableName)); 
DataTable tblConstraints = new DataTable(); 
SqlDataAdapter da = new SqlDataAdapter(cmd); 
da.Fill(tblConstraints); 
return tblConstraints; 
+0

Merci à tous pour vos réponses. Jonathan - J'ai couru votre code et peux voir beaucoup d'information de colonne comprenant DATA_TYPE, RADIX, NULLABLE, SQL_DATA_TYPE et SS_DATA_TYPE mais je ne vois toujours aucune information sur la clé primaire. S'il vous plaît pardonner cette question qui doit sembler incroyablement simple. Je viens juste de commencer à travailler avec SQL. Merci encore, Chance –

+0

Ce code vous permet de savoir quelle colonne est Identity, vous pouvez lire la colonne "TYPE_NAME" de la datatable. Si le type de colonne est INT et est identité, la colonne contiendra "int Identity". Je vais modifier ma réponse pour ajouter du code sur l'obtention des informations de clé primaire. – Jonathan

+0

Merci beaucoup. C'est exactement ce dont j'avais besoin. Cheers, Chance –

Questions connexes