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

时间:2015-02-04 15:59:41

标签: c# sqldatareader

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

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

我是否错过了执行此操作的方法或执行此操作的方法?

5 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:14)

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

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

(假设readerdatareader

答案 2 :(得分:5)

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

    }
}

答案 3 :(得分:1)

你可以使用:

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

其中idtime是列名

答案 4 :(得分:0)

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

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

您可以看到,阅读器允许使用字段名,但它返回一个需要转换为正确数据类型的对象。该扩展名会兼顾这两者,并为该字段为null时添加一个默认值。