连接必须有效并打开(再次)

发布于 2024-10-03 22:13:56 字数 733 浏览 0 评论 0原文

当我更改 sql 查询代码时,我遇到错误“连接必须有效并再次打开。任何人都可以帮忙吗??(编辑)在 form1 中我已连接到数据库,在 form2 中我正在尝试添加查询。

//IN Class1.cs
public void test(string query, string name)
{
    MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand(query, connection);
    cmd.CommandText = @query;
    cmd.Parameters.AddWithValue("Name", name);
    MySql.Data.MySqlClient.MySqlDataReader Reader = cmd.ExecuteReader();
    while (Reader.Read())
    {
        Console.WriteLine(Reader[0]);
    }
    cmd.ExecuteNonQuery();
}
//IN Form2.cs
private void button2_Click(object sender, EventArgs e)
{
    name = textBox1.Text;
    var obj = new Class1();
    obj.test(@"SELECT * FROM players WHERE name = ?Name;", name);
}

I'm having the error "Connection must be valid and open again, when I changed my sql query code. Can anyone help?? (edit) In form1 I have connected to database, in form2 I'm trying to add queries.

//IN Class1.cs
public void test(string query, string name)
{
    MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand(query, connection);
    cmd.CommandText = @query;
    cmd.Parameters.AddWithValue("Name", name);
    MySql.Data.MySqlClient.MySqlDataReader Reader = cmd.ExecuteReader();
    while (Reader.Read())
    {
        Console.WriteLine(Reader[0]);
    }
    cmd.ExecuteNonQuery();
}
//IN Form2.cs
private void button2_Click(object sender, EventArgs e)
{
    name = textBox1.Text;
    var obj = new Class1();
    obj.test(@"SELECT * FROM players WHERE name = ?Name;", name);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

别靠近我心 2024-10-10 22:13:56

看起来连接正在被处置(或者甚至可能根本没有打开!)

理想情况下,我会将其更改为使用工作单元方法,并将您的实例包装在使用块中以确保它们被正确处置:

using (var connection = new MySqlConnection("connection-string"))
{
  using (var command = new MySqlCommand(query, connection))
  {
    connection.Open();

    command.Parameters.AddWithValue("?name", name);

    using (var reader = command.ExecuteReader())
    {
      while (reader.Read())
      {
        Console.WriteLine(reader[0]);
      }
    }
  }
}

另外,在使用了 ExecuteReader() 之后调用 cmd.ExecuteNonQuery(); 的目的是什么?

Looks like the connection is being disposed of (or possible not even opened at all!)

Ideally I'd change that to use a unit-of-work approach, and also wrap your instances in using blocks to ensure they are correctly disposed of:

using (var connection = new MySqlConnection("connection-string"))
{
  using (var command = new MySqlCommand(query, connection))
  {
    connection.Open();

    command.Parameters.AddWithValue("?name", name);

    using (var reader = command.ExecuteReader())
    {
      while (reader.Read())
      {
        Console.WriteLine(reader[0]);
      }
    }
  }
}

Also, what's the purpose of calling cmd.ExecuteNonQuery(); after you've already used ExecuteReader()?

乞讨 2024-10-10 22:13:56

当我在一个类中打开连接并尝试在不同的类/表单中使用它时,我遇到了这个确切的问题。一次打开多个连接是完全可以的,因此为每个类创建一个新的 MySqlConnection 实例,并在该类中打开和关闭它。

I had this exact problem when I opened a connection in one class and tried to use it in a different class/form. It is totally okay to more than one connection open at a time, so make a new MySqlConnection instance for every class, and open and close it inside that class.

聚集的泪 2024-10-10 22:13:56

尝试:

cmd.Open();

...在 ExecuteNonQuery() 之前

:) 我希望这会有所帮助,如果您仍然遇到问题,请告知。

另外,暂时尝试删除 cmd.ExecuteNonQuery,因为我认为它可能连接两次,因此出现错误“连接必须有效且打开”。它不能是“打开”的,因为您已经使用 ExecuteReader() 连接。

Try:

cmd.Open();

... BEFORE ExecuteNonQuery()

:) I hope this helps, please advise if you're still having troubles.

Also, for the time being, try removing cmd.ExecuteNonQuery, as I think it may be connecting twice, hence the error "Connection must be valid and open". It must not be "open" because you're already connected using ExecuteReader().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文