SQL 返回不正确的行数



我正在尝试使用 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列(的值。

相关内容

  • 没有找到相关文章

最新更新