web-dev-qa-db-ja.com

SqlDataReader列名による値の取得(順序番号ではない)

SqlDataReaderのメソッド を使用すると、read.GetValue(0)を渡す場合の最初の列の値など、列の値を渡すことで列の値を取得できます。 read.GetValue(1)を渡すと2番目の列。

メソッドを見ると、ColumnIDなどの列の名前を渡すことで列の値を取得するオプションが表示されません。私の神話的な例では、read.GetValueofColumn("ColumnID")を渡し、列の値を読み取ります(メソッドGetValueofColumnは存在しないことに注意してくださいメソッドリストからわかる限り)。

これを行う方法、またはこれを行う方法がありませんか?

10
user9927

GetOrdinalメソッドを使用して列の序数を取得できるため、呼び出しは次のようになります。

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

Datareaderには、数値(位置ベース)メソッドとテキスト(フィールド名ベース)メソッドがあります。したがって、フィールド名を使用すると、次のような値を取得できます

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

readerdatareaderであると仮定)

16
Emanuele Greco

遅い答えですが、...これは私にとって常に有効であり、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);
        }

    }
}
7

次を使用できます:

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

ここで、idおよびtimeは列名です

1
Grzegorz J

便宜上、次のようなヘルパーを追加できます。

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の場合のデフォルト値を追加します。

0
Rick Glimmer