SqlDataReader按列名获取值(非序号)

use*_*927 13 c# sqldatareader

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

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

我错过了这样做的方法,还是一种方法呢?

Mat*_*ewG 24

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

read.GetValue(read.GetOrdinal("ColumnID"));
Run Code Online (Sandbox Code Playgroud)

  • 出于性能原因,Microsoft现在建议您在读取循环之外调用GetOrdinal,并且只在循环内调用GetValue(int) (5认同)
  • 很好的答案,但是,使用 read.GetFieldValue<YourType>(read.GetOrdinal("ColumnID"));` 将为您节省转换 (2认同)

Ema*_*eco 16

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

object value = reader["some field name"];
Run Code Online (Sandbox Code Playgroud)

(假设reader是a datareader)

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

Kir*_*ace 7

迟到的答案,但是......这对我来说一直很有用,我认为它更接近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);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

为了方便起见,您可以添加一些帮助程序,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

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