你能从SqlDataReader获得列名吗?

连接到数据库后,我可以得到在我的SqlDataReader中返回的所有列的名称?

 var reader = cmd.ExecuteReader(); var columns = new List<string>(); for(int i=0;i<reader.FieldCount;i++) { columns.Add(reader.GetName(i)); } 

要么

 var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList(); 

SqlDataReader上有一个GetName函数,它接受列索引并返回列的名称。

相反,还有一个GetOrdinal ,它接收一个列名并返回列索引。

您可以从DataReader获取列名称。

这是重要的部分:

  for (int col = 0; col < SqlReader.FieldCount; col++) { Console.Write(SqlReader.GetName(col).ToString()); // Gets the column name Console.Write(SqlReader.GetFieldType(col).ToString()); // Gets the column type Console.Write(SqlReader.GetDataTypeName(col).ToString()); // Gets the column database type } 

已经提到。 只是一个LINQ的答案:

 var columns = reader.GetSchemaTable().Rows .Cast<DataRow>() .Select(r => (string)r["ColumnName"]) .ToList(); //Or var columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName) .ToList(); 

第二个更清洁,更快。 即使您在第一种方法中cachingGetSchemaTable ,查询将会非常缓慢。

如果你只想要列名,你可以这样做:

 List<string> columns = new List<string>(); using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) { DataTable dt = reader.GetSchemaTable(); foreach (DataRow row in dt.Rows) { columns.Add(row.Field<String>("ColumnName")); } } 

但是,如果你只需要一行,我喜欢我的AdoHelper增加。 如果你有一个单行查询,并且你不想在你的代码中处理数据表,那么这个增加是很好的。 它返回一个不区分大小写的字典名称和值的字典。

 public static Dictionary<string, string> ExecuteCaseInsensitiveDictionary(string query, string connectionString, Dictionary<string, string> queryParams = null) { Dictionary<string, string> CaseInsensitiveDictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); try { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = query; // Add the parameters for the SelectCommand. if (queryParams != null) foreach (var param in queryParams) cmd.Parameters.AddWithValue(param.Key, param.Value); using (SqlDataReader reader = cmd.ExecuteReader()) { DataTable dt = new DataTable(); dt.Load(reader); foreach (DataRow row in dt.Rows) { foreach (DataColumn column in dt.Columns) { CaseInsensitiveDictionary.Add(column.ColumnName, row[column].ToString()); } } } } conn.Close(); } } catch (Exception ex) { throw ex; } return CaseInsensitiveDictionary; } 

你当然可以。

 protected void GetColumNames_DataReader() { System.Data.SqlClient.SqlConnection SqlCon = new System.Data.SqlClient.SqlConnection("server=localhost;database=northwind;trusted_connection=true"); System.Data.SqlClient.SqlCommand SqlCmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM Products", SqlCon); SqlCon.Open(); System.Data.SqlClient.SqlDataReader SqlReader = SqlCmd.ExecuteReader(); System.Int32 _columncount = SqlReader.FieldCount; System.Web.HttpContext.Current.Response.Write("SqlDataReader Columns"); System.Web.HttpContext.Current.Response.Write(" "); for ( System.Int32 iCol = 0; iCol < _columncount; iCol ++ ) { System.Web.HttpContext.Current.Response.Write("Column " + iCol.ToString() + ": "); System.Web.HttpContext.Current.Response.Write(SqlReader.GetName( iCol ).ToString()); System.Web.HttpContext.Current.Response.Write(" "); } } 

这源于: http : //www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik

使用扩展方法:

  public static List<string> ColumnList(this IDataReader dataReader) { var columns = new List<string>(); for (int i = 0; i < dataReader.FieldCount; i++) { columns.Add(dataReader.GetName(i)); } return columns; } 

我使用GetSchemaTable方法,它通过IDataReader接口公开。

在SQL中实现它比较容易

 var columnsList = dbContext.Database.SqlQuery<string>("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'SCHEMA_OF_YOUE_TABLE' AND TABLE_NAME = 'YOUR_TABLE_NAME'").ToList();