1

我使用下面的代码从 C# 中的 mySql 获取数据。当我这样做时,我得到代码下面提到的错误。我发现了一些关于这个主题的问题,但他们使用了DataReader,而我没有。

MySqlConnection sq = new MySqlConnection("...");
sq.Open();
MySqlCommand sc = new MySqlCommand("select * from users", sq);
DataSet ds = new DataSet();
MySqlDataAdapter da = new MySqlDataAdapter(sc);
da.Fill(ds);
sq.Close();

我的错误:

已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭它。

4

4 回答 4

1

在您的连接字符串中添加“MultipleActiveResultSets=True;”

于 2013-07-23T09:00:51.110 回答
1

我不知道这是否能解决你的问题,但是......

using为您的连接、命令和数据适配器使用状态。这将处理所有实现IDisposable并关闭连接的对象:

using(var sq = new MySqlConnection("..."))
using(var sc = new MySqlCommand("select * from users", sq))
using(var da = new MySqlDataAdapter(sc))
{
    DataSet ds = new DataSet();
    da.Fill(ds); 
    // you don't need to open/close the connection with a datadapter
} // but even without a dataadapter the using would have been closed the connection here
于 2013-07-23T09:02:18.940 回答
0

new MySqlCommand("select * from users", sq)

如果 MySqlConnection 尚未打开,MySqlDataAdapter 的此实现将打开和关闭它。这在必须为两个或多个 MySqlDataAdapter 对象调用 DbDataAdapter.Fill 方法的应用程序中非常有用。如果 MySqlConnection 已经打开,则必须显式调用 MySqlConnection.Close 或 MySqlConnection.Dispose 来关闭它。

所以,不需要打开连接,MySqlDataAdapter需要时会打开它。

最好使用using 语句作为其他答案。

于 2013-07-23T09:15:44.533 回答
0

正如错误所说,您并没有关闭您打开的每个连接。

可能是因为你得到的例外。您可以使用 Tim 的建议:

using(var sq = new MySqlConnection("..."))
using(var sc = new MySqlCommand("select * from users", sq))
using(var da = new MySqlDataAdapter(sc))

或者您可以使用 try catch 语句:

try
{
// Your code here
}
catch
{
    // Whatever code you want here
}
finally
{
    da.Close();
    sc.Close();
    sq.Close();
}
于 2013-07-23T09:05:12.293 回答