2014-02-07 118 views
2

我可以在列表框中找到并显示所有表的所有名称。从C#中,如何查找SQL Server中表的列名称?

但我需要通过单击按钮来显示列表框中选定表的列名称。

我的功能:在按键

public void GetTableNames() 
{ 
    string strConnect = "Data Source=;Initial Catalog=DATA;User ID=sa;Password=***"; 
    using (SqlConnection con = new SqlConnection(strConnect)) 
    { 
     con.Open(); 

     using (SqlCommand com = new SqlCommand(@"SELECT * FROM INFORMATION_SCHEMA.TABLES 
               WHERE TABLE_TYPE='BASE TABLE' 
               ORDER BY TABLE_NAME ASC ", con)) 
     { 
      using (SqlDataReader reader = com.ExecuteReader()) 
      { 
       listBox2.Items.Clear(); 
       int counter = 0; 
       while (reader.Read()) 
       { 
        counter++; 
        listBox2.Items.Add((string)reader["TABLE_NAME"]); 
       } 

       lblTablesCount.Text = counter.ToString(); 
      } 
     } 
    } 
} 

呼叫功能

private void button1_Click(object sender, EventArgs e)  
{ 
    GetTableNames(); 
} 

我的问题:给定一个选择的表,我怎么能找到该表的列的名称?用户从列表框中选取表格并单击一个按钮。

+0

['INFORMATION_SCHEMA.COLUMNS'](http://technet.microsoft.com/en-us/library/ms188348.aspx)也许?或者['sys.objects'](http://technet.microsoft.com/en-us/library/ms190324.aspx)。 –

+0

'select column_name from information_schema.columns' 'where table_name = @ TableName' 'order by ordinal_position' – CJBS

回答

1

您还需要提供数据库名称+架构的名称+表名:

string table = string.Format("{0}.{1}.{2}", reader[0], reader[1], reader[2]); 
listBox2.Items.Add(table); 

然后你就可以处理SelectedIndexChanged事件ListBox的。在这里,您只能使用SqlCommand.ExecuteReader(CommandBehavior.SchemaOnly)来检索架构信息。 DataReader.GetSchemaTable创建DataTable利用柱的元数据:

private void listBox2_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string table = listBox2.SelectedItem.ToString(); 
    using (SqlConnection con = new SqlConnection(strConnect)) 
    { 
     con.Open(); 
     using (SqlCommand com = new SqlCommand(@"SELECT * FROM " + table, con)) 
     { 
      using (SqlDataReader reader = com.ExecuteReader(CommandBehavior.SchemaOnly)) 
      { 
       listBoxColumns.Items.Clear(); 
       DataTable schemaTable = reader.GetSchemaTable(); 
       foreach(DataRow colRow in schemaTable.Rows) 
        listBoxColumns.Items.Add(colRow.Field<String>("ColumnName")); 
      } 
     } 
    } 
} 
+0

先生非常感谢您解答您的答案。如何从listBox2中创建所选表的脚本表查询(by SelectedIndexChanged或单击o按钮)是否有可能?你能给我一些提示吗? – user3107343

+0

右键单击表格 - >脚本表格 - >查询表格。我的意思是说。是否可以在这些代码中应用这个? – user3107343

+0

@ user3107343:也许这有助于:http://stackoverflow.com/questions/21547/in-sql-server-how-do-i-generate-a-create-table-statement-for-a-given-table –

3

就在INFORMATION_SCHEMA.COLUMNS搜索

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @yourtablename 




public List<string> GetColumnNames(string tableName) 
{ 
    List<string> columns = new List<string>(); 
    string strConnect = "........."; 
    using (SqlConnection con = new SqlConnection(strConnect)) 
    { 
     con.Open(); 
     using (SqlCommand com = new SqlCommand(@"SELECT COLUMN_NAME 
           FROM INFORMATION_SCHEMA.COLUMNS 
           WHERE TABLE_NAME = @yourtablename", con)) 
     { 

      com.Parameters.AddWithValue("@yourtableName", tableName); 
      using (SqlDataReader reader = com.ExecuteReader()) 
      { 
       columns.Add(reader["COLUMN_NAME"].ToString()); 
      } 
     } 
    } 
    return columns; 
} 

现在,在调用方法返回的列列表添加到您的用户界面对象显示

private void button2_Click(object sender, EventArgs e) 
{ 
    string tableName = comboBox1WithTable.SelectedItem.ToString(); 
    List<string> cols = GetColumnNames(tableName); 
    comboBox2WithColumns.DataSource = cols; 
} 
1

为了让你只需要所有列名在拥有表名后运行以下SQL命令。

private void GetColumnNames(string tableName) 
{ 
    string query = "SELECT * FROM myDatabase.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName"; 
    using (var conn = new SqlConnection(myConnectionString)) 
    using (var cmd = new SqlCommand(query, conn)) 
    { 
     cmd.Parameters.AddWithValue("@TableName", tableName) 
     conn.Open(); 
     var reader = cmd.ExecuteReader(); 
     //Store the contents of reader in a variable to update your list box. 
    } 
} 
2
SELECT c.name AS ColName 
FROM sys.columns c 
JOIN sys.tables t ON c.object_id = t.object_id 
WHERE t.name = @SelTableName 

单从下拉列表这个SQL脚本提供了选择的表名。

相关问题