11
字典字段 = new Dictionary();
for (int i = 0; i < reader.FieldCount; i++)
{
     Fields.Add(reader.GetName(i), i);
}

this._MyField1 = reader.GetString(Fields["field1"]);
this._Myfield2 = reader.GetInt16(Fields["field2"]);

这样做让我想哭,但我似乎无法弄清楚如何通过列名使用类型特定的检索方法,而不是这种方式。请告诉我有更好的方法。这专门针对 DB2,但如果可能的话,我希望该解决方案也适用于 MS Sql

4

2 回答 2

19

您正在寻找GetOrdinal方法:

this._MyField1 = reader.GetString(dr.GetOrdinal("field1"));
this._Myfield2 = reader.GetInt16(dr.GetOrdinal("field2"));

为了性能和可读性,我通常以匿名类型缓存序数:

// ...
using (IDataReader dr = cmd.ExecuteReader())
{
    var ordinals = new {
                           Foo = dr.GetOrdinal("Foo"),
                           Bar = dr.GetOrdinal("Bar")
                       };

    while (dr.Read())
    {
        DoSomething(dr.GetString(ordinals.Foo), dr.GetInt16(ordinals.Bar));
    }
}
// ...
于 2010-07-12T13:32:25.757 回答
2

使用SqlDataReaderfrom Assembly System.Data.SqlClient,您可以执行以下操作(示例):

List<string> list = new();
string query = "SELECT * FROM [YourTable]";
using SqlConnection conn = new(YourConnectionString);
using SqlCommand cmd = new(query, conn);
conn.Open();
using SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read() && reader.HasRows)
{
    int columnNumber = reader.GetOrdinal("ColumnName")
    list.Add(reader.GetString(columnNumber));
}

GetOrdinal(string)来自 object的方法SqlDataReader,接受您想要获取的列名并返回列号。该数字可用于该方法GetString(int)

于 2021-11-30T12:38:53.407 回答