2009-07-22 9 views
1

Ich versuche, in VB.NET einen generischen Code zu schreiben, der bestimmt, ob eine SQL Server-Datenbanktabelle eine Identitätsspalte enthält oder nicht. Wenn ja, muss der Name zurückgegeben werden diese Spalte.Ermitteln eines SQL Server-Identitätsspaltennamens in .NET

Ich arbeite in Visual Basic 2008 Express und habe eine SQL-Datenbank "MyDatabase" mit 1 Tabelle namens "MyTable" erstellt. Innerhalb dieser Tabelle habe ich 3 Spalten, "ID", "Column1" und "Column2". Ich weiß, ich weiß ... erfinderische Namen. Unter Spalteneigenschaften im Datenbank-Explorer habe ich die "ID" -Spalte "Identity Specification" auf "yes" gesetzt und den Wert "Is Identity" auf "yes" gesetzt.

Ich brauche für den .NET-Code, um "ID" als Identitätsspalte zurückzugeben. Kann dies durch LINQ oder andere Mittel geschehen?

Vielen Dank im Voraus!

Luck

Antwort

3

Verwenden SQLDataReader MyTable öffnen (SELECT-ID aus myTable wobei 1 = 2) & Verwendung GetSchemaTable Verfahren, mit dem Sie die Datentabelle geben.

Überprüfen Sie anhand der Dokumentation, ob der Inhalt einer Spalte namens IsAutoIncrement vorhanden ist. Wenn es wahr zurückgibt, sollte es eine Identität Spalte sein.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx

Hinweis: Diese rein basiert auf meinem Gedächtnis & Hilfe der MSDN-Dokumentation.

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

Sie erhalten eine MetaDataMember Instanz, die die Primärschlüssel und DbGenerated (Identity) Eigenschaft:

2

Wenn Sie eine Linq to SQL Datacontext haben, können Sie die Metadaten der Tabelle durch die Abfrage des Datenkontext MappingSource erhalten Ihrer Datenklasse. Der Spaltenname ist unter der Name-Eigenschaft verfügbar.

Mit ein wenig Nachdenken können Sie diesen Code für jeden Tabellen-/Datenkontext wiederverwenden.

0

Sie könnten sp_columns gespeicherte Prozedur aufrufen Diese und weitere Informationen zu erhalten:

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

bearbeiten: Sie können auch Informationen über primäre Schlüssel wie folgt erhalten:

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

Danke allen für Ihre Antworten. Jonathan - Ich habe Ihren Code ausgeführt und kann viele Spalteninformationen wie DATA_TYPE, RADIX, NULLABLE, SQL_DATA_TYPE und SS_DATA_TYPE sehen, aber ich sehe immer noch keine Informationen über den Primärschlüssel. Bitte verzeihen Sie diese Frage, die unglaublich einfach scheinen muss. Ich habe gerade erst angefangen mit SQL zu arbeiten. Nochmals vielen Dank, Luck –

+0

Mit diesem Code können Sie wissen, welche Spalte Identität ist, können Sie die Spalte "TYPE_NAME" der Datentabelle lesen. Wenn der Spaltentyp INT ist und Identität ist, enthält die Spalte "int Identity". Ich bearbeite meine Antwort, um Code zum Erhalten von Primärschlüsselinformationen hinzuzufügen. – Jonathan

+0

Vielen Dank. Genau das habe ich gebraucht. Prost, Glück –

Verwandte Themen