【发布时间】:2018-05-11 08:20:08
【问题描述】:
我正在尝试使用 SQL 命令并使用数据读取器从我的 MS Access 数据库中获取 2 行数据,但它只返回一行数据。我不完全知道数据读取器是如何工作的,所以我认为这可能是我用它错误编码的东西。 SQL 命令应该没问题,因为当我在 MS Access Query 中运行它时它可以工作。你知道我的代码有什么问题吗? [编辑:我实际上并没有尝试获取行数,这只是为了测试。在我贴的代码 sn-p 下面,我的程序实际上将数据加载到一个数组中,以便可以比较两个整数并选择最小的一个。]
if (passageID != 1)
{
Connect(fileName);
OleDbCommand com = new OleDbCommand();
com.Connection = cxn;
com.CommandText = "SELECT PO.OptionID_FK FROM PassageOption AS PO WHERE PO.PassageID_FK = @passageID;";
com.Parameters.AddWithValue("@passageID", passageID);
OleDbDataReader r = com.ExecuteReader();
int numRows = r.RowCount;
if (r.HasRows)
{
int i = 0;
int[] optionIDs = new int[2];
while (r.Read())
{
optionIDs[i] = (int)r[i]; // It gives me the following error, the second time it runs, when i = 1; System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'
i++;
}
if (optionIDs[0] < optionIDs[1])
{
j = optionIDs[0];
}
else
{
j = optionIDs[1];
}
}
}
【问题讨论】:
-
您正在查看“FieldCount”。您需要行数。
-
另外:不将数据读取器放入
using块会导致连接池泄漏。 -
...请记住,没有行计数属性,因为这可能是一项昂贵的操作,因为它需要您迭代整个结果集。您真的需要获取行数,还是只是将其用于测试? (如果需要计数,最好使用
SELECT COUNT...查询...) -
@UweKeim:我认为这取决于具体情况。如果 OP 确定只会返回 2 条记录,则循环遍历记录不太可能成为问题,并且可能不会比对计数的查询慢,然后是所需的查询。如果有可能返回数百万条记录 - 那将是另一回事。
-
@UweKeim 我实际上正在使用计数,仅用于测试目的。我需要在下面的代码中恢复的数据本身。我应该将其添加到代码 sn-p 中吗?
标签: c# sql oledbdatareader