none
<List> -> DataTable -> Listbox RRS feed

  • Frage

  • Hallo Zusammen,

     

    ich stehe vor einem für mich schier unlösbarem Problem. Ich habe eine Tabelle in einer DB wo ich die Spaltennamen auslesen muss.

    Diese Spaltennamen sollen über eine <List> Funktion an eine ListBox weitergegeben werden.  Lt. SQL Management Studio funktioniert meine Abfrage und ich erhalte auch in meiner Schleife die exakte Anzahl an Datensätzen.

     

    Leider scheitere ich momentan daran die Namen der Spalten auch nur Halbwegs in die Listbox zu packen. Es kommt immer nur Quatsch dabei raus. Vielleicht fällt euch ein Fehler auf den ich bislang übersehen habe.

    Vorab hatte ich das Ganze mit OleDB realisiert, aber das läuft nicht mehr seitdem ich mein System neu aufsetzen musste.....

    Hier der Source:

     public static List<string> GetColumns()
        {
          List<String> Columns = new List<String>();
          SqlConnection sqlCon = new SqlConnection();
          sqlCon.ConnectionString = Properties.Settings.Default.strConnectionString;
          //string strSQL = "SELECT table_name = sysobjects.name, column_name=syscolumns.name FROM sysobjects JOIN syscolumns on sysobjects.id = syscolumns.id WHERE SYSOBJECTS.NAME = 'tbl_Zusatzkosten'";
          string strSQL = "SELECT table_name = sysobjects.name, column_name=syscolumns.name FROM sysobjects JOIN syscolumns on sysobjects.id = syscolumns.id WHERE SYSOBJECTS.NAME = 'tbl_Zusatzkosten'";
          SqlCommand cmd = new SqlCommand(strSQL, sqlCon);
          sqlCon.Open();
          SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SchemaOnly);
          DataTable table = dr.GetSchemaTable();
          for (  int col = 0; col <= table.Rows.Count; col++)
          {
            for (int idr = 0; idr <= table.Rows.Count; idr++)
            {
              Columns.Add(table.Columns[1].ToString());
            }
          }
          return Columns; 
    
    

    Und der Aufruf in der ListBox:

     

     foreach (string i in clsGetColumnNames.GetColumns())
          {
            listBox1.Items.Add(i);
          }
    

    Für jeden Ratschlag bin ich euch schonmal sehr dankbar.

     

    Grüße

     

    Dom


    C# und VB.NET sind wie eine Schachtel Pralinen, ich weiß nie was ich bekomme xD
    Samstag, 14. Mai 2011 20:12

Antworten

  • Danke erstmal für die Antworten,

     

    die Abfrage findet in einer gesondeten Klasse statt. Mit einem Array hab ich das noch weniger hinbekommen da ich da mit dem Return probleme bekam und ich beim besten willen nicht wusste wie ich das regeln kann.

     

    Ich versuche mal deinen Source zu implementieren und markiere deinen Beitrag als Antwort wenn es geklpatt hat, sonst melde ich mich nochmal.

     

    Vielen lieben Dank :)

    [Edit]

     

    Denkbar einfach -.-:

     

    public static List<string> GetColumns()
        {
          List<String> Columns = new List<String>();
          SqlConnection sqlCon = new SqlConnection();
          sqlCon.ConnectionString = Properties.Settings.Default.strConnectionString;
          //string strSQL = "SELECT table_name = sysobjects.name, column_name=syscolumns.name FROM sysobjects JOIN syscolumns on sysobjects.id = syscolumns.id WHERE SYSOBJECTS.NAME = 'tbl_Zusatzkosten'";
          string strSQL = "SELECT table_name = sysobjects.name, column_name=syscolumns.name FROM sysobjects JOIN syscolumns on sysobjects.id = syscolumns.id WHERE SYSOBJECTS.NAME = 'tbl_Zusatzkosten'";
          SqlCommand cmd = new SqlCommand(strSQL,sqlCon);
          
          sqlCon.Open();
          SqlDataReader dr = cmd.ExecuteReader();
          while (dr.Read())
          {
            Columns.Add(dr[1].ToString());
            /*DataTable table = new DataTable();
            table.Columns.Add(dr[1].ToString());
            for (int col = 0; col <= table.Rows.Count; col++)
            {
              for (int idr = 0; idr <= table.Rows.Count; idr++)
              {
                
              }
            }*/
          }
    
          
          return Columns; 
    
        }

    Ohne DataTable etc. einfach nur den Reader lesen lassen.

    Dominik


    C# und VB.NET sind wie eine Schachtel Pralinen, ich weiß nie was ich bekomme xD
    • Als Antwort markiert Dom2011 Samstag, 14. Mai 2011 21:08
    Samstag, 14. Mai 2011 20:35

Alle Antworten

  • Hi,

    um die Spaltennamen einer Tabelle zu ermitteln, kannst Du auch einfach das hier nehmen:

    Dim ColumnsTable   As DataTable
    Dim ConnectionString As String = "SERVER=<ServerNameOderIp>;UID=<Username>;PWD=<Passwort>;DATABASE=<Datenbank>"
    Dim Connection    As New SqlConnection( ConnectionString )
      Connection.Open()
    
      ColumnsTable = Connection.GetSchema( "AllColumns", New String() { Nothing, Nothing, "qryTest", Nothing } )
      ...
      ColumnsTable.Dispose()
    
      Connection.Close()
      Connection.Dispose()
    

    bzw. (da ich mal wieder übersehen habe, dass ich im C# Forum bin :):

    DataTable ColumnsTable;
    string ConnectionString = "SERVER=<ServerNameOderIp>;UID=<Username>;PWD=<Passwort>;DATABASE=<Datenbank>";
    SqlConnection Connection = new SqlConnection(ConnectionString);
    
      Connection.Open();
      
      ColumnsTable = Connection.GetSchema( "AllColumns", new string[] { null, null, "qryTest", null } );
      ...
      ColumnsTable.Dispose();
      
      Connection.Close();
      Connection.Dispose();
    
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 14. Mai 2011 20:29
    Moderator
  • Hi,

    Diese Spaltennamen sollen über eine <List> Funktion an eine ListBox weitergegeben werden.

    warum zwingend List<T>?

    Und was kommt bei deiner Variante raus?

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 14. Mai 2011 20:31
    Moderator
  • Danke erstmal für die Antworten,

     

    die Abfrage findet in einer gesondeten Klasse statt. Mit einem Array hab ich das noch weniger hinbekommen da ich da mit dem Return probleme bekam und ich beim besten willen nicht wusste wie ich das regeln kann.

     

    Ich versuche mal deinen Source zu implementieren und markiere deinen Beitrag als Antwort wenn es geklpatt hat, sonst melde ich mich nochmal.

     

    Vielen lieben Dank :)

    [Edit]

     

    Denkbar einfach -.-:

     

    public static List<string> GetColumns()
        {
          List<String> Columns = new List<String>();
          SqlConnection sqlCon = new SqlConnection();
          sqlCon.ConnectionString = Properties.Settings.Default.strConnectionString;
          //string strSQL = "SELECT table_name = sysobjects.name, column_name=syscolumns.name FROM sysobjects JOIN syscolumns on sysobjects.id = syscolumns.id WHERE SYSOBJECTS.NAME = 'tbl_Zusatzkosten'";
          string strSQL = "SELECT table_name = sysobjects.name, column_name=syscolumns.name FROM sysobjects JOIN syscolumns on sysobjects.id = syscolumns.id WHERE SYSOBJECTS.NAME = 'tbl_Zusatzkosten'";
          SqlCommand cmd = new SqlCommand(strSQL,sqlCon);
          
          sqlCon.Open();
          SqlDataReader dr = cmd.ExecuteReader();
          while (dr.Read())
          {
            Columns.Add(dr[1].ToString());
            /*DataTable table = new DataTable();
            table.Columns.Add(dr[1].ToString());
            for (int col = 0; col <= table.Rows.Count; col++)
            {
              for (int idr = 0; idr <= table.Rows.Count; idr++)
              {
                
              }
            }*/
          }
    
          
          return Columns; 
    
        }

    Ohne DataTable etc. einfach nur den Reader lesen lassen.

    Dominik


    C# und VB.NET sind wie eine Schachtel Pralinen, ich weiß nie was ich bekomme xD
    • Als Antwort markiert Dom2011 Samstag, 14. Mai 2011 21:08
    Samstag, 14. Mai 2011 20:35
  • Hallo,

     

    ich bekomm das so nicht "übersetzt". Allerdings müsste es doch eine Möglichkeit geben das entweder in eine List, ein Dictionary oder ein Array zu bekommen!?!?

     

    Ideal wäre ein Array. Aber wie gebe ich dann dort das return aus der Klasse an die Form, respektive an die ListBox?

     

    Grüße,

     

    Dom


    C# und VB.NET sind wie eine Schachtel Pralinen, ich weiß nie was ich bekomme xD
    Samstag, 14. Mai 2011 20:52