当前位置:  开发笔记 > 编程语言 > 正文

你能从SqlDataReader获取列名吗?

如何解决《你能从SqlDataReader获取列名吗?》经验,为你挑选了5个好方法。

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



1> Rob Stevenso..:
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..:

如果只需要列名,可以执行以下操作:

List columns = 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 Dictionary ExecuteCaseInsensitiveDictionary(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跟踪细节.
这只是一个例子
推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有