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.
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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.
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.
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.
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
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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
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.
Leider ohne Antwort, aber vllt. noch ein Ansatz:
MySQL Forums :: Connector/NET and C#, Mono, .Net :: MySqlConnection.GetSchema for Columns
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
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.
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';
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.