我正在尝试使用 SQL 命令和数据读取器从我的 MS Access 数据库中获取 2 行数据,但它只返回一行数据。我不完全知道数据阅读器是如何工作的,所以我认为它可能来自我错误地用它编码的东西。SQL命令应该没问题,因为我在MS访问查询中运行它时它可以工作。你知道我的代码出了什么问题吗?[编辑:我实际上并没有试图获取行数,这只是为了测试。在我发布的代码片段下方,我的程序实际上将数据加载到一个数组中,以便可以比较 2 个整数并选择最小的一个。
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];
}
}
}
数据读取器不知道选择查询将返回多少行,直到它从来自数据库的基础流中读取所有数据。
属性返回查询中的字段数,它正好是当前查询中的一个字段数。
要了解行,您需要逐个读取它们或使用数据表
int numRows = 0;
while(r.Read())
{
// do your task with the current IDataRecord
numRows++;
}
Console.WriteLine($"There are {numRows} rows");
或填充数据表
DataTable dt = new DataTable();
dt.Load(com.ExecuteReader());
Console.WriteLine($"There are {dt.Rows.Count} rows");
如果您计划使用返回的数据(在读取器数组或表行数组中(,则上述两种方法很有用,但是如果您只想知道存在多少行,那么最好(尽管只返回两行时最小(将查询更改为:
com.CommandText = @"SELECT COUNT(*) FROM PassageOption AS PO
WHERE PO.PassageID_FK = @passageID;";
com.Parameters.AddWithValue("@passageID", passageID);
int numRows = (int)com.ExecuteScalar();
当您想要一行包含一个字段时,不需要阅读器,只需执行标量
编辑以更新上次编辑的内容
此行失败
optionIDs[i] = (int)r[i];
因为查询中只有一个字段。索引器 i 应仅用于引用 optionIDs 数组,而不是从读取器中提取位置 1 的字段。位置 1 处没有字段,只需使用
optionIDs[i] = (int)r[0];
对于每个读取调用
int numRows = r.FieldCount;
属性获取行中的列数,而不是记录数。
您仅从表中选择OptionID_FK
单个列。FieldCount
将向您展示 1.
获取行数
OleDbDataReader r = com.ExecuteReader();
int rowCount = 0;
if (r.HasRows)
{
while (r.Read())
{
rowCount++;
}
}
r.Close();
您的数据读取器中只有一列,即您选择的列PO.OptionID_FK
.因此,在您的循环中,当i
为 1 时:
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.'
。您正在尝试从数据读取器 (r[i]
( 中选择不存在的第二列。
DataReader 的工作方式是,每当您执行r.read
时,您都会移动到下一行,并且您的r
"数组"变量会使用新行中的所有列值刷新。数组索引r[n]
选择读取器的第 n列,而不是第 n行。所以你应该只使用:
optionIDs[i] = (int)r[0];
。这会将您的选项ID值设置为当前行的DataReader第一列(第0列(的值。