SqlDataReader是否具有与字符串键相同的Get *(int index)?

时间:2010-11-10 14:51:44

标签: ado.net sqldatareader

我正在尝试使用SqlDataReader(我很清楚Linq等的美丽,但我正在构建的应用程序部分是一个Sql Generator,因此Linq不符合我的需求)。不幸的是,我不确定使用SqlDataReader时的最佳实践是什么。我在代码中的几个地方使用如下代码:

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,它采用列名而不是索引?在这种情况下,最佳做法是什么?什么是最快的?我的代码的这些部分是我代码中最耗时的部分(我已经分析了几次),因此速度很重要。

[编辑]

我知道使用带有字符串的索引器,我误解了上面的内容。我遇到了慢运行时间。我的代码工作正常,但我正在寻找任何方式我可以在这些循环中偷回几秒钟。通过字符串访问会减慢我的速度吗?我知道db-access是主要的时间密集型操作,我无能为力,所以我想减少每个访问元素的处理时间。

[编辑]

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

1 个答案:

答案 0 :(得分:4)

indexer属性采用字符串键,因此您可以执行以下操作。

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