2010-11-22 2 views
3

ich ein TreeView-Steuerelement haben (das sollte so aussehen)Wie man ein TreeViewControl mit Hierarchieebene auffüllt?

alt text

Aber ich weiß nicht, wie es mit meiner Anfrage zu füllen:

SELECT T.TableName, C.Column_Name FROM Information_Schema.Tables T 
INNER JOIN Information_Schema.Columns C 
ON T.TableName= C.TableName 
WHERE T.TableName IN('BASE_TABLE', 'BASE TABLE') 
ORDER BY 1, C.Ordinal_Position 

mir jemand bitte helfen kann. ..

Danke.

bearbeiten Dies ist, was ich versucht, aber nur die Tabellennamen ...

private void PopulateTreeView() 
{ 
    SqlCeCommand cmd = new SqlCeCommand(); 
    try 
    { 
     using (SqlCeConnection conn = new SqlCeConnection("Data Source=" + connString)) 
     {    
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"; 
      conn.Open(); 
      cmd.Connection = conn; 
      cmd.ExecuteNonQuery(); 
      // Don't know what's next... 
     } 
    } 
    catch (Exception x) 
    { 
     MessageBox.Show(x.GetBaseException().ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
     cmd.Dispose(); 
    } 
} 
+1

LINQ to SQL? LINQ zu EF? – Ani

+0

@Ani: Ich bin es leid, diese Frage jedes Mal zu stellen. –

+0

@yonan: was hast du bisher probiert? –

Antwort

1

Hier ist eine nicht-LINQ Antwort, die simmilar etwas tut:

using (var conn = new SqlCeConnection(connectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = @" 
SELECT T.TABLE_NAME, C.COLUMN_NAME 
FROM INFORMATION_SCHEMA.TABLES T 
INNER JOIN INFORMATION_SCHEMA.COLUMNS C 
ON T.TABLE_NAME= C.TABLE_NAME 
WHERE T.TABLE_NAME IN('BASE_TABLE', 'BASE TABLE') 
ORDER BY 1, C.ORDINAL_POSITION"; 
    conn.Open(); 
    cmd.Connection = conn; 
    using (var reader = cmd.ExecuteReader()) 
    { 
     string lastTable = null; 
     TreeNode tableNode = null; 
     while (reader.Read()) { 
      if (lastTable != reader.GetString(0)) { 
       lastTable = reader.GetString(0); 
       tableNode = new TreeNode(lastTable); 
       myTree.Nodes.Add(tableNode); 
      } 
      tableNode.ChildNodes.Add(new TreeNode(reader.GetString(1))); 
     } 
    } 
} 
+0

hehe .. Ich habe gerade etwas von Ihrem Code bearbeitet und es funktioniert jetzt. Ich habe den Arbeitscode bereits gepostet und den Titel dieser Frage geändert. Danke sir ... – yonan2236

0

btw, nie MessageBox nie auf einem Server verwenden; p

Der Kern Abfrage LINQ -zu-SQL ist so etwas wie:

using (var ctx = new DataClasses1DataContext()) 
{ 
    string[] names = {"BASE_TABLE", "BASE TABLE"}; 
    var qry = (from table in ctx.Tables 
       where names.Contains(table.TableName) 
       join column in ctx.Columns on table.TableName equals column.TableName 
       orderby table.TableName, column.ColumnName 
       select new { table.TableName, column.ColumnName }).ToList(); 
    foreach (var pair in qry.GroupBy(pair => pair.TableName)) 
    { 
     TreeNode tableNode = new TreeNode(pair.Key); 
     myTree.Nodes.Add(tableNode); 
     foreach (var col in pair) 
     { 
      tableNode.ChildNodes.Add(new TreeNode(col.ColumnName)); 
     } 
    } 
} 

assu ming eine handgefertigte DBML (da die Designer diese Tabellen-Filter), entlang der Linien von:

<?xml version="1.0" encoding="utf-8"?><Database Name="YourDatabase" Class="DataClasses1DataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007"> 
    <Connection Mode="WebSettings" ConnectionString="YourConnectionString" SettingsObjectName="System.Configuration.ConfigurationManager.ConnectionStrings" SettingsPropertyName="YourConnectionStringPropertyName" Provider="System.Data.SqlClient" /> 
    <Table Name="INFORMATION_SCHEMA.TABLES" Member="Tables"> 
    <Type Name="Table"> 
     <Column Name="TABLE_NAME" Member="TableName" Type="System.String" DbType="nvarchar(128) NOT NULL" CanBeNull="false" /> 
    </Type> 
    </Table> 
    <Table Name="INFORMATION_SCHEMA.COLUMNS" Member="Columns"> 
    <Type Name="Column"> 
     <Column Name="TABLE_NAME" Member="TableName" Type="System.String" DbType="nvarchar(128) NOT NULL" CanBeNull="false" /> 
     <Column Name="COLUMN_NAME" Member="ColumnName" Type="System.String" DbType="nvarchar(128) NOT NULL" CanBeNull="false" /> 
     <Column Name="ORDINAL_POSITION" Member="OrdinalPosition" Type="System.Int32" DbType="int NOT NULL" CanBeNull="false" /> 
    </Type> 
    </Table> 
</Database> 
+0

ok danke Sir ... das ist nicht genau das, was ich will, aber ich kann deine Idee verwenden. Ich werde meine Antwort posten, sobald ich es funktioniere ... – yonan2236

0

Dies ist funktionierende Antwort. Ich habe gerade einige Zeilen aus dem Code von Sir Gravell bearbeitet.

private void PopulateTreeView() 
{ 
    treeView1.Nodes.Clear(); 

    using (var conn = new SqlCeConnection("Data Source=" + connString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = @"SELECT T.TABLE_NAME, C.COLUMN_NAME 
          FROM INFORMATION_SCHEMA.TABLES AS T INNER JOIN 
          Information_Schema.Columns AS C ON T.TABLE_NAME = C.TABLE_NAME 
          WHERE T.TABLE_TYPE IN('BASE_TABLE', 'BASE TABLE', 'TABLE') 
          ORDER BY T.TABLE_NAME, C.ORDINAL_POSITION"; 
     conn.Open(); 
     cmd.Connection = conn; 

     using (var reader = cmd.ExecuteReader()) 
     { 
      string lastTable = null; 
      TreeNode tableNode = null; 
      while (reader.Read()) 
      { 
       if (lastTable != reader.GetString(0)) 
       { 
        lastTable = reader.GetString(0); 
        tableNode = new TreeNode(lastTable); 
        treeView1.Nodes.Add(tableNode); 
       } 
       tableNode.Nodes.Add(new TreeNode(reader.GetString(1))); 
      } 
     } 
    } 
} 
+0

Wenn Sie die Sortierreihenfolge entfernt haben, wird dies wahrscheinlich nicht richtig funktionieren. Das 'ORDER BY' ist entscheidend für den Code, den ich gepostet habe. Auch meine Verwendung, wenn Großbuchstaben "INFORMATION_SCHEMA.COLUMNS" war bewusst, wie Datenbanken (und oft sind) in Groß-und Kleinschreibung Modus eingestellt werden können. Falsche Objekt- oder Spaltennamen funktionieren nicht. –

Verwandte Themen