代码之家  ›  专栏  ›  技术社区  ›  ArBR

ADO.NET:检查字段名称是否存在于IDATARATION

  •  7
  • ArBR  · 技术社区  · 14 年前

    尝试{…}捕获{…} 布洛克,但这是某种 . 一些替代品?

    /// <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));
    }
    

    我改变了我的 函数来反映您的想法,因此它看起来如下:

    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);
    }
    
    4 回复  |  直到 14 年前
        1
  •  16
  •   Guffa    14 年前

    你说的对,异常不应该用于正常的程序流。

    这个 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 方法检查该名称是否存在并获取其在单个操作中的索引。

    这个 方法首先对名称执行大小写敏感搜索,如果失败,则执行大小写不敏感搜索。这不是字典提供的,所以如果您想要这种精确的行为,您宁愿将名称存储在一个数组中,并编写一个方法,以便在您想要查找索引时循环它们。

        2
  •  2
  •   Community Michael Schmitz    7 年前

    看看这个密切相关的问题,一个可行的方法来测试一个领域的存在。注意,如果要迭代结果集合,最好只检查一次列,而不是每次迭代。

    Check for column name in a SqlDataReader object

        3
  •  2
  •   Lukasz Pyrzyk    8 年前

    只有一行:

    bool exists = Enumerable.Range(0, dataRecord.FieldCount).Any(x => dataRecord.GetName(x) == "columnName"); // or with OrdinalIgnoreCase
    
        4
  •  1
  •   Michael B    14 年前

    我总是用下面的方法 IDataReader (自大多数 IDataRecord 你得到的是读者) reader.GetSchemaTable().Columns.Contains("field")

    当然,如果你有一个真正的 爱达荷路 如果你试着把它投给 而且不是一个。