这是我引用的网址:http://support.microsoft.com/kb/317559
我研究他们的方法并应用了它们,一切都很好,直到我包含2_2,错误消息:数据读取器中没有当前查询。
我已经在2_1 if声明下关闭了我的drSelect1_1。我需要关闭它,否则我无法创建一个新的。所以问题是,如何再次打开drSelect1_1以便我可以用于我的2_2?我试图创建drSelect1_1a而不是使用回drSelect1_1,得到错误:在调用Read()之前无效尝试访问字段。 任何建议?代码如下:
cmdSelect.CommandText = "SELECT * FROM member WHERE username = @username";
connSelect.Open();
MySqlDataReader drSelect1_1 = cmdSelect.ExecuteReader();
if (drSelect1_1.Read())
{
//1_1
this.lbl1_1.Text = drSelect1_1["username"].ToString();
//2_1
if (drSelect1_1["direct1"].ToString() != "")
{
//this.ib2_1.Visible = true;
this.lbl2_1.Text = drSelect1_1["direct1"].ToString();
drSelect1_1.Close();
cmdSelect.CommandText = "SELECT * FROM member WHERE username = '" + this.lbl2_1.Text + "'";
MySqlDataReader drSelect2_1 = cmdSelect.ExecuteReader();
if (drSelect2_1.Read())
{
drSelect2_1.Close();
}
}
//2_2
if (drSelect1_1["direct2"].ToString() != "")
{
}
}
connSelect.Close();
答案 0 :(得分:1)
编辑#2
好吧,如果是这样的话。在关闭阅读器之前,将值分配给块开头的变量。它将为您免除这么多麻烦。 :)
if (drSelect1_1.Read())
{
string username = drSelect1_1["username"].ToString();
string direct1 = drSelect1_1["direct1"].ToString();
string direct2 = drSelect1_1["direct2"].ToString();
drSelect1_1.Close();
//1_1
this.lbl1_1.Text = username;
//2_1
if (direct1 != "")
{
//this.ib2_1.Visible = true;
this.lbl2_1.Text = direct1;
cmdSelect.CommandText = "SELECT * FROM member WHERE username = '" + this.lbl2_1.Text + "'";
MySqlDataReader drSelect2_1 = cmdSelect.ExecuteReader();
if (drSelect2_1.Read())
{
drSelect2_1.Close();
}
}
//2_2
if (direct2 != "")
{
}
}
您已关闭数据阅读器drSelect1_1.Close();
并尝试再次访问
if (drSelect1_1["direct2"].ToString() != "")
删除此行
drSelect1_1.Close();
或者只是在}
区块中的Read()
之前移动。
修改强>:
只需创建MySqlCommand
的另一个实例,就这样做:
MySqlCommand cmdSelect2 = new MySqlCommand("SELECT * FROM member WHERE username = '" + this.lbl2_1.Text + "'", connSelect);
MySqlDataReader drSelect2_1 = cmdSelect2.ExecuteReader();
所以你可以安全地删除上面提到的那一行。