Laden...

Spaltennamen aus SQL Server Datenbank bekommen

Erstellt von Midnight Run vor 14 Jahren Letzter Beitrag vor 14 Jahren 9.310 Views
Midnight Run Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren
Spaltennamen aus SQL Server Datenbank bekommen

Hallo,
ich arbeite zurzeit an meinem ersten Datenbank Projekt. Ich benutzte "SQL Server 2008 Express". Nun möchte ich aber aus meiner DB alle Spaltennamen auslesen, weiss aber leider nuicht wie.

Danke für die Hilfe

3.511 Beiträge seit 2005
vor 14 Jahren

Im SQL Server gibt es pro Datenbank bestimmte "Systemviews". Diese beginnen immer mit INFORMATION_SCHEMA.[Name]. In deinem Falle musst du also das View INFORMATION_SCHEMA.COLUMNS benutzen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Midnight Run Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

Danke erstmal für deine Antwort,
ich habe nun es geschafft ein SQLCommand Objekt einzurichten. Dennoch bekomme ich immer einen Error bei folgenden SQL Befehl :

SELECT * FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = [tabellenName]

ich habe es auch so versucht

SELECT * FROM [tabellenNamen].INFORMATION_SCHEMA.Columns

ich will nicht die komplette DB durchsuchen sonderen nur eine bestimmte Tabelle.

Danke 😄

742 Beiträge seit 2005
vor 14 Jahren

Oder mach einfach ein Select * from myTable where 1=2 und hol dir eine DataTable, da stehen dann auch alle Spaltennamen drin.

T
574 Beiträge seit 2008
vor 14 Jahren

Dennoch bekomme ich immer einen Error bei folgenden SQL Befehl :

SELECT * FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = [tabellenName]

hm, was bekommst du da für einen Fehler?

Wenn du einfach nur die Spaltennamen brauchst würd ich aber auch die Lösung von malignate empfehlen, das ist am einfachsten.

3.511 Beiträge seit 2005
vor 14 Jahren

hm, was bekommst du da für einen Fehler?

Würd mich auch interessieren. Denn ein einfaches


SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Bla'

funktioniert ohne Probleme.

Wenn du einfach nur die Spaltennamen brauchst würd ich aber auch die Lösung von malignate empfehlen, das ist am einfachsten.

Ist aber IMHO gefuscht. Warum nicht das benutzen, was dafür vorgesehen ist?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Midnight Run Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

Hallo Leute,
danke für eure Hilfe.
Mein Code ist zurzeit folgender :


        SqlCommand cmd = new SqlCommand("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =  " + table);
        cmd.Connection = tran.Connection;
        cmd.Transaction = tran;
        try
        {
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                string bla = "";
                while (reader.Read())
                {
                    bla += reader.GetString(0);
                }
            }
            
            
        }
        catch (Exception e)
        {
            string exception = e.ToString();
            
        }

Die Exception lautet : Ungültiger Spaltenname [table], da ist nur ne kleiner Fehler drin, aber ich habe noch kaum Erfahrung C# SQL Anweisungen durchzuführen 😄

Danke

3.511 Beiträge seit 2005
vor 14 Jahren

Schau dir mal bitte [Artikelserie] Parameter von SQL Befehlen an. SQL Commands bitte nicht mit Stringverkettung zusammenfügen. Denn dann tritt unter anderen genau der Fehler auf, den du gerade hast.

Dein Fehler liegt allerdings daran, das du den Tabellennamen nicht in Hochkommas schreibst ('Tabelle'). Aber darum brauchst du dich nicht zu kümmern, wie du dem Artikel entnehmen wirst.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

J
3.331 Beiträge seit 2006
vor 14 Jahren

Der Vollständigkeit halber möchte ich noch auf [FAQ] Tabellen- und Spalteninformationen aus dem SQL Server auslesen verweisen.

Siehe auch Wie poste ich richtig? 1.1 Erst suchen, vor allem in den FAQ

Die Exception lautet : Ungültiger Spaltenname [table], da ist nur ne kleiner Fehler drin,...

In allen Beispielen wird der Tabellenname in Hochkommata gesetzt; dies ist wichtig, weil es sich um einen String handelt, und bei dir fehlt es. Damit das nicht zu einem Problem führt, solltest du Khalids Hinweis mit den Parametern unbedingt beachten.

aber ich habe noch kaum Erfahrung C# SQL Anweisungen durchzuführen

Deshalb verweise ich auch auf [FAQ] SQL - Kurze Befehlzusammenfassung

Jürgen

1.564 Beiträge seit 2007
vor 14 Jahren

Hallo Midnight Run

Ich empfehle dir die GetSchema Methode der Connection zu verwenden:

         using (SqlConnection cn = new SqlConnection(@"Server=.\Sql2k8;Database=SqlServerNet;Integrated Security=sspi;"))
         {
            cn.Open();

            string tableName = "TestData100K";

            DataTable schema = cn.GetSchema("COLUMNS", new string[] { null, null, tableName });

            Console.BufferWidth = 450;
            foreach (DataColumn col in schema.Columns)
            {
               Console.Write("{0}\t", col.ColumnName);
            }
            Console.WriteLine();
            Console.WriteLine(new string('=', 450));

            foreach (DataRow row in schema.Rows)
            {
               foreach (DataColumn col in schema.Columns)
               {
                  Console.Write("{0}\t", row[col]);
               }
               Console.WriteLine();
            }
         }

         Console.WriteLine();
         Console.ReadKey();

Weitere Informationen zu den verfügbaren Schemata findest du hier:
SQL Server Schema Collections

Informationen zu den Restriktionen findest du hier:
Schema Restrictions (ADO.NET)

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

Midnight Run Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

Danke,
es klappt auch nun. Leider bekomme ich aber komplett falsche Werte :S


        //TODO SQL PROZEDUR
        //Haben alle FK KEY Tabellen Einträge
        int count = 1;
        SqlTransaction tran = this.BeginTransaction(this.OpenConnection());
        //SqlConnection con
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT * FROM Information_Schema.Columns WHERE table_name = '" + table + "'";
        cmd.Connection = tran.Connection;
        cmd.Transaction = tran;
        try
        {
            List<string> columnNames = new List<string>();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while(reader.Read())
                    columnNames.Add(reader.GetString(0));
            }

            columnNames = columnNames;
        }

Das ist was ich zurzeit habe. In columNames möchte ich eben alle Spaltennamen habe, dort steht aber immer nur der Name der Datenbank drin. Was mache ich falsch ?

mfg

T
574 Beiträge seit 2008
vor 14 Jahren

Wenn du das so machst würd ichs mal mit reader.GetString(3) probieren.

Du fragst nämlich sonst immer nur auf die erste Spalte ab und holst damit immer nur den DB namen.

Oder:

du machst "SELECT Column_Name FROM .."

und bleibst bei GetString(0)

Midnight Run Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

Wenn du das so machst würd ichs mal mit reader.GetString(3) probieren.

Du fragst nämlich sonst immer nur auf die erste Spalte ab und holst damit immer nur den DB namen.

Oder:

du machst "SELECT Column_Name FROM .."

und bleibst bei GetString(0)

Der Herr dankt, es funktionioert 😄