Привет Я создаю элементы управления из SQL с помощью этого кода:InvalidOpearationException: Существует уже открытая DataReader
string query = "SELECT * FROM [schema] WHERE [email protected]";
SqlCommand com = new SqlCommand(query, con);
com.Parameters.AddWithValue("@id", result);
con.Open();
SqlDataReader read= com.ExecuteReader();
while (read.Read())
{
createLabelCmd((int)read["x"], (int)read["y"]);
}
con.Close();
Вопрос заключается в том, что createLabelCmd
содержит SqlCommand
и нуждается в открытой SqlConnection
Внутри createLabelCmd
String ResultSitting
private void createLabelCmd(int x, int y)
{
for (int i = 0; i < 1; i++)
{
var newLabel = new Label();
newLabel.Location = new Point(x, y);
newLabel.Text = realpocsed.ToString();
string sitting = newLabel.Name;
string sittingSearch = (sitting).Substring(3, 1);
if (sittingSearch != null && kzajezdu == "kZajezdu")
{
string querySitting = "SELECT name, surname FROM klient WHERE sitting = @sitting AND [email protected] AND [email protected]";
SqlCommand cmdSitting = new SqlCommand(querySitting, spojeni);
cmdSitting.Parameters.AddWithValue("@sitting", sittingSearch);
cmdSitting.Parameters.AddWithValue("@event", idEvent);
cmdSitting.Parameters.AddWithValue("@year", klientClass.Year());
ResultSitting = cmdSitting.ExecuteScalar().ToString().Trim(); //This might be the issue
}
if (kzajezdu == "kZajezdu")
{
newLabel.MouseHover += delegate(object sender, EventArgs e)
{
ToolTip ToolTip1 = new ToolTip();
ToolTip1.ShowAlways = true;
if (sittingSearch != null)
{
ToolTip1.Show(ResultSitting, newLabel);
}
else { ToolTip1.Show("This sitting is Empty!", newLabel); }
};
}
panel1.Controls.Add(newLabel);
}
Получаю исключение: InvalidOpearationException: There is already an open DataReader associated with this Command which must be closed first.
Можете ли вы помочь мне решить эту проблему?
Редактировать как Сонер Gönül предложил:
try
{
string query = "SELECT * FROM [schema] WHERE [email protected]";
SqlCommand com = new SqlCommand(query, con);
com.Parameters.AddWithValue("@id", idSch);
con.Open();
SqlDataReader read= com.ExecuteReader();
while (precti.Read())
{
createLabelCmd((int)read["x"], (int)read["y"]);
}
con.Close();
}
@TimSchmelter Спасибо за этот вопрос. Надеюсь, что это не проблема с открытым DataReader. – Marek
Я удалил свой комментарий, так как заметил, что он действительно работает, чтобы выбрать несколько столбцов с помощью 'ExecuteScalar'. Кажется, что 'SqlCommand' выбирает просто первый столбец. Однако это не лучшая практика. –
На какой линии вы получаете сообщение об ошибке? – Rezoan