Устройство чтения данных не знает, сколько строк будет возвращено вашим запросом select, пока не прочитает все данные из базового потока, поступающего из базы данных.
Свойство FieldCount возвращает количество полей в вашем запросе, и оно равно одному для вашего текущего запроса.
Чтобы узнать строки, вам нужно прочитать их одну за другой или использовать DataTable
int numRows = 0;
while(r.Read())
{
// do your task with the current IDataRecord
numRows++;
}
Console.WriteLine($"There are {numRows} rows");
Или заполнение DataTable
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();
Нет необходимости в считывателе, если вам нужна одна строка с одним полем, просто ExecuteScalar
ПРАВКА, чтобы обновить с вашей последней правкой
Эта строка не работает
optionIDs[i] = (int)r[i];
потому что в вашем запросе только одно поле. Индексатор i следует использовать только для ссылки на массив optionIDs, а не для извлечения поля в позиции 1 из считывателя. В позиции 1 нет поля, просто используйте
optionIDs[i] = (int)r[0];
за каждый прочитанный звонок