Предлагаемое решение: Попробуйте наложить using
блок вокруг DataReader
или позвоните Dispose
:
using (DataReader Reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
// ...do something with your data reader... then finish by:
Reader.Close();
} // <-- Reader.Dispose() called automatically at the end of using block.
// ...prepare second command...
// the same again for the second command:
using (DataReader Reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
// ...
Reader.Close();
}
Предполагаемая причина вашей проблемы: Объект соединения с БД может вести некоторую внутреннюю бухгалтерию для отслеживания устройств чтения данных.В похожем сценарии я обнаружил, что вам разрешается только один DataReader
за раз.Поэтому я считаю, что проблема с вашим кодом заключается в том, что, хотя вы Close
Reader
явно не Dispose
d, поэтому объект подключения думает, что первое устройство чтения данных все еще используется, когда вы выполняете второеone.
Кроме того ... почему бы не упростить этот код:
if ((int)Reader[6] == 1)
{
label9.Text = "Sorcerer (1)";
}
if ((int)Reader[6] == 2)
{
label9.Text = "Druid (2)";
}
...
до switch
оператора?:
int x = (int)(Reader[6]);
string label9Text = string.Empty;
switch (x)
{
case 1: label9Text = "Sorcerer (1)"; break;
case 2: label9Text = "Druid (2)"; break;
...
}
label9.Text = label9Text;
(Это избавит вас от необходимости многократного набора текста).