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

SqlDataReader Get Value By Column Name (Not Ordinal Number)

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

在查看这些方法时,我没有看到通过传入列名(例如 ColumnID)来获取列值的选项。在我的虚构示例中,我想传入 read.GetValueofColumn("ColumnID") 并读取列中的值( 请注意,据我所知,方法 GetValueofColumn 不存在方法列表).

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

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

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

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

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

(假设 reader 是一个 datareader

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

    }
}

您可以使用:

MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
    Console.WriteLine(rdr["id"] + " -- " + rdr["time"]);
}
rdr.Close();

其中 idtime 是列名

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

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;
}

如您所见,reader 允许使用字段名,但它 returns 是一个需要转换为正确数据类型的对象。扩展会处理这两者,并在字段为 null 时添加默认值。