【发布时间】:2013-10-08 08:02:53
【问题描述】:
您好,我通过以下代码从 SQL 创建控件:
string query = "SELECT * FROM [schema] WHERE idSch=@id";
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 event=@event AND year=@year";
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.
你能帮我解决这个问题吗?
按照 Soner Gönül 的建议进行编辑:
try
{
string query = "SELECT * FROM [schema] WHERE idSch=@id";
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 的主要问题。
-
我已经删除了我的评论,因为我注意到使用
ExecuteScalar选择多个列确实有效。SqlCommand似乎只选择了第一列。但是,这根本不是最佳做法。 -
您在哪一行得到错误?
-
@Rezoan
createLabelCmd((int)read["x"], (int)read["y"]);
标签: c# .net sql sql-server winforms