C# 检查DataReader中是否存在列的最佳方法

C# 检查DataReader中是否存在列的最佳方法,c#,vb.net,data-binding,C#,Vb.net,Data Binding,我们针对每个数据层有许多存储过程。例如,我们有一个包含20列的Employee表,其中引用了大约7个存储过程。我们有一个针对所有员工存储过程的数据绑定方法。每次我在表中添加一个新列时,我都必须将列引用添加到所有七个存储过程中(即使不是所有存储过程都需要)。有点痛 由于我们使用的是一种数据绑定方法,那么让这个过程更高效的最佳方法是什么 如果我只在需要的sp中添加一个列引用,然后在数据绑定期间检查dataReader中是否存在列,该怎么办。我不想遍历每一行,然后遍历所有列以确定列是否存在。如果我有1

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

由于我们使用的是一种数据绑定方法,那么让这个过程更高效的最佳方法是什么

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


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

这里有一个扩展方法来检查列是否存在:

应该注意,这不是很有效

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

我知道此方法,但效率不高。请检查:。我认为您的问题是您的存储过程没有数据绑定方法。相反,您应该使用实体框架或类似的东西,它稍微抽象了数据访问。如果没有这一点,当存储过程显然不需要所有列时,就不应该使用单一的数据访问方法。弯曲数据库以适应代码是没有意义的。@JohnSaunders:是的,你完全正确。是否有任何实体框架示例适合我的情况。我也会尝试做一些研究。
    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"];
                    }
                }
            }
        }
    }