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