【问题标题】:Get the column names of a table and store them in a string or var c# asp.net获取表的列名并将它们存储在字符串或var c# asp.net中
【发布时间】:2013-06-25 12:59:22
【问题描述】:

我想知道如何获取数据库表的列并将它们中的每一个存储在字符串或字符串数​​组中。我有以下代码,但我相信它不起作用。我正在使用 asp.net 中给出的默认表。我已经能够毫无问题地写入该表,但我无法弄清楚如何从中选择并保存检索到的值。这是我背后的代码中的内容

    string connection = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
    SqlConnection conn = null;
    conn = new SqlConnection(connection);
    conn.Open();
    using (SqlCommand cmd = new SqlCommand())
    {

        string query = String.Format("SELECT column_name FROM USER_TAB_COLUMN WHERE table_name = 'TestTable'");
        cmd.Connection = conn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = query;
        columns.Text = cmd.ExecuteNonQuery().ToString();
        conn.Close();
    }

错误是Invalid object name 'USER_TAB_COLUMN'。我试过删除它并使用"SELECT column_name FROM TestTable",然后它抱怨column_name。顺便说一下,Columns 是一个文本框。

【问题讨论】:

  • 您真的要获取列名还是行?
  • @fabianbigler 我不需要这些行。我想要字段的名称。所以Table b 有字段fName lName email Address 我想把每一个都保存在某个地方

标签: c# asp.net sql-server


【解决方案1】:

您可以使用DbDateReader.GetSchemaTable

DataTable schema = null;
using (var con = new MySql.Data.MySqlClient.MySqlConnection(connection))
{
    using (var schemaCommand = new MySql.Data.MySqlClient.MySqlCommand("SELECT * FROM TestTable", con))
    {
        con.Open();
        using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly))
        {
            schema = reader.GetSchemaTable();
        }
    }
}
foreach (DataRow col in schema.Rows)
{
    Console.WriteLine("ColumnName={0}", col.Field<String>("ColumnName"));
}

列名在每一行的第一列。


我正在尝试你的方法,但是 MySql.Data.MySqlClient.MySqlConnection(connection)) 是抛出类型 或找不到命名空间

我可以发誓我见过MySqlCommandMySqlConnection。所以你使用 SQL-Server 作为 rdbms 来代替?

using (var con = new SqlConnection(connection))
{
    using (var schemaCommand = new SqlCommand("SELECT * FROM TestTable;", con))
    {
        con.Open();
        using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly))
        {
            schema = reader.GetSchemaTable();
        }
    }
}
// DataTable part is the same

【讨论】:

  • 我正在尝试您的方法,但MySql.Data.MySqlClient.MySqlConnection(connection)) 正在抛出类型或找不到命名空间错误。我在这里缺少一些 System.Data.(blank) 吗?
  • @Andy:哎呀!抱歉,我可以发誓我没见过MySqlCommandMySqlConnection。所以你正在使用 SQL-Server 作为 rdbms 吗?然后将所有MySql 替换为Sql,它的工作方式完全相同。 ;)
  • 我试过了,错误仍然存​​在?这很奇怪,因为我有using System.Data.Sql;
  • @Andy:我现在用 sql-server 测试了相同的代码,相应地编辑了我的答案。
  • 没有错误谢谢!看不到控制台大声笑,但我可以弄清楚:p
【解决方案2】:

非常简单,你可以像下面的代码那样做..

DataTable table = new DataTable();
foreach (DataColumn column in table .Columns)
{
    Console.Write("Item: ");
    Console.Write(column.ColumnName);
    Console.Write(" ");
    Console.WriteLine(row[column]);
}

【讨论】:

    【解决方案3】:

    除非您已经定义它,否则USER_TAB_COLUMN 不是 MySQL 中的表或视图。

    要获取列名,请查询information_schema.columns 视图。

    例如

    获取foo.bar 表中的列名列表:

    SELECT column_name 
      FROM information_schema.columns
     WHERE table_schema = 'foo'
       AND table_name = 'bar'
    

    (由于同一个 table_name 可以出现在多个数据库中,为了确保您从单个表中获取列名,您需要指定该表所在的数据库。这也提高了查询的效率,如果您有很多数据库,因为它限制了 MySQL 需要检查的数据库。)

    要检查“当前”数据库中表的列,可以使用DATABASE() 函数:

    SELECT column_name 
      FROM information_schema.columns
     WHERE table_schema = DATABASE()
       AND table_name = 'bar'
    

    (这将是SELECT * FROM bar 从当前数据库连接中引用的表。)

    【讨论】:

    • Since the same table_name can appear in multiple databases, to get the columns in a single table, you'd need to specify the database the table is in. 除非连接字符串已经挑选出一个特定的数据库。
    • @call2voyage:感谢您的澄清。我完全不知道在 MySQL 连接字符串中指定数据库会限制从 information_schema 表返回的行。我相信这些行仅受授予连接的 MySQL 用户的权限限制。
    • 其实,现在想想。我不确定在这种特定情况下是否会缩小范围。
    • 你知道我如何找到 table_schema 吗?我使用的是您创建 asp.net 网站时提供的默认数据库
    • @Andy:在上面的示例查询中,将'foo' 替换为DATABASE()。 (注意:MySQL DATABASE() 函数将返回当前数据库的名称。这将是连接上指定的数据库,或者是在最新(成功)USE mydatabase 语句中指定的数据库。这是用于非限定引用,例如SELECT * FROM foo) 实际上是对mydatabase.foo 表的查询,其中mydatabase 是从SELECT DATABASE() 返回的值。 HTH
    【解决方案4】:

    我将向您展示如何使用 MySQL 数据库表进行操作。类似的代码结构也可以用于您的案例。 基本上你应该运行“DESC table_name”查询。然后你有一个表描述作为结果表。您可以读取 dataReader 并检索从表描述中归档的任何信息。在此示例中,我检索特定 DB 表的列名。希望这会节省一些人的时间。 :) 编码快乐!

     var tableDesc = "DESC table_name";
    
            try
            {
                Mclient.MySqlCommand tableDescCmd = new Mclient.MySqlCommand(tableDesc, mCon);
                Mclient.MySqlDataReader tableDescDR = tableDescCmd.ExecuteReader();
    
                while (tableDescDR.Read())
                {
    
                    searchFields.Items.Add(tableDescDR.GetFieldValue<String>(tableDescDR.GetOrdinal("Field")));
                }
    
                tableDescDR.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Could not retrieve DB Table fields.\n" + ex.Message);
            }
    

    【讨论】:

      【解决方案5】:

      除了以前的答案,这里还有另一种方法。对我来说,它比 DataReader 的替代品运行得更快(不多)。 “WHERE FALSE”告诉不带数据。

      请注意,不需要遍历 DataTable.Rows,因为结果 DataTable 已经描述了目标表的架构(请参阅 DataTable.Columns),而不是当前 DataReader 结果的架构

      DataTable GetDataTableScheme(string tableName)
      {
          var table = new DataTable();
      
          using (var connection = new MySqlConnection(*[ConnectionString]*))
          using (var dataAdapter = new MySqlDataAdapter($"SELECT * FROM {tableName} WHERE FALSE", connection))
          {
              // Adds additional info, like auto-increment
              dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
      
              dataAdapter.Fill(table);
          }
      
          return table;
      }
      

      【讨论】:

        【解决方案6】:
        private void leavestat()
            {
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
        
                string query = "SELECT * FROM leaverecord";
                MySqlCommand cmd = new MySqlCommand(query, conn);
                MySqlDataAdapter da = new MySqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);
        
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                     listBox1.Items.Add(dt.Columns[i].ToString());
                }
                    conn.Close();
            }
        

        【讨论】:

          【解决方案7】:

          您可以使用 MySqlDataReader 和 GetSchemaTable 获取列名。 不仅是列名,您几乎可以访问表的所有信息。

          代码也非常简单易懂。

          string query = String.Format("SELECT * FROM testTable");
          MySqlConnection conn = new MySqlConnection(strCon);
          MySqlCommand cmd = new MySqlCommand(query, conn);
          conn.Open();
          MySqlDataReader rdr = cmd.ExecuteReader();
          DataTable schema = rdr.GetSchemaTable();
          conn.Close();
          
          foreach (DataRow rdrColumn in schema.Rows)
          {
              String columnName = rdrColumn[schema.Columns["ColumnName"]].ToString();
              String dataType = rdrColumn[schema.Columns["DataType"]].ToString();
          }
          

          【讨论】:

            猜你喜欢
            • 2020-10-11
            • 2014-09-13
            • 1970-01-01
            • 2020-10-09
            • 2013-10-07
            • 1970-01-01
            • 2016-03-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多