检查 DataReader 中是不是存在列的最佳方法

Posted

技术标签:

【中文标题】检查 DataReader 中是不是存在列的最佳方法【英文标题】:Best way to check if column exist in the DataReader检查 DataReader 中是否存在列的最佳方法 【发布时间】:2014-02-18 19:23:03 【问题描述】:

我们对每个数据层都有许多存储过程。例如,我们有一个包含 20 列的 Employee 表,并且大约有七个存储过程引用了该表。我们有一种用于所有员工存储过程的数据绑定方法。每次我在表中添加一个新列时,我都必须将列引用添加到所有七个存储过程(即使它们都不需要)。有点痛。

当我们使用一种数据绑定方法时,使这个过程更有效率的最佳方法是什么?

如果我只在需要它的那些 sp 中添加列引用,然后在数据绑定期间检查 dataReader 中是否存在列,该怎么办。我不想遍历每一行,然后遍历所有列以找出列是否存在。如果我有 1000 行和 20 列,那么它将是一个 1000 x 20 的循环,效率不高。

如果我在 ArrayList 中添加 dataReader 结果,然后使用 contains 方法查找 ArrayList 中是否存在列,可以吗?

【问题讨论】:

看看这个:***.com/q/373230/897326. 我认为你的问题是你的存储过程有数据绑定方法。相反,您应该使用实体框架或类似的东西,它稍微抽象了数据访问。否则,当您的存储过程显然不需要所有列时,您不应该使用单一数据访问方法。弯曲数据库以适应您的代码是没有意义的。 @JohnSaunders:是的,你是绝对正确的。是否有任何适用于我的情况的实体框架示例。我也将尝试对此进行一些研究。 【参考方案1】:

这是一个扩展方法I found a while back 来检查列是否存在:

应该注意效率不是很高。

    public static bool HasColumn(this IDataRecord dr, string columnName)
    
        for (int i = 0; i < dr.FieldCount; i++)
        
            if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
            
                return true;
            
        
        return false;
    

也许您可以在第一条记录上使用它并通过一些布尔值缓存结果。

类似于以下内容:

    public void test()
    
        //DataBrokerSql is my own helper.
        using (DataBrokerSql db = new DataBrokerSql(m_ConnString))
        
            bool columnsChecked = false;
            bool hasFirstName = false;
            bool hasLastName = false;
            using (DbDataReader reader = db.GetDataReader("Select * From Person"))
            
                while (reader.Read())
                
                    //Only check for columns on the first row.
                    if (!columnsChecked)
                    
                        hasFirstName = reader.HasColumn("FirstName");
                        hasLastName = reader.HasColumn("LastName");
                        columnsChecked = true;
                    

                    if (hasFirstName)
                    
                        //Read FirstName
                        var firstName = reader["FirstName"];
                    

                    if (hasLastName)
                    
                        //Read LastName
                        var lastName = reader["LastName"];
                    
                
            
        
     

【讨论】:

我知道这种方法,但效率不高。

以上是关于检查 DataReader 中是不是存在列的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

具有重复列名的 DataReader

检查plpgsql中是不是存在变量的最佳实践?

检查电子邮件是不是存在的最佳方法

检查sql server ce中是不是存在项目的最佳方法?

检查 C 中是不是存在文件的最佳方法是啥?

检查 C 中是不是存在文件的最佳方法是啥?