使用methods of the SqlDataReader,我可以通过传递它的序数来获取列的值,例如,如果我传入read.GetValue(0)
,则输入第一列的值,如果我通过,则输入第二列在read.GetValue(1)
。
在查看这些方法时,我没有看到通过传入列名称(例如ColumnID)来获取列值的选项。在我的神话示例中,我希望传入read.GetValueofColumn("ColumnID")
并读取列中的值(请注意,方法列表中的方法GetValueofColumn
不存在)。
我是否错过了执行此操作的方法或执行此操作的方法?
答案 0 :(得分:20)
您可以使用GetOrdinal
方法获取列的序号,因此您的调用可以是:
read.GetValue(read.GetOrdinal("ColumnID"));
答案 1 :(得分:14)
Datareader
具有数字(基于位置)方法和文本(基于字段名称)方法。因此,使用字段名称,您可以获得类似
object value = reader["some field name"];
(假设reader
是datareader
)
答案 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();
其中id
和time
是列名
答案 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时添加一个默认值。