连接到数据库后,我可以获取在我的所有列中返回的列的名称SqlDataReader
吗?
var reader = cmd.ExecuteReader(); var columns = new List(); for(int i=0;i 要么
var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
令人疯狂的是,没有可枚举的接口可以让你遍历列.
稍微短一点:`columns = Enumerable.Range(0,reader.FieldCount).Select(reader.GetName).ToList();`
这非常有效.我还发现我的列名都是大写的,除非我在列名周围使用了引号.`SELECT id AS"MyId"FROM table;`
2> Stephen Wrig..:它上面有一个
GetName
函数SqlDataReader
接受列索引并返回列的名称.相反,有一个
GetOrdinal
接受列名并返回列索引.
为什么地球上没有标记为答案?
有两个原因:第一,原始海报还没有选择答案,其次,还有其他答案可以更详细地描述问题的"解决方案",然后才是功能的存在.就个人而言,我喜欢Steven Lyons的最佳答案,因为它不仅谈论GetName,还涉及FieldType和DataType.
3> Steven Lyons..:您可以从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 }
4> nawfal..:已经提到了.只是一个LINQ答案:
var columns = reader.GetSchemaTable().Rows .Cast() .Select(r => (string)r["ColumnName"]) .ToList(); //Or var columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName) .ToList(); 第二个更清洁,更快.即使您
GetSchemaTable
在第一种方法中缓存,查询也会非常缓慢.
5> Yakir Manor..:如果只需要列名,可以执行以下操作:
Listcolumns = new List (); using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) { DataTable dt = reader.GetSchemaTable(); foreach (DataRow row in dt.Rows) { columns.Add(row.Field ("ColumnName")); } } 但如果你只需要一行,我喜欢我的AdoHelper添加.如果您有单行查询并且不想在代码中处理数据表,则此添加非常有用.它返回一个不区分大小写的列名和值的字典.
public static DictionaryExecuteCaseInsensitiveDictionary(string query, string connectionString, Dictionary queryParams = null) { Dictionary CaseInsensitiveDictionary = new Dictionary (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; }
Asawyer,你至少应该说明原因.我假设你会说你应该使用"throw;" 相反,这样你就不会丢失原始的strack跟踪细节.
这只是一个例子