SqlDataReader 按列名获取值(不是序号)

Posted

技术标签:

【中文标题】SqlDataReader 按列名获取值(不是序号)【英文标题】:SqlDataReader Get Value By Column Name (Not Ordinal Number) 【发布时间】:2015-04-04 05:40:54 【问题描述】:

使用methods of the SqlDataReader,我可以通过传入它的序号来获取列的值,例如如果我传入read.GetValue(0),则为第一列的值,如果我传入read.GetValue(1),则为第二列.

在查看方法时,我没有看到通过传入列名(例如 ColumnID)来获取列值的选项。在我的神话示例中,我想传入 read.GetValueofColumn("ColumnID") 并读取列中的值(请注意,就我从方法列表中可以看出,方法 GetValueofColumn 不存在 )。

我是否缺少执行此操作的方法或执行此操作的方法?

【问题讨论】:

试试"read.GetValue["ColumnName"]" 我已经尝试过了,不幸的是GetValue 只接受int 你为什么不通过dataReader["ColumnName"] 获得你正在寻找的价值,这不是那么简单.. 这是一个很好的网站,可以保存在你的武器库中C# Get DataReader values by Column Name 【参考方案1】:

您可以使用GetOrdinal 方法获取列的序号,因此您的调用可能是:

read.GetValue(read.GetOrdinal("ColumnID"));

【讨论】:

效果很好,谢谢;我不能接受时会接受(可以在 8 分钟内接受答案?) 出于性能原因,Microsoft 现在建议您在读取循环外调用 GetOrdinal,并且仅在循环内调用 GetValue(int) 很好的答案,但是,使用read.GetFieldValue<YourType>(read.GetOrdinal("ColumnID")); 会节省你的演员表 这个游戏迟到了。只是想补充一点,如果您的选择列表列使用 AS 子句来命名具有相同名称的列,您应该小心。在这种情况下,外部 GetValue() 调用最终可能会为您提供可能不同列的值。【参考方案2】:

Datareader 具有数字(基于位置)方法和文本(基于字段名称)方法。因此,使用字段名称,您可以获得类似

的值
object value = reader["some field name"];

(假设readerdatareader

【讨论】:

是的,但是对于读者的其他辅助函数只接受一个int,所以如果你想使用它们,你必须调用GetOrdinal(最好在读取循环之外)来获取索引,然后您可以在读取循环中调用任何函数(包括 reader[index])。 问题是“通过传入列名来获取列值的选项”,我想我的答案是最简单的。【参考方案3】:

迟到的答案,但是...这一直对我有用,我认为它更接近 OP 试图实现的目标:

using (SqlCommand cmd = new SqlCommand(cmdString, cn))
using (SqlDataReader rs = cmd.ExecuteReader()) 

    if (rs.HasRows) 

        while (rs.Read()) 

            Meeting_DiscussionItems_MX di = new Meeting_DiscussionItems_MX();

            di._Discussion_Item_MX_ID   = (int) rs["Discussion_Item_MX_ID"];
            di._Meeting_ID              = (int) rs["Meeting_ID"];
            di._Discussion_Item_Name    = (string) rs["Discussion_Item_Name"];
            di._Display_Order           = (string) rs["Display_Order"];
            di._Status                  = (string) rs["Status"];
            di._Discussion_Items        = (string) rs["Discussion_Items"];
            di._ETOPS_Items             = (string) rs["ETOPS_Items"];
            di._Followup                = (string) rs["Followup"];
            di._Pinned                  = (string) rs["Pinned"];
            di._Active                  = (string) rs["Active"];

            _Meeting_DiscussionItems_MX.Add(di);
        

    

【讨论】:

这样做有什么缺点吗? 目前不适合我。它确实需要使用 DBNull.Value 检查是否存在空值(如果您的列中可能存在空值)。【参考方案4】:

为方便起见,您可以添加一些这样的助手:

public static string GetString(this SqlDataReader reader, string name) 
    return GetFieldValue<String>(reader, name, (string)null);


public static T GetFieldValue<T>(this SqlDataReader reader, string fieldName, T defaultvalue = default(T)) 
    try 
        var value = reader[fieldName];
        if (value == DBNull.Value || value == null)
            return defaultvalue;
        return (T)value;
     catch (Exception e) 
        //SimpleLog.Error("Error reading databasefield " + fieldName + "| ", e);
    
    return defaultvalue;

如您所见,阅读器允许使用字段名,但它返回一个需要转换为正确数据类型的对象。当字段为空时,扩展会处理这两个问题并添加一个默认值。

【讨论】:

【参考方案5】:

你可以使用:

mysqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())

    Console.WriteLine(rdr["id"] + " -- " + rdr["time"]);

rdr.Close();

其中idtime 是列名

【讨论】:

以上是关于SqlDataReader 按列名获取值(不是序号)的主要内容,如果未能解决你的问题,请参考以下文章

获取SqlDataReader的列名

使用 SqlDataReader.IsDBNull 时使用列名

如何在asp.net的GridView中按列名而不是按索引获取单元格值

Rank 获取排序的序号

如何从 SqlDataReader 获取列的表名

如何在 php 电子表格解析器库中按列名获取值?