SqlDataReader Получить значение по имени столбца (не порядковый номер)

Используя методы SqlDataReader, я могу получить значение столбца, передав его порядковый номер, например, значение первого столбца, если я передам read.GetValue(0) или второй столбец, если я прохожу read.GetValue(1),

Изучая методы, я не вижу возможности получить значение столбца, передавая имя столбца, например, ColumnID. В моем мифическом примере я хотел бы передать read.GetValueofColumn("ColumnID") и прочитайте значение в столбце (обратите внимание, что метод GetValueofColumn не существует, насколько я могу судить из списка методов).

Я пропускаю метод, чтобы сделать это, или способ сделать это?

6 ответов

Решение

Вы можете получить порядковый номер столбца с помощью GetOrdinal метод, поэтому ваш вызов может быть:

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

Datareader имеет числовой (позиционный) метод и текстовый (имя поля). Таким образом, с именем поля, вы можете получить значение как

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

(при условии, что reader это datareader)

Поздний ответ, но... Это всегда работало для меня, и я думаю, что это ближе к тому, чего пытается достичь ОП:

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

    }
}

Для удобства вы можете добавить несколько таких помощников:

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

Как вы можете видеть, это читатель, который позволяет использовать имена полей, но он возвращает объект, который должен быть приведен к нужному типу данных. Расширение заботится об обоих и добавляет значение по умолчанию, когда поле пустое.

Ты можешь использовать:

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

где id а также time названия столбцов

вы должны использовать, как показано ниже, заменив «(string)» типом, который вы должны использовать для:

(string) reader["name"];

Другие вопросы по тегам