6 Stimmen

Wie kann ich die Primärschlüsselspalten einer Tabelle mit ado.net finden?

Gibt es eine reine .net-Lösung, um dies zuverlässig zu tun? Die Lösungen, die ich finde, erfordern entweder Vermutungen oder sie haben eine Lösung, die spezifisch für einen Datenbankanbieter ist. In der Regel wird eine interne Systemtabelle abgefragt, um diese Informationen zu erhalten.

5voto

Igor Zelaya Punkte 4107

Jedes DataTable-Objekt hat eine PrimaryKey-Eigenschaft, die ein Array von DataColumns ist, die den Primärschlüssel der Tabelle darstellen.

Zum Beispiel:

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

3voto

Charles Bretana Punkte 137391

Der einzige Weg [falsch] Wie Igor in Kommentar erwähnt, können Sie FillSchema() aufrufen Hier ist ein Link... FillSchema()

ist die Abfrage der Schemainformationen der Datenbank, die vom Datenbankanbieter abhängt...

Dies ist zum Beispiel SQL Server-spezifisch...

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;

1voto

BFree Punkte 100035

Um die Antwort von Igor zu ergänzen. Sie müssen nicht wirklich eine ganze Teilmenge von Daten abfragen, Sie können einfach adapter.FillSchema(table, SchemaType.Mapped) verwenden und dann den/die Primärschlüssel aus der Datentabelle erhalten.

Linkage

(Wenn Sie allerdings SQL verwenden, können Sie sie über die Systemansicht abrufen, aber ich gehe davon aus, dass Sie das bereits wissen).

0voto

Nur Tagging auf diese Abfrage. gibt es eine Möglichkeit in ADO.Net ein generisches (d.h. Datenbank-Anbieter unabhängig) Schema aus einer Auswahl von Tabellen extrahiert zu erhalten. ich denke entlang der Linien von nicht nur Spaltennamen, Typen und Primärschlüssel (die ich weiß, ist ziemlich einfach zu bekommen), sondern auch die Fremdschlüssel Sammlungen. ich kann alle dieses Zeug ziemlich leicht mit sqlserver2005 spezifische Logik tun, aber würde gerne ein Objektmodell Ansatz zu sehen, die Datenbank agnostisch war.

Ich werde diesen Bereich im Auge behalten :)

Viel Glück, Gurus...

0voto

David Thielen Punkte 24913

Es gibt eine Bibliothek, Kailua - Die vergessenen Methoden in der ADO.NET-API. die diese und weitere Metadaten für die 5 wichtigsten Anbieter enthält. Diese Informationen sind anbieterspezifisch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X