我正在尝试使用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运行,除非有人有更具体的例子。我稍后会进行效率测试。我会尝试记住在实际运行测试时发布它们。
答案 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]);
}