使用SqlDataReader的方法,我可以通过传入它的序数来获取列的值,例如,如果我传入read.GetValue(0),则为第一列的值,如果我传入,则为第二列read.GetValue(1).
在查看这些方法时,我没有看到通过传入列名称(例如ColumnID)来获取列值的选项.在我的神话示例中,我想传入read.GetValueofColumn("ColumnID")并读取列中的值(请注意,GetValueofColumn从方法列表中可以看出,该方法不存在).
我错过了这样做的方法,还是一种方法呢?
Mat*_*ewG 24
您可以使用该GetOrdinal方法获取列的序号,因此您的调用可以是:
read.GetValue(read.GetOrdinal("ColumnID"));
Run Code Online (Sandbox Code Playgroud)
Ema*_*eco 16
Datareader具有数字(基于位置)方法和文本(基于字段名称)方法.因此,使用字段名称,您可以获得类似的值
object value = reader["some field name"];
Run Code Online (Sandbox Code Playgroud)
(假设reader是a 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
为了方便起见,您可以添加一些帮助程序,如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,读取器允许使用字段名,但它返回一个需要转换为正确数据类型的对象。该扩展会处理这两个问题,并在字段为空时添加默认值。
| 归档时间: |
|
| 查看次数: |
39930 次 |
| 最近记录: |