0

我正在尝试error 1045 (access denied)从 MySQL 中获取信息,但我遇到了一些奇怪的问题。我的代码有问题吗?

它没有处理异常,而是在 VS 中抛出了一个异常?

private bool connOpen()
{
    bool kleir = false;
    try
    {
        conn.Open();
        kleir = true; // throws exception here
    }
    catch (MySqlException ex)
    {
        switch (ex.Number)
        {
            case 1045:
                MainWindow.connError = true;
                break;
        }
        kleir = false;
    }
    return kleir;
}
4

2 回答 2

1

假设您正在 VS 中调试它。即使您有异常处理程序,VS 也会停止异常处理,因为您处于调试模式。如果您在工作室之外运行它,那么异常将由块处理。您还应该能够简单地按 F5(运行)以继续。

但是,在我看来,这只是一个插曲。您显示的代码非常糟糕。这个片段暗示你正在打开一个连接,使用它来进行一个或多个数据库调用,然后在某个地方你有另一种方法来关闭它。

你永远不应该在远离你实际使用它们的地方初始化/管理连接。连接池能够正确处理大量的连接/断开连接。您应该将代码保留在一起的原因很简单,在连接上打开/关闭之间的事情越多,那么您的代码就越有可能无法正确处理这些对象。当它们没有被处理掉时,连接池将出现非常奇怪且难以调试的问题,并且内存使用量会大幅上升。

连接和命令数据库对象是非托管对象。它们实现 IDisposable 是因为它们控制非托管资源。这样做的正确方法的一个例子是:

using (SqlConnection conn = new SqlConnection(connstring)) {
  using (SqlCommand cmd = new SqlCommand(conn)) {
    // do atomic database stuff
  }
}

using 语句将自动关闭并处理这些对象。连接池(您甚至不必考虑)将确保如果您调用上述代码 1000 次,它仍然运行得非常快。

于 2013-04-22T22:36:53.293 回答
0

我怀疑当您尝试打开连接时会引发异常,但是菜单DEBUG.Exceptions.Common Language Runtime Exceptions中的 Dialog 在 column 下标记了复选框Thrown。这应该是您的代码在显示的行停止并且不进入 catch 块的原因

于 2013-04-22T22:18:45.367 回答