c# - MySQL try-catch 无法正常工作

标签 c# mysql exception

我正在尝试从 MySQL 捕获错误 1045(访问被拒绝),但我遇到了一些奇怪的问题..我的代码有问题吗?

它没有处理异常,而是在 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;
}

最佳答案

假设你正在 VS 中调试它。即使您有异常处理程序,VS也会在异常发生时停止,因为您处于 Debug模式。如果您在工作室之外运行此代码,则异常将由该 block 处理。您还应该能够简单地按 F5(运行)来继续。

但在我看来,这只是一个余兴节目。您显示的代码非常糟糕。此代码片段意味着您正在打开一个连接,使用它来进行一个或多个数据库调用,然后在此过程中的某个地方您可以使用另一种方法来关闭它。

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

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

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

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

关于c# - MySQL try-catch 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16157287/

相关文章:

java - RabbitMQ 从 C# 解析 "client_properties" header

mysql - 数学与 SQL 查询之间

java - 在无法访问的 Java 线程中处理未捕获的异常

Laravel 5 错误处理

c# - Windows Phone 8 SDK 中的 "TargetInvocationException"

c# - CNG 从文件导入 ECC 公钥/私钥

c# - 无法在我的解决方案中添加来自新项目的新引用

c# - 在 WPF 中为 DataGridRow 创建 ControlTemplate

php - Chart.js - 使用 mysql 和 php 从数据库中获取数据

php - 简单的 php 表单将 "1"插入所有字段而不是 varchar