2010-11-10 88 views
0

我想要使用SqlDataReader(我很了解Linq等的美,但我正在构建的应用程序部分是一个SQL生成器,所以Linq不适合我的需要)。不幸的是,我不确定使用SqlDataReader时的最佳实践。我在我的代码中的几个地方使用如下代码:SqlDataReader是否具有与字符串键相同的Get *(int index)?

using (SqlDataReader reader = ...) 
{ 
    int ID = reader.GetInt32(0); 
    int tableID = reader.GetInt32(1); 
    string fieldName = reader[2] as string; 
    ...//More, similar code 
} 

但是感觉非常不稳定。如果数据库发生变化(在这种情况下实际上不太可能),代码就会中断。是否有一个等同于SqlDataReader的GetInt32,GetString,GetDecimal,需要一个列名而不是索引?在这种情况下什么被认为是最佳实践?什么是最快的?我的代码的这些部分是我的代码中最耗时的部分(我对它进行了几次简介),所以速度非常重要。

[编辑]

我知道使用索引用字符串的,我misworded以上。我正在运行缓慢的运行时间。我的代码工作正常,但我正在寻找任何可以在这些循环中偷回几秒钟的方法。通过字符串访问会减慢我的速度吗?我知道db访问是主要的时间密集型操作,对此我无能为力,所以我想减少访问每个元素的处理时间。

[编辑]

我决定只用GetOrdinal运行,除非某人有更具体的例子。我稍后会运行效率测试。我会尽量记住在我实际运行测试时发布它们。

回答

4

索引器属性需要一个字符串键,因此您可以执行以下操作。

reader["text_column"] as string; 
Convert.ToInt32(reader["numeric_column"]); 

其他建议

如果你关心的字符串查找是缓慢的,并假定数字查找更快,你可以通过一个大循环的结果之前尝试使用GetOrdinal找到列索引组。

int textColumnIndex = reader.GetOrdinal("text_column"); 
int numericColumnIndex = reader.GetOrdinal("numeric_column"); 
while (reader.Read()) 
{ 
    string text = reader[textColumnIndex] as string; 
    int number = Convert.ToInt32(reader[numericColumnIndex]); 
} 
+1

改为使用int.Parse/TryParse。 – Femaref 2010-11-10 14:55:56

+0

是的,我知道。我主要对速度感到好奇,如果这会让我的代码中最耗时的部分变得更慢。 – Crisfole 2010-11-10 15:01:01

+0

@Femaref:为什么?我没有意识到Convert.ToInt32和int.Parse之间有明显的区别吗? – batwad 2010-11-10 16:37:11

相关问题