SqlDataReader 按列名获取值(不是序号)
Posted
技术标签:
【中文标题】SqlDataReader 按列名获取值(不是序号)【英文标题】:SqlDataReader Get Value By Column Name (Not Ordinal Number) 【发布时间】:2015-04-04 05:40:54 【问题描述】:使用methods of the SqlDataReader,我可以通过传入它的序号来获取列的值,例如如果我传入read.GetValue(0)
,则为第一列的值,如果我传入read.GetValue(1)
,则为第二列.
在查看方法时,我没有看到通过传入列名(例如 ColumnID)来获取列值的选项。在我的神话示例中,我想传入 read.GetValueofColumn("ColumnID")
并读取列中的值(请注意,就我从方法列表中可以看出,方法 GetValueofColumn
不存在 )。
我是否缺少执行此操作的方法或执行此操作的方法?
【问题讨论】:
试试"read.GetValue["ColumnName"]" 我已经尝试过了,不幸的是GetValue
只接受int
。
你为什么不通过dataReader["ColumnName"]
获得你正在寻找的价值,这不是那么简单.. 这是一个很好的网站,可以保存在你的武器库中C# Get DataReader values by Column Name
【参考方案1】:
您可以使用GetOrdinal
方法获取列的序号,因此您的调用可能是:
read.GetValue(read.GetOrdinal("ColumnID"));
【讨论】:
效果很好,谢谢;我不能接受时会接受(可以在 8 分钟内接受答案?) 出于性能原因,Microsoft 现在建议您在读取循环外调用 GetOrdinal,并且仅在循环内调用 GetValue(int) 很好的答案,但是,使用read.GetFieldValue<YourType>(read.GetOrdinal("ColumnID"));
会节省你的演员表
这个游戏迟到了。只是想补充一点,如果您的选择列表列使用 AS 子句来命名具有相同名称的列,您应该小心。在这种情况下,外部 GetValue() 调用最终可能会为您提供可能不同列的值。【参考方案2】:
Datareader
具有数字(基于位置)方法和文本(基于字段名称)方法。因此,使用字段名称,您可以获得类似
object value = reader["some field name"];
(假设reader
是datareader
)
【讨论】:
是的,但是对于读者的其他辅助函数只接受一个int,所以如果你想使用它们,你必须调用GetOrdinal(最好在读取循环之外)来获取索引,然后您可以在读取循环中调用任何函数(包括 reader[index])。 问题是“通过传入列名来获取列值的选项”,我想我的答案是最简单的。【参考方案3】:迟到的答案,但是...这一直对我有用,我认为它更接近 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);
【讨论】:
这样做有什么缺点吗? 目前不适合我。它确实需要使用 DBNull.Value 检查是否存在空值(如果您的列中可能存在空值)。【参考方案4】:为方便起见,您可以添加一些这样的助手:
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;
如您所见,阅读器允许使用字段名,但它返回一个需要转换为正确数据类型的对象。当字段为空时,扩展会处理这两个问题并添加一个默认值。
【讨论】:
【参考方案5】:你可以使用:
mysqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
Console.WriteLine(rdr["id"] + " -- " + rdr["time"]);
rdr.Close();
其中id
和time
是列名
【讨论】:
以上是关于SqlDataReader 按列名获取值(不是序号)的主要内容,如果未能解决你的问题,请参考以下文章
使用 SqlDataReader.IsDBNull 时使用列名