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

时间:2014-02-18 19:23:03

标签: c# vb.net data-binding

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

由于我们使用的是一种数据绑定方法,因此提高此流程效率的最佳方法是什么?

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

如果我在ArrayList中添加dataReader结果然后使用contains方法来查找ArrayList中是否存在列,那会没关系吗?

1 个答案:

答案 0 :(得分:0)

以下是检查列存在的扩展方法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"];
                    }
                }
            }
        }
    }