1

我想知道如何获取数据库表的列并将它们中的每一个存储在字符串或字符串数​​组中。我有以下代码,但我相信它不起作用。我正在使用 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 是一个文本框。

4

7 回答 7

11

您可以使用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)) 正在抛出类型或找不到命名空间

我可以发誓我已经看到MySqlCommand并且MySqlConnection。所以你正在使用 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
于 2013-06-27T21:13:09.413 回答
2

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

DataTable table = new DataTable();
foreach (DataColumn column in table .Columns)
{
    Console.Write("Item: ");
    Console.Write(column.ColumnName);
    Console.Write(" ");
    Console.WriteLine(row[column]);
}
于 2016-08-16T09:14:10.837 回答
1

除非您已经定义它,否则它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当前数据库连接引用的表。)

于 2013-06-27T21:09:50.270 回答
0
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();
    }
于 2018-05-12T09:05:00.150 回答
0

我将向您展示如何使用 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);
        }
于 2016-02-18T12:37:55.660 回答
0

除了以前的答案,这里还有另一种方式。对我来说,它比 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;
}
于 2016-08-16T08:19:46.503 回答
0

您可以使用 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();
}
于 2021-12-10T17:56:04.073 回答