- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
只有在 IDataRecord 中存在 field_name 时,是否有更好的方法从 IDataRecord 获取 field_name 值,目前我正在使用 try{...} catch{...} block ,但这是某种下一个错误恢复。一些替代方案?
/// <summary>
/// Returns column value from IDataRecord only if field_name exists.
/// </summary>
public static Tresult ValueIfExists<Tresult>(this IDataRecord record, string field_name)
{
try { return record.Value<Tresult>(record.GetOrdinal(field_name)); }
catch { return default(Tresult); }
}
/// <summary>
/// Returns column value from IDataRecord accecing by index.
/// </summary>
public static Tresult Value<Tresult>(this IDataRecord record, int field_index)
{
return record.IsDBNull(field_index) ? default(Tresult) :
(Tresult)Convert.ChangeType(record[field_index], typeof(Tresult));
}
我已经更改了我的 ValueIfExists 函数以反射(reflect)您的想法,所以它看起来像这样:
public static Tresult ValueIfExists2<Tresult>(this IDataRecord record, string field_name)
{
for (int index = 0; index < record.FieldCount; index++)
{
if (record.GetName(index).Equals(field_name, StringComparison.InvariantCulture))
{
return record.Value<Tresult>(record.GetOrdinal(field_name));
}
}
return default(Tresult);
}
最佳答案
你说的对,异常不应该用于正常的程序流程。
GetOrdinal
方法适用于您知道获得哪些字段的情况,如果缺少某个字段,则该错误应导致异常。
如果您不知道结果中有哪些字段,则应避免使用 GetOrdinal
方法。您可以改为将所有名称及其索引放入字典中,您可以将其用作 GetOrdinal
方法的替代品:
public static Dictionary<string, int> GetAllNames(this IDataRecord record) {
var result = new Dictionary<string, int>();
for (int i = 0; i < record.FieldCount; i++) {
result.Add(record.GetName(i), i);
}
return result;
}
您可以使用 ContainsKey
方法检查字典中是否存在该名称,或使用 TryGetValue
方法检查该名称是否存在并获取它在其中的索引一次操作。
GetOrdinal
方法首先对名称进行区分大小写的搜索,如果失败,则进行不区分大小写的搜索。这不是由字典提供的,所以如果您想要那个确切的行为,您宁愿将名称存储在一个数组中,并编写一个方法在您想要查找索引时循环遍历它们。
关于c# - ADO.Net:检查 IDataRecord 上是否存在字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126411/
概述 CentOS Stream 成立于 2019 年,是“RHEL 下一步的滚动预览”。Red Hat 首席技术官 Chris Wright 和 CentOS 社区经理 Rich Bowen 各
我有一个使用 Mesosphere DC/OS 编排选项进行配置的 Azure 容器服务 (ACS) 集群。我可以在 Marathon UI 中创建一个应用程序。 但是,当我通过 Marathon U
我是一名优秀的程序员,十分优秀!