【问题标题】:Why does my C# application still retrieves data from MySql without using connection.Open()为什么我的 C# 应用程序仍然从 MySql 中检索数据而不使用 connection.Open()
【发布时间】:2020-05-17 11:45:17
【问题描述】:

我尝试使用我的 C# 应用程序从 MySql 上的表中检索数据。因此,我应用了通常的连接方法,以便将我的 c# 应用程序连接到我的 MySql 数据库,并调用适当的方法从表中检索数据,然后将其显示在我的应用程序上。但是,我注意到仅使用以下代码:

conString = "server=localhost;user id=" + user + ";database=db;password="+pass;
connection = new MySqlConnection(conString);
DataTable table = new DataTable();
MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM users", connection);
adapter.Fill(table);
dataGridView1.DataSource = table;

我可以从表格中检索数据并显示,而无需使用以下代码:

connection.Open();

如果我只需要以下代码来检索数据,那么使用connection.Open() 的目的是什么?我什么时候需要使用connection.Open()

只有当我从我的应用程序向 mysql 发送信息时才需要使用connection.Open(),但是当我想从 MySql 获取/检索信息时我不需要使用connection.Open(),这是正确的吗?

【问题讨论】:

  • 我没有使用过这个 MySql 库,但我确信当你调用 adapter.Fill(table)MySqlDataAdapter 正在为你打开连接
  • @Xerillio 谢谢。那么你什么时候知道什么时候使用connection.Open()?还是允许在您第一次使用前两行代码连接到数据库时调用它?
  • 如果发现连接已关闭,DataAdapter 派生类始终会自行打开连接。如果它打开,那么它在完成时也会关闭。所以如果你打算使用适配器,你真的不需要打开。这不适用于其他 ADO.NET 对象,例如 DbCommand 派生类

标签: c# mysql database


【解决方案1】:

由于调用adapter.Fill(table); 的目的是从数据库中检索数据,我非常希望Fill 方法打开连接(如果它还没有打开)。

如果您打算直接对connection 进行操作,而不是通过诸如MySqlDataAdapter 之类的辅助类,您只需要显式调用Open。当然,您可以随时打开它。

不过,我建议您将连接放在 using 语句中,以确保在您完成连接后将其关闭并丢弃:

using (var connection = new MySqlConnection(conString))
{
    DataTable table = new DataTable();
    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM users", connection);
    adapter.Fill(table);
    dataGridView1.DataSource = table; 
}
// Now you are sure the connection is closed and being properly garbage collected

【讨论】:

  • 保持连接数小时/数天是错误的。还是应该只在需要时打开连接然后关闭它?以及将连接打开数天/数小时的后果是什么
  • 在极端情况下,您也可以完全删除 MySqlConnection 对象。 DbDataAdapter 基类有一个直接接受连接字符串的构造函数。
  • 在不需要时关闭连接(如果可能,使用using(){})。关闭和重新打开它们不会花费太多,因为 MySql 的 Connector.NET 默认提供连接池。
  • 正如@O.Jones 建议的那样,您应该在不需要时关闭它们。我不能代表这个特定的库,但我已经看到了长时间运行的连接性能越来越差的例子——这可能是由于配置不正确造成的,但我仍然会说最好不要让它保持打开的时间超过需要。
  • 正是如此。每次需要时都与using 建立联系。它们很便宜。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多