Laden...

SQL Spaltennamen einer bestimmten Tabelle abfragen

Erstellt von Christel vor 7 Jahren Letzter Beitrag vor 7 Jahren 5.288 Views
C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 7 Jahren
SQL Spaltennamen einer bestimmten Tabelle abfragen

verwendetes Datenbanksystem: SQL über MySql.Data

Visual Studio Professional 2012

Hallo,
ich habe eine Datenbank mit vielen Tabellen, die alle gleich aufgebaut sind (6 Spalten).
Ich möchte die Spalten einer speziellen Tabelle abfragen.
Das mache ich ich mit folgendem Befehl:


DataTable tableDescription = this.connection.GetSchema(
                        "Columns",
                        new[] { string.Empty, "`" + this.Database + "`", "`" + tableName + "`" });

Dann iteriere ich durch die Collection tableDescription.Rows, muss aber feststellen, dass diese mehr als 6 Spalten enthält, genauer gesagt ist die Spaltenanzahl ein Vielfaches von 6. Ich vermute, dass GetSchema() auch die Spalten aller Tabellen zurück gibt, deren Name tableName enthält.

Kann das sein?
Wie kann ich es verhindern?

Danke
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo Christel,

hast dus mal so probiert?

var allColumns = con.GetSchema("Columns", new[] { "DBName", null, "TableName" });

aus Get Columns of a Table by GetSchema() method

Ah, seh gerade, dass das Problem ja mehr der Abgleich des Namens ist (Contains/Equals)...Ich lass meine Antwort mal stehen, eventeuell hilft sie ja.

Was spricht dagegen alle Columns zu holen und erst danach nach Tablename zu filtern?

Gruss

Coffeebean

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 7 Jahren

hast dus mal so probiert?

var allColumns = con.GetSchema("Columns", new[] { "DBName", null, "TableName" });  

Das funktioniert. Darf ich trotzdem fragen, was an der Ursprungsvariante falsch war?
Ich habe den Code so von einem Kollegen übernommen und bin jetzt auf Fehlersuche.

Was spricht dagegen alle Columns zu holen und erst danach nach Tablename zu filtern?

Das wäre meine Notlösung geworden.

Danke
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

1.040 Beiträge seit 2007
vor 7 Jahren

Darf ich trotzdem fragen, was an der Ursprungsvariante falsch war?

Ich bin zwar gerade nicht genau mit den Parametern vertraut, allerdings gibt es einen Unterschied beim Tabellennamen:
"'TableName'" bei dir...
"TableName" bei Coffeebean...

Ist allerdings nur eine Vermutung.

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 7 Jahren

allerdings gibt es einen Unterschied beim Tabellennamen:
"'TableName'" bei dir...
"TableName" bei Coffeebean...

Ist allerdings nur eine Vermutung.

Ich verwende "'TableName'" (mit Hochkommas"), um im Namen Sonderzeichen verwenden zu können. In der Variante, die nun nach Parametertausch funktioniert, verwende ich diese Hochkommas weiterhin. Sie sollten also keinen Einfluss haben.

Trotzdem Danke,
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

16.835 Beiträge seit 2008
vor 7 Jahren

Verwende immer ADO.NET Funktionen, um Spalten- und Tabellennamen oder Parameter sicher zu verwenden.
Für Parameter eben [Artikelserie] SQL: Parameter von Befehlen
Für Tabellen und Spalten SqlCommandBuilder.QuoteIdentifier

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 7 Jahren

Hallo Abt,
super, die Links sind sehr interessant, gerade bzgl. der Hochkommaproblematik und der Sonderzeichen in SQL-Statements.

Ich verstehe allerdings noch nicht, wie ich das auf GetSchema() anwenden kann und warum der Code meines Kollegen nicht funktioniert. Dieses Problem hat nämlich nichts mit Hochkommas zu tun, sondern mit dem String-Array als 2. Parameter in der GetSchema()-Methode.

Danke
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

1.029 Beiträge seit 2010
vor 7 Jahren

Hi,

besteht die Möglichkeit, dass viele Datenbanken mit solchen Tabellennamen existieren?

Folgendem Artikel nach: Schemaeinschränkungen

Hast du bzw der Kollege nämlich den Parameter "Catalog" auf String.Empty gestellt... Praktisch nicht so so geschickt...

LG

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 7 Jahren

Hast du bzw der Kollege nämlich den Parameter "Catalog" auf String.Empty gestellt... Praktisch nicht so so geschickt...
LG

OK, langsam verstehe ich. Das Array ist also nicht nur eine Liste von Einschränkungen, sondern ihre Position im Array ist relevant?

Auf jeden Fall funktioniert es, wenn im 1. Parameter der Datenbankname und im 3. der Tabellenname angegeben wird.

Und nein, die Tabellen mit den angegebenen Namen existieren nur in der einen Datenbank.
Die Tabellen sind momentan nur zu Testzwecken (Sonderzeichen) erstellt und der Name besteht nur aus einem Zeichen (das getestet werden soll). Fragte ich in der Ursprungsimplementation die Spalten der Tabelle "ä" ab, bekam ich automatisch auch die für "á", "à", "â", ...

Aber jetzt funktioniert es ja. Ich wollte nur begreifen, warum.

Ich werde mich noch intensiver mit den Einschränkungen beschaftigen.

Gruß
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

1.040 Beiträge seit 2007
vor 7 Jahren
C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 7 Jahren

Leider ohne Antwort, aber vllt. noch ein Ansatz:

>

Super Artikel, danke.

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

3.825 Beiträge seit 2006
vor 7 Jahren

Eine andere Möglichkeit : Einen DataReader öffnen und irgendwas aus der Tabelle lesen, die Spalten kann man dann wie folgt iterieren :

DbDataReader dr = new DbDataReader();
...
foreach (DataColumn col in dr.Columns)
{
    ...
}

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 7 Jahren

Eine andere Möglichkeit : Einen DataReader öffnen und irgendwas aus der Tabelle lesen, die Spalten kann man dann wie folgt iterieren

Die Iteration durch die Spalten ist mir bekannt und wird so verwendet.

Das Problem ist ja, dass ich nicht nur die Spalten der gewünschten Tabelle, sondern zusätzlich von mehreren anderen bekomme , was dann zu einem Fehlverhalten des Problems führt.

Ich werde mich belesen, wie der DataReader funktioniert und ob er eine Alternative zum GetSchema() darstellt, also zuverlässiger arbeitet.

Danke
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

H
523 Beiträge seit 2008
vor 7 Jahren

Du könntest die Schema-Informationen auch mittels einer SQL-Abfrage direkt aus dem INFORMATION_SCHEMA lesen:


SELECT *
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'datenbankname' AND TABLE_NAME ='tabellenname'; 

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 7 Jahren

Danke, das ist eine gute Idee, das muss ich mal probieren.
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.