SqlDataReader 按列名取值(不是序号)
SqlDataReader Get Value By Column Name (Not Ordinal Number)
使用methods of the SqlDataReader,我可以通过传入它的序号来获取列的值,例如如果我传入 read.GetValue(0)
则第一列的值,或者如果我传入第二列我传入 read.GetValue(1)
。
在查看这些方法时,我没有看到通过传入列名(例如 ColumnID)来获取列值的选项。在我的虚构示例中,我想传入 read.GetValueofColumn("ColumnID")
并读取列中的值( 请注意,据我所知,方法 GetValueofColumn
不存在方法列表).
我是否缺少执行此操作的方法或方法?
您可以使用 GetOrdinal
方法获取列的序号,因此您的调用可能是:
read.GetValue(read.GetOrdinal("ColumnID"));
Datareader
具有数字(基于位置)方法和文本(基于字段名称)方法。因此,使用字段名称,您可以获得
这样的值
object value = reader["some field name"];
(假设 reader
是一个 datareader
)
迟到的答案,但是...这对我一直有效,我认为它更接近 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);
}
}
}
您可以使用:
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr["id"] + " -- " + rdr["time"]);
}
rdr.Close();
其中 id
和 time
是列名
为了方便起见,您可以像这样添加一些助手:
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;
}
如您所见,reader 允许使用字段名,但它 returns 是一个需要转换为正确数据类型的对象。扩展会处理这两者,并在字段为 null 时添加默认值。
使用methods of the SqlDataReader,我可以通过传入它的序号来获取列的值,例如如果我传入 read.GetValue(0)
则第一列的值,或者如果我传入第二列我传入 read.GetValue(1)
。
在查看这些方法时,我没有看到通过传入列名(例如 ColumnID)来获取列值的选项。在我的虚构示例中,我想传入 read.GetValueofColumn("ColumnID")
并读取列中的值( 请注意,据我所知,方法 GetValueofColumn
不存在方法列表).
我是否缺少执行此操作的方法或方法?
您可以使用 GetOrdinal
方法获取列的序号,因此您的调用可能是:
read.GetValue(read.GetOrdinal("ColumnID"));
Datareader
具有数字(基于位置)方法和文本(基于字段名称)方法。因此,使用字段名称,您可以获得
object value = reader["some field name"];
(假设 reader
是一个 datareader
)
迟到的答案,但是...这对我一直有效,我认为它更接近 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);
}
}
}
您可以使用:
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr["id"] + " -- " + rdr["time"]);
}
rdr.Close();
其中 id
和 time
是列名
为了方便起见,您可以像这样添加一些助手:
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;
}
如您所见,reader 允许使用字段名,但它 returns 是一个需要转换为正确数据类型的对象。扩展会处理这两者,并在字段为 null 时添加默认值。