gpt4 book ai didi

c# - ADO.Net:检查 IDataRecord 上是否存在字段名称

转载 作者:太空狗 更新时间:2023-10-29 19:53:18 24 4
gpt4 key购买 nike

只有在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com