获取表的列名并将其存储在字符串或var c#asp.net中
我想知道如何获取数据库表的列并将它们存储在字符串或字符串数组中。 我有以下代码,但我相信它不起作用。 我正在使用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
。 顺便说一句,列是一个文本框。
您可以使用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("ColumnName")); }
列名称位于每行的第一列中。
我正在尝试你的方法,但MySql.Data.MySqlClient.MySqlConnection(连接))抛出类型或命名空间无法找到
我本可以发誓我已经看过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
非常简单你可以像下面的代码那样做..
DataTable table = new DataTable(); foreach (DataColumn column in table .Columns) { Console.Write("Item: "); Console.Write(column.ColumnName); Console.Write(" "); Console.WriteLine(row[column]); }
除非您已定义它,否则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
引用的表。)
我将向您展示如何使用MySQL数据库表。 类似的代码结构也可用于您的案例。 基本上你应该运行“DESC table_name”查询。 然后,您将表描述作为结果表。 您可以读取dataReader并从表描述中检索任何信息。 在此示例中,我检索特定数据库表的列名称。 希望这会节省一些人的时间。 :)快乐的编码!
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(tableDescDR.GetOrdinal("Field"))); } tableDescDR.Close(); } catch (Exception ex) { MessageBox.Show("Could not retrieve DB Table fields.\n" + ex.Message); }
除了以前的答案,这里是另一种方式。 对我来说,它比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; }
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(); }