2010-11-22 10 views
3

私はTreeViewControlに階層レベルを設定する方法は?

alt text

(それは次のようになります)のTreeViewコントロールを持っているしかし、私は私のクエリを移入する方法がわからない:

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 

誰も私を助けてくださいことができます。 ..

ありがとう。

編集 これは私が試したものですが、ちょうどテーブル名...ところで

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 to EF? – Ani

+0

@Ani:毎回その質問に疲れています。 –

+0

@yonan:これまでに何を試しましたか? –

答えて

1

はここsimmilar何かを非LINQの答えです:

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 ..あなたのコードの一部を編集したばかりで、それは今働いています。私はすでに作業コードを掲示し、この質問のタイトルを変更しました。ありがとうございました... – yonan2236

0

、サーバー上MessageBoxを使用することはありませんでし; P

LINQを使用してコアクエリ-to-SQLは、次のようなものです。

assu線に沿って明手作り DBML(設計者がこれらのテーブルをフィルタリングするので)、:

<?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ありがとうございました...これは私が欲しいものではありませんが、私はあなたの考えを使用することができます。私はそれが働くとすぐに私の答えを投稿します... – yonan2236

0

これは、働く答え。 Gravell氏のコードからいくつかの行を編集しました。

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

ソート順を削除した場合、これは正しく動作しません。 'ORDER BY 'は私が投稿したコードにとって非常に重要です。大文字と小文字を区別したモードでデータベースを設定することができます(そしてしばしば設定される)ので、大文字の 'INFORMATION_SCHEMA.COLUMNS'を意図的に使用しています。誤って入力されたオブジェクト名または列名は機能しません。 –

関連する問題